fix issue that pixel_buffer generates wrong color in 16bits depth

This commit is contained in:
Jinhao 2017-07-01 12:21:19 +08:00
parent afd8225875
commit 3b737c01a2

View File

@ -328,10 +328,14 @@ namespace nana{ namespace paint
else if(16 == depth)
{
//The format of Xorg 16bits depth is 565
std::unique_ptr<unsigned short[]> table_holder(new unsigned short[256]);
unsigned short * const fast_table = table_holder.get();
std::unique_ptr<unsigned short[]> table_5_6bit_holder(new unsigned short[512]);
auto * const table_5bit = table_5_6bit_holder.get();
auto * const table_6bit = table_5_6bit_holder.get() + 256;
for(int i = 0; i < 256; ++i)
fast_table[i] = i * 31 / 255;
{
table_5bit[i] = i * 31 / 255;
table_6bit[i] = i * 63 / 255;
}
std::size_t length = width * height;
@ -342,7 +346,7 @@ namespace nana{ namespace paint
{
for(auto i = raw_pixel_buffer, end = raw_pixel_buffer + length; i != end; ++i)
{
*(pixbuf_16bits++) = (fast_table[i->element.red] << 11) | ( (i->element.green * 63 / 255) << 6) | fast_table[i->element.blue];
*(pixbuf_16bits++) = (table_5bit[i->element.red] << 11) | ( (table_6bit[i->element.green] << 5) | table_5bit[i->element.blue]);
}
}
else if(height)
@ -355,7 +359,7 @@ namespace nana{ namespace paint
{
for(auto i = sp, end = sp + width; i != end; ++i)
{
*(pixbuf_16bits++) = (fast_table[i->element.red] << 11) | ((i->element.green * 63 / 255) << 6) | fast_table[i->element.blue];
*(pixbuf_16bits++) = (table_5bit[i->element.red] << 11) | (table_6bit[i->element.green] << 5) | table_5bit[i->element.blue];
}
if(++top < height)
@ -511,10 +515,15 @@ namespace nana{ namespace paint
else if(16 == image->depth)
{
//The format of Xorg 16bits depth is 565
std::unique_ptr<unsigned[]> table_holder(new unsigned[32]);
unsigned * const fast_table = table_holder.get();
for(unsigned i = 0; i < 32; ++i)
fast_table[i] = (i * 255 / 31);
std::unique_ptr<unsigned[]> table_5bit_holder{new unsigned[32]};
auto * const table_5bit = table_5bit_holder.get();
for(std::size_t i = 0; i < 32; ++i)
table_5bit[i] = (i * 255 / 31);
std::unique_ptr<unsigned[]> table_6bit_holder{new unsigned[64]};
auto * const table_6bit = table_6bit_holder.get();
for(std::size_t i = 0; i < 64; ++i)
table_6bit[i] = (i* 255 / 63);
pixbuf += (r.x - want_r.x);
pixbuf += (r.y - want_r.y) * want_r.width;
@ -525,9 +534,9 @@ namespace nana{ namespace paint
for(int x = 0; x < image->width; ++x)
{
pixbuf[x].element.red = fast_table[(px_data[x] >> 11) & 0x1F];
pixbuf[x].element.green = (px_data[x] >> 5) & 0x3F;
pixbuf[x].element.blue = fast_table[px_data[x] & 0x1F];
pixbuf[x].element.red = table_5bit[(px_data[x] >> 11) & 0x1F];
pixbuf[x].element.green = table_6bit[(px_data[x] >> 5) & 0x3F];
pixbuf[x].element.blue = table_5bit[px_data[x] & 0x1F];
pixbuf[x].element.alpha_channel = 0;
}
img_data += image->bytes_per_line;