void compute_average_rgb(grs_bitmap *bm, fix *rgb) { ubyte *buf; int i, x, y, color; fix t_rgb[3] = { 0, 0, 0 }; rgb[0] = rgb[1] = rgb[2] = 0; if (!bm->bm_data) return; MALLOC(buf, ubyte, bm->bm_w*bm->bm_h); memset(buf,0,bm->bm_w*bm->bm_h); if (bm->bm_flags & BM_FLAG_RLE){ unsigned char * dbits; unsigned char * sbits; int data_offset; data_offset = 1; if (bm->bm_flags & BM_FLAG_RLE_BIG) data_offset = 2; sbits = &bm->bm_data[4 + (bm->bm_h * data_offset)]; dbits = buf; for (i=0; i < bm->bm_h; i++ ) { gr_rle_decode(sbits,dbits); if ( bm->bm_flags & BM_FLAG_RLE_BIG ) sbits += (int)INTEL_SHORT(*((short *)&(bm->bm_data[4+(i*data_offset)]))); else sbits += (int)bm->bm_data[4+i]; dbits += bm->bm_w; } } else { memcpy(buf, bm->bm_data, sizeof(unsigned char)*(bm->bm_w*bm->bm_h)); } i = 0; for (x = 0; x < bm->bm_h; x++) { for (y = 0; y < bm->bm_w; y++) { color = buf[i++]; t_rgb[0] = gr_palette[color].r; t_rgb[1] = gr_palette[color].g; t_rgb[2] = gr_palette[color].b; if (!(color == TRANSPARENCY_COLOR || (t_rgb[0] == t_rgb[1] && t_rgb[0] == t_rgb[2]))) { rgb[0] += t_rgb[0]; rgb[1] += t_rgb[1]; rgb[2] += t_rgb[2]; } } } d_free(buf); }
static void decode_row( grs_bitmap * bmp, int y ) { int i, offset=4+bmp->bm_h; for (i=0; i<y; i++ ) offset += bmp->bm_data[4+i]; gr_rle_decode( &bmp->bm_data[offset], scale_rle_data ); }
void decode_row( grs_bitmap * bmp, int y ) { int i, offset=4+bmp->bm_props.h; for (i=0; i<y; i++ ) offset += bmp->bm_texBuf[4+i]; gr_rle_decode( &bmp->bm_texBuf[offset], scale_rle_data ); }
// Find transparent area in bitmap void gr_bitblt_find_transparent_area(grs_bitmap *bm, int *minx, int *miny, int *maxx, int *maxy) { ubyte c; int i = 0, x = 0, y = 0, count = 0; static unsigned char buf[1024*1024]; if (!(bm->bm_flags&BM_FLAG_TRANSPARENT)) return; memset(buf,0,1024*1024); *minx = bm->bm_w - 1; *maxx = 0; *miny = bm->bm_h - 1; *maxy = 0; // decode the bitmap if (bm->bm_flags & BM_FLAG_RLE){ unsigned char * dbits; unsigned char * sbits; int i, data_offset; data_offset = 1; if (bm->bm_flags & BM_FLAG_RLE_BIG) data_offset = 2; sbits = &bm->bm_data[4 + (bm->bm_h * data_offset)]; dbits = buf; for (i=0; i < bm->bm_h; i++ ) { gr_rle_decode(sbits,dbits); if ( bm->bm_flags & BM_FLAG_RLE_BIG ) sbits += (int)INTEL_SHORT(*((short *)&(bm->bm_data[4+(i*data_offset)]))); else sbits += (int)bm->bm_data[4+i]; dbits += bm->bm_w; } } else { memcpy(&buf, bm->bm_data, sizeof(unsigned char)*(bm->bm_w*bm->bm_h)); } for (y = 0; y < bm->bm_h; y++) { for (x = 0; x < bm->bm_w; x++) { c = buf[i++]; if (c == TRANSPARENCY_COLOR) { // don't look for transparancy color here. count++; if (x < *minx) *minx = x; if (y < *miny) *miny = y; if (x > *maxx) *maxx = x; if (y > *maxy) *maxy = y; } } } Assert (count); }
void rle_expand_texture_sub (grsBitmap * bmP, grsBitmap * rle_temp_bitmap_1) { unsigned char * dbits; unsigned char * sbits; int i; #ifdef RLE_DECODE_ASM unsigned char * dbits1; #endif sbits = bmP->bm_texBuf + 4 + bmP->bm_props.h; dbits = rle_temp_bitmap_1->bm_texBuf; rle_temp_bitmap_1->bm_props.flags = bmP->bm_props.flags & (~BM_FLAG_RLE); for (i=0; i < bmP->bm_props.h; i++) { gr_rle_decode (sbits, dbits); sbits += (int) bmP->bm_texBuf [4+i]; dbits += bmP->bm_props.w; } }
void rle_expand_texture_sub(grs_bitmap * bmp, grs_bitmap * rle_temp_bitmap_1) { unsigned char * dbits; unsigned char * sbits; int i; unsigned char * dbits1; sbits = &bmp->bm_data[4 + 64]; dbits = rle_temp_bitmap_1->bm_data; rle_temp_bitmap_1->bm_flags = bmp->bm_flags & (~BM_FLAG_RLE); for (i = 0; i < 64; i++) { gr_rle_decode(sbits, dbits); sbits += (int)bmp->bm_data[4 + i]; dbits += 64; //Assert( dbits == dbits1 ); // Get John, bogus rle data! } }