int gr_bitmap_rle_compress(grs_bitmap * bmp) { int y, d1, d; int doffset; ubyte *rle_data; rle_data = (ubyte *)malloc((bmp->bm_w + 1)* bmp->bm_h); if (rle_data == NULL) return 0; doffset = 4 + bmp->bm_h; for (y = 0; y<bmp->bm_h; y++) { d1 = gr_rle_getsize(bmp->bm_w, &bmp->bm_data[bmp->bm_w*y]); if (((doffset + d1) > bmp->bm_w*bmp->bm_h) || (d1 > 255)) { free(rle_data); return 0; } d = gr_rle_encode(bmp->bm_w, &bmp->bm_data[bmp->bm_w*y], &rle_data[doffset]); //Assert( d==d1 ); doffset += d; rle_data[y + 4] = d; } //mprintf( 0, "Bitmap of size %dx%d, (%d bytes) went down to %d bytes\n", bmp->bm_w, bmp->bm_h, bmp->bm_h*bmp->bm_w, doffset ); memcpy(rle_data, &doffset, 4); memcpy(bmp->bm_data, rle_data, doffset); free(rle_data); bmp->bm_flags |= BM_FLAG_RLE; return 1; }
int gr_bitmap_rle_compress (grsBitmap * bmP) { int y, d1, d; int doffset; ubyte *rle_data; int large_rle = 0; // first must check to see if this is large bitmap. for (y=0; y<bmP->bm_props.h; y++) { d1= gr_rle_getsize (bmP->bm_props.w, &bmP->bm_texBuf[bmP->bm_props.w*y]); if (d1 > 255) { large_rle = 1; break; } } rle_data=D2_ALLOC (MAX_BMP_SIZE (bmP->bm_props.w, bmP->bm_props.h)); if (rle_data==NULL) return 0; if (!large_rle) doffset = 4 + bmP->bm_props.h; else doffset = 4 + (2 * bmP->bm_props.h); // each row of rle'd bitmap has short instead of byte offset now for (y=0; y<bmP->bm_props.h; y++) { d1= gr_rle_getsize (bmP->bm_props.w, &bmP->bm_texBuf[bmP->bm_props.w*y]); if (( (doffset+d1) > bmP->bm_props.w*bmP->bm_props.h) || (d1 > (large_rle?32767:255))) { D2_FREE (rle_data); return 0; } d = gr_rle_encode (bmP->bm_props.w, &bmP->bm_texBuf[bmP->bm_props.w*y], &rle_data[doffset]); Assert (d==d1); doffset += d; if (large_rle) * ((short *)& (rle_data[ (y*2)+4])) = (short)d; else rle_data[y+4] = d; } memcpy ( rle_data, &doffset, 4); memcpy ( bmP->bm_texBuf, rle_data, doffset); D2_FREE (rle_data); bmP->bm_props.flags |= BM_FLAG_RLE; if (large_rle) bmP->bm_props.flags |= BM_FLAG_RLE_BIG; return 1; }