improve xrdp_bitmap_load to support 4 and 24 bpp bitmaps

ulab-original
jsorg71 15 years ago
parent 5a08e51906
commit 347ab74a93

@ -341,8 +341,7 @@ xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette)
int color; int color;
int size; int size;
int palette1[256]; int palette1[256];
char type1[3]; char type1[4];
char* data;
struct xrdp_bmp_header header; struct xrdp_bmp_header header;
struct stream* s; struct stream* s;
@ -359,20 +358,25 @@ xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette)
/* read file type */ /* read file type */
if (g_file_read(fd, type1, 2) != 2) if (g_file_read(fd, type1, 2) != 2)
{ {
g_writeln("xrdp_bitmap_load: error bitmap file [%s] read error",
filename);
g_file_close(fd); g_file_close(fd);
return 1; return 1;
} }
if (type1[0] != 'B' || type1[1] != 'M') if ((type1[0] != 'B') || (type1[1] != 'M'))
{ {
g_writeln("xrdp_bitmap_load: error bitmap file [%s] not BMP file",
filename);
g_file_close(fd); g_file_close(fd);
return 1; return 1;
} }
/* read file size */ /* read file size */
size = 0; make_stream(s);
g_file_read(fd, (char*)&size, 4); init_stream(s, 8192);
g_file_read(fd, s->data, 4);
in_uint32_le(s, size);
/* read bmp header */ /* read bmp header */
g_file_seek(fd, 14); g_file_seek(fd, 14);
make_stream(s);
init_stream(s, 8192); init_stream(s, 8192);
g_file_read(fd, s->data, 40); /* size better be 40 */ g_file_read(fd, s->data, 40); /* size better be 40 */
in_uint32_le(s, header.size); in_uint32_le(s, header.size);
@ -386,8 +390,11 @@ xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette)
in_uint32_le(s, header.y_pels_per_meter); in_uint32_le(s, header.y_pels_per_meter);
in_uint32_le(s, header.clr_used); in_uint32_le(s, header.clr_used);
in_uint32_le(s, header.clr_important); in_uint32_le(s, header.clr_important);
if (header.bit_count != 8 && header.bit_count != 24) if ((header.bit_count != 4) && (header.bit_count != 8) &&
(header.bit_count != 24))
{ {
g_writeln("xrdp_bitmap_load: error bitmap file [%s] bad bpp %d",
filename, header.bit_count);
free_stream(s); free_stream(s);
g_file_close(fd); g_file_close(fd);
return 1; return 1;
@ -395,8 +402,51 @@ xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette)
if (header.bit_count == 24) /* 24 bit bitmap */ if (header.bit_count == 24) /* 24 bit bitmap */
{ {
g_file_seek(fd, 14 + header.size); g_file_seek(fd, 14 + header.size);
xrdp_bitmap_resize(self, header.image_width, header.image_height);
size = header.image_width * header.image_height * 3;
init_stream(s, size);
/* read data */
for (i = header.image_height - 1; i >= 0; i--)
{
size = header.image_width * 3;
k = g_file_read(fd, s->data + i * size, size);
if (k != size)
{
g_writeln("xrdp_bitmap_load: error bitmap file [%s] read",
filename);
}
}
for (i = 0; i < self->height; i++)
{
for (j = 0; j < self->width; j++)
{
in_uint8(s, k);
color = k;
in_uint8(s, k);
color |= k << 8;
in_uint8(s, k);
color |= k << 16;
if (self->bpp == 8)
{
color = xrdp_bitmap_get_index(self, palette, color);
}
else if (self->bpp == 15)
{
color = COLOR15((color & 0xff0000) >> 16,
(color & 0x00ff00) >> 8,
(color & 0x0000ff) >> 0);
}
else if (self->bpp == 16)
{
color = COLOR16((color & 0xff0000) >> 16,
(color & 0x00ff00) >> 8,
(color & 0x0000ff) >> 0);
}
xrdp_bitmap_set_pixel(self, j, i, color);
}
}
} }
if (header.bit_count == 8) /* 8 bit bitmap */ else if (header.bit_count == 8) /* 8 bit bitmap */
{ {
/* read palette */ /* read palette */
g_file_seek(fd, 14 + header.size); g_file_seek(fd, 14 + header.size);
@ -406,18 +456,25 @@ xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette)
{ {
in_uint32_le(s, palette1[i]); in_uint32_le(s, palette1[i]);
} }
/* read data */
xrdp_bitmap_resize(self, header.image_width, header.image_height); xrdp_bitmap_resize(self, header.image_width, header.image_height);
data = (char*)g_malloc(header.image_width * header.image_height, 1); size = header.image_width * header.image_height;
init_stream(s, size);
/* read data */
for (i = header.image_height - 1; i >= 0; i--) for (i = header.image_height - 1; i >= 0; i--)
{ {
g_file_read(fd, data + i * header.image_width, header.image_width); size = header.image_width;
k = g_file_read(fd, s->data + i * size, size);
if (k != size)
{
g_writeln("xrdp_bitmap_load: error bitmap file [%s] read",
filename);
}
} }
for (i = 0; i < self->height; i++) for (i = 0; i < self->height; i++)
{ {
for (j = 0; j < self->width; j++) for (j = 0; j < self->width; j++)
{ {
k = (unsigned char)data[i * header.image_width + j]; in_uint8(s, k);
color = palette1[k]; color = palette1[k];
if (self->bpp == 8) if (self->bpp == 8)
{ {
@ -435,18 +492,66 @@ xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette)
(color & 0x00ff00) >> 8, (color & 0x00ff00) >> 8,
(color & 0x0000ff) >> 0); (color & 0x0000ff) >> 0);
} }
else if (self->bpp == 24) xrdp_bitmap_set_pixel(self, j, i, color);
}
}
}
else if (header.bit_count == 4) /* 4 bit bitmap */
{
/* read palette */
g_file_seek(fd, 14 + header.size);
init_stream(s, 8192);
g_file_read(fd, s->data, 16 * sizeof(int));
for (i = 0; i < 16; i++)
{
in_uint32_le(s, palette1[i]);
}
xrdp_bitmap_resize(self, header.image_width, header.image_height);
size = (header.image_width * header.image_height) / 2;
init_stream(s, size);
/* read data */
for (i = header.image_height - 1; i >= 0; i--)
{
size = header.image_width / 2;
k = g_file_read(fd, s->data + i * size, size);
if (k != size)
{
g_writeln("xrdp_bitmap_load: error bitmap file [%s] read",
filename);
}
}
for (i = 0; i < self->height; i++)
{
for (j = 0; j < self->width; j++)
{
if ((j & 1) == 0)
{
in_uint8(s, k);
}
color = palette1[(k & 0xf0) >> 4];
k <<= 4;
if (self->bpp == 8)
{
color = xrdp_bitmap_get_index(self, palette, color);
}
else if (self->bpp == 15)
{ {
//color = COLOR24((color & 0xff0000) >> 16, color = COLOR15((color & 0xff0000) >> 16,
// (color & 0x00ff00) >> 8, (color & 0x00ff00) >> 8,
// (color & 0x0000ff) >> 0); (color & 0x0000ff) >> 0);
}
else if (self->bpp == 16)
{
color = COLOR16((color & 0xff0000) >> 16,
(color & 0x00ff00) >> 8,
(color & 0x0000ff) >> 0);
} }
xrdp_bitmap_set_pixel(self, j, i, color); xrdp_bitmap_set_pixel(self, j, i, color);
} }
} }
g_free(data);
} }
g_file_close(fd); g_file_close(fd);
free_stream(s);
} }
else else
{ {
@ -454,7 +559,6 @@ xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette)
filename); filename);
return 1; return 1;
} }
free_stream(s);
return 0; return 0;
} }

Loading…
Cancel
Save