fix issue that pixel_buffer generates wrong color in 16bits depth
This commit is contained in:
parent
afd8225875
commit
3b737c01a2
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user