improve xrdp_bitmap_load to support 4 and 24 bpp bitmaps
This commit is contained in:
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)
|
||||||
{
|
{
|
||||||
//color = COLOR24((color & 0xff0000) >> 16,
|
in_uint8(s, k);
|
||||||
// (color & 0x00ff00) >> 8,
|
}
|
||||||
// (color & 0x0000ff) >> 0);
|
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 = 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);
|
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…
Reference in New Issue
Block a user