Esempio n. 1
0
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;
}
Esempio n. 2
0
File: rle.c Progetto: paud/d2x-xl
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;
}