MCPcopy Create free account
hub / github.com/DescentDevelopers/Descent3 / bm_GenerateMipMaps

Function bm_GenerateMipMaps

bitmap/bitmain.cpp:1202–1283  ·  view source on GitHub ↗

Given a source bitmap, generates mipmaps for it

Source from the content-addressed store, hash-verified

1200}
1201// Given a source bitmap, generates mipmaps for it
1202void 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;

Callers 3

bm_page_in_fileFunction · 0.85
bm_AllocLoadFileBitmapFunction · 0.85
bm_AllocLoadBitmapFunction · 0.85

Calls 4

bm_wFunction · 0.85
bm_hFunction · 0.85
bm_miplevelsFunction · 0.85
bm_dataFunction · 0.85

Tested by

no test coverage detected