Given a source bitmap, generates mipmaps for it
| 1200 | } |
| 1201 | // Given a source bitmap, generates mipmaps for it |
| 1202 | void bm_GenerateMipMaps(int handle) { |
| 1203 | int width = bm_w(handle, 0); |
| 1204 | int height = bm_h(handle, 0); |
| 1205 | int jump = 2; // how many pixels to jump in x and y on source |
| 1206 | |
| 1207 | // mprintf(0,"We got a mipper! %d \n",handle); |
| 1208 | |
| 1209 | ASSERT(GameBitmaps[handle].used); |
| 1210 | GameBitmaps[handle].flags |= BF_MIPMAPPED; |
| 1211 | |
| 1212 | int levels = bm_miplevels(handle); |
| 1213 | |
| 1214 | uint16_t *destdata; |
| 1215 | for (int miplevel = 1; miplevel < levels; miplevel++) { |
| 1216 | width /= 2; |
| 1217 | height /= 2; |
| 1218 | |
| 1219 | for (int i = 0; i < height; i++) { |
| 1220 | int adjheight = (i * jump) * bm_w(handle, miplevel - 1); // find our y offset |
| 1221 | |
| 1222 | for (int t = 0; t < width; t++) { |
| 1223 | int adjwidth = (t * jump); // find our x offset |
| 1224 | uint16_t *srcptr = bm_data(handle, miplevel - 1); |
| 1225 | srcptr += (adjheight + adjwidth); |
| 1226 | |
| 1227 | int rsum, gsum, bsum, asum; |
| 1228 | rsum = gsum = bsum = asum = 0; |
| 1229 | uint16_t destpix = 0; |
| 1230 | if (GameBitmaps[handle].format == BITMAP_FORMAT_1555) { |
| 1231 | for (int y = 0; y < 2; y++) |
| 1232 | for (int x = 0; x < 2; x++) { |
| 1233 | uint16_t pix = srcptr[y * bm_w(handle, miplevel - 1) + x]; |
| 1234 | int r = (pix >> 10) & 0x1f; |
| 1235 | int g = (pix >> 5) & 0x1f; |
| 1236 | int b = (pix & 0x1f); |
| 1237 | |
| 1238 | if (!(pix & OPAQUE_FLAG)) |
| 1239 | asum++; |
| 1240 | else { |
| 1241 | rsum += r; |
| 1242 | gsum += g; |
| 1243 | bsum += b; |
| 1244 | } |
| 1245 | } |
| 1246 | // Average our source pixels |
| 1247 | rsum /= 4; |
| 1248 | gsum /= 4; |
| 1249 | bsum /= 4; |
| 1250 | destpix = OPAQUE_FLAG | (rsum << 10) | (gsum << 5) | bsum; |
| 1251 | |
| 1252 | if (asum > 2) |
| 1253 | destpix = NEW_TRANSPARENT_COLOR; |
| 1254 | } else if (GameBitmaps[handle].format == BITMAP_FORMAT_4444) { |
| 1255 | for (int y = 0; y < 2; y++) |
| 1256 | for (int x = 0; x < 2; x++) { |
| 1257 | uint16_t pix = srcptr[y * bm_w(handle, miplevel - 1) + x]; |
| 1258 | int a = (pix >> 12) & 0x0f; |
| 1259 | int r = (pix >> 8) & 0x0f; |
no test coverage detected