2 * DIB driver primitives.
4 * Copyright 2011 Huw Davies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "gdi_private.h"
26 #include "wine/debug.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(dib);
30 static inline DWORD *get_pixel_ptr_32(const dib_info *dib, int x, int y)
32 return (DWORD *)((BYTE*)dib->bits + y * dib->stride + x * 4);
35 static inline DWORD *get_pixel_ptr_24_dword(const dib_info *dib, int x, int y)
37 return (DWORD *)((BYTE*)dib->bits + y * dib->stride) + x * 3 / 4;
40 static inline BYTE *get_pixel_ptr_24(const dib_info *dib, int x, int y)
42 return (BYTE*)dib->bits + y * dib->stride + x * 3;
45 static inline WORD *get_pixel_ptr_16(const dib_info *dib, int x, int y)
47 return (WORD *)((BYTE*)dib->bits + y * dib->stride + x * 2);
50 static inline BYTE *get_pixel_ptr_8(const dib_info *dib, int x, int y)
52 return (BYTE*)dib->bits + y * dib->stride + x;
55 static inline BYTE *get_pixel_ptr_4(const dib_info *dib, int x, int y)
57 return (BYTE*)dib->bits + y * dib->stride + x / 2;
60 static inline void do_rop_32(DWORD *ptr, DWORD and, DWORD xor)
62 *ptr = (*ptr & and) ^ xor;
65 static inline void do_rop_16(WORD *ptr, WORD and, WORD xor)
67 *ptr = (*ptr & and) ^ xor;
70 static inline void do_rop_8(BYTE *ptr, BYTE and, BYTE xor)
72 *ptr = (*ptr & and) ^ xor;
75 static void solid_rects_32(const dib_info *dib, int num, const RECT *rc, DWORD and, DWORD xor)
80 for(i = 0; i < num; i++, rc++)
82 start = get_pixel_ptr_32(dib, rc->left, rc->top);
83 for(y = rc->top; y < rc->bottom; y++, start += dib->stride / 4)
84 for(x = rc->left, ptr = start; x < rc->right; x++)
85 do_rop_32(ptr++, and, xor);
89 static void solid_rects_24(const dib_info *dib, int num, const RECT *rc, DWORD and, DWORD xor)
92 BYTE *byte_ptr, *byte_start;
94 DWORD and_masks[3], xor_masks[3];
96 and_masks[0] = ( and & 0x00ffffff) | ((and << 24) & 0xff000000);
97 and_masks[1] = ((and >> 8) & 0x0000ffff) | ((and << 16) & 0xffff0000);
98 and_masks[2] = ((and >> 16) & 0x000000ff) | ((and << 8) & 0xffffff00);
99 xor_masks[0] = ( xor & 0x00ffffff) | ((xor << 24) & 0xff000000);
100 xor_masks[1] = ((xor >> 8) & 0x0000ffff) | ((xor << 16) & 0xffff0000);
101 xor_masks[2] = ((xor >> 16) & 0x000000ff) | ((xor << 8) & 0xffffff00);
103 for(i = 0; i < num; i++, rc++)
105 if(rc->left >= rc->right) continue;
107 if((rc->left & ~3) == (rc->right & ~3)) /* Special case for lines that start and end in the same DWORD triplet */
109 byte_start = get_pixel_ptr_24(dib, rc->left, rc->top);
110 for(y = rc->top; y < rc->bottom; y++, byte_start += dib->stride)
112 for(x = rc->left, byte_ptr = byte_start; x < rc->right; x++)
114 do_rop_8(byte_ptr++, and_masks[0] & 0xff, xor_masks[0] & 0xff);
115 do_rop_8(byte_ptr++, and_masks[1] & 0xff, xor_masks[1] & 0xff);
116 do_rop_8(byte_ptr++, and_masks[2] & 0xff, xor_masks[2] & 0xff);
122 start = get_pixel_ptr_24_dword(dib, rc->left, rc->top);
123 for(y = rc->top; y < rc->bottom; y++, start += dib->stride / 4)
130 do_rop_32(ptr++, and_masks[0] | 0x00ffffff, xor_masks[0] & 0xff000000);
131 do_rop_32(ptr++, and_masks[1], xor_masks[1]);
132 do_rop_32(ptr++, and_masks[2], xor_masks[2]);
135 do_rop_32(ptr++, and_masks[1] | 0x0000ffff, xor_masks[1] & 0xffff0000);
136 do_rop_32(ptr++, and_masks[2], xor_masks[2]);
139 do_rop_32(ptr++, and_masks[2] | 0x000000ff, xor_masks[2] & 0xffffff00);
143 for(x = (rc->left + 3) & ~3; x < (rc->right & ~3); x += 4)
145 do_rop_32(ptr++, and_masks[0], xor_masks[0]);
146 do_rop_32(ptr++, and_masks[1], xor_masks[1]);
147 do_rop_32(ptr++, and_masks[2], xor_masks[2]);
150 switch(rc->right & 3)
153 do_rop_32(ptr, and_masks[0] | 0xff000000, xor_masks[0] & 0x00ffffff);
156 do_rop_32(ptr++, and_masks[0], xor_masks[0]);
157 do_rop_32(ptr, and_masks[1] | 0xffff0000, xor_masks[1] & 0x0000ffff);
160 do_rop_32(ptr++, and_masks[0], xor_masks[0]);
161 do_rop_32(ptr++, and_masks[1], xor_masks[1]);
162 do_rop_32(ptr, and_masks[2] | 0xffffff00, xor_masks[2] & 0x000000ff);
170 static void solid_rects_16(const dib_info *dib, int num, const RECT *rc, DWORD and, DWORD xor)
175 for(i = 0; i < num; i++, rc++)
177 start = get_pixel_ptr_16(dib, rc->left, rc->top);
178 for(y = rc->top; y < rc->bottom; y++, start += dib->stride / 2)
179 for(x = rc->left, ptr = start; x < rc->right; x++)
180 do_rop_16(ptr++, and, xor);
184 static void solid_rects_8(const dib_info *dib, int num, const RECT *rc, DWORD and, DWORD xor)
189 for(i = 0; i < num; i++, rc++)
191 start = get_pixel_ptr_8(dib, rc->left, rc->top);
192 for(y = rc->top; y < rc->bottom; y++, start += dib->stride)
193 for(x = rc->left, ptr = start; x < rc->right; x++)
194 do_rop_8(ptr++, and, xor);
198 static void solid_rects_4(const dib_info *dib, int num, const RECT *rc, DWORD and, DWORD xor)
202 BYTE byte_and = (and & 0xf) | ((and << 4) & 0xf0);
203 BYTE byte_xor = (xor & 0xf) | ((xor << 4) & 0xf0);
205 for(i = 0; i < num; i++, rc++)
207 if(rc->left >= rc->right) continue;
208 start = get_pixel_ptr_4(dib, rc->left, rc->top);
209 for(y = rc->top; y < rc->bottom; y++, start += dib->stride)
212 if(rc->left & 1) /* upper nibble untouched */
213 do_rop_8(ptr++, byte_and | 0xf0, byte_xor & 0x0f);
215 for(x = (rc->left + 1) & ~1; x < (rc->right & ~1); x += 2)
216 do_rop_8(ptr++, byte_and, byte_xor);
218 if(rc->right & 1) /* lower nibble untouched */
219 do_rop_8(ptr, byte_and | 0x0f, byte_xor & 0xf0);
224 static void solid_rects_null(const dib_info *dib, int num, const RECT *rc, DWORD and, DWORD xor)
229 static inline INT calc_offset(INT edge, INT size, INT origin)
233 if(edge - origin >= 0)
234 offset = (edge - origin) % size;
237 offset = (origin - edge) % size;
238 if(offset) offset = size - offset;
243 static inline POINT calc_brush_offset(const RECT *rc, const dib_info *brush, const POINT *origin)
247 offset.x = calc_offset(rc->left, brush->width, origin->x);
248 offset.y = calc_offset(rc->top, brush->height, origin->y);
253 static void pattern_rects_32(const dib_info *dib, int num, const RECT *rc, const POINT *origin,
254 const dib_info *brush, void *and_bits, void *xor_bits)
256 DWORD *ptr, *start, *start_and, *and_ptr, *start_xor, *xor_ptr;
260 for(i = 0; i < num; i++, rc++)
262 offset = calc_brush_offset(rc, brush, origin);
264 start = get_pixel_ptr_32(dib, rc->left, rc->top);
265 start_and = (DWORD*)and_bits + offset.y * brush->stride / 4;
266 start_xor = (DWORD*)xor_bits + offset.y * brush->stride / 4;
268 for(y = rc->top; y < rc->bottom; y++, start += dib->stride / 4)
270 and_ptr = start_and + offset.x;
271 xor_ptr = start_xor + offset.x;
273 for(x = rc->left, ptr = start; x < rc->right; x++)
275 do_rop_32(ptr++, *and_ptr++, *xor_ptr++);
276 if(and_ptr == start_and + brush->width)
284 if(offset.y == brush->height)
286 start_and = and_bits;
287 start_xor = xor_bits;
292 start_and += brush->stride / 4;
293 start_xor += brush->stride / 4;
299 static void pattern_rects_24(const dib_info *dib, int num, const RECT *rc, const POINT *origin,
300 const dib_info *brush, void *and_bits, void *xor_bits)
302 BYTE *ptr, *start, *start_and, *and_ptr, *start_xor, *xor_ptr;
306 for(i = 0; i < num; i++, rc++)
308 offset = calc_brush_offset(rc, brush, origin);
310 start = get_pixel_ptr_24(dib, rc->left, rc->top);
311 start_and = (BYTE*)and_bits + offset.y * brush->stride;
312 start_xor = (BYTE*)xor_bits + offset.y * brush->stride;
314 for(y = rc->top; y < rc->bottom; y++, start += dib->stride)
316 and_ptr = start_and + offset.x * 3;
317 xor_ptr = start_xor + offset.x * 3;
319 for(x = rc->left, ptr = start; x < rc->right; x++)
321 do_rop_8(ptr++, *and_ptr++, *xor_ptr++);
322 do_rop_8(ptr++, *and_ptr++, *xor_ptr++);
323 do_rop_8(ptr++, *and_ptr++, *xor_ptr++);
324 if(and_ptr == start_and + brush->width * 3)
332 if(offset.y == brush->height)
334 start_and = and_bits;
335 start_xor = xor_bits;
340 start_and += brush->stride;
341 start_xor += brush->stride;
347 static void pattern_rects_16(const dib_info *dib, int num, const RECT *rc, const POINT *origin,
348 const dib_info *brush, void *and_bits, void *xor_bits)
350 WORD *ptr, *start, *start_and, *and_ptr, *start_xor, *xor_ptr;
354 for(i = 0; i < num; i++, rc++)
356 offset = calc_brush_offset(rc, brush, origin);
358 start = get_pixel_ptr_16(dib, rc->left, rc->top);
359 start_and = (WORD*)and_bits + offset.y * brush->stride / 2;
360 start_xor = (WORD*)xor_bits + offset.y * brush->stride / 2;
362 for(y = rc->top; y < rc->bottom; y++, start += dib->stride / 2)
364 and_ptr = start_and + offset.x;
365 xor_ptr = start_xor + offset.x;
367 for(x = rc->left, ptr = start; x < rc->right; x++)
369 do_rop_16(ptr++, *and_ptr++, *xor_ptr++);
370 if(and_ptr == start_and + brush->width)
378 if(offset.y == brush->height)
380 start_and = and_bits;
381 start_xor = xor_bits;
386 start_and += brush->stride / 2;
387 start_xor += brush->stride / 2;
393 static void pattern_rects_8(const dib_info *dib, int num, const RECT *rc, const POINT *origin,
394 const dib_info *brush, void *and_bits, void *xor_bits)
396 BYTE *ptr, *start, *start_and, *and_ptr, *start_xor, *xor_ptr;
400 for(i = 0; i < num; i++, rc++)
402 offset = calc_brush_offset(rc, brush, origin);
404 start = get_pixel_ptr_8(dib, rc->left, rc->top);
405 start_and = (BYTE*)and_bits + offset.y * brush->stride;
406 start_xor = (BYTE*)xor_bits + offset.y * brush->stride;
408 for(y = rc->top; y < rc->bottom; y++, start += dib->stride)
410 and_ptr = start_and + offset.x;
411 xor_ptr = start_xor + offset.x;
413 for(x = rc->left, ptr = start; x < rc->right; x++)
415 do_rop_8(ptr++, *and_ptr++, *xor_ptr++);
416 if(and_ptr == start_and + brush->width)
424 if(offset.y == brush->height)
426 start_and = and_bits;
427 start_xor = xor_bits;
432 start_and += brush->stride;
433 start_xor += brush->stride;
439 static void pattern_rects_4(const dib_info *dib, int num, const RECT *rc, const POINT *origin,
440 const dib_info *brush, void *and_bits, void *xor_bits)
442 BYTE *ptr, *start, *start_and, *and_ptr, *start_xor, *xor_ptr;
446 for(i = 0; i < num; i++, rc++)
448 offset = calc_brush_offset(rc, brush, origin);
450 start = get_pixel_ptr_4(dib, rc->left, rc->top);
451 start_and = (BYTE*)and_bits + offset.y * brush->stride;
452 start_xor = (BYTE*)xor_bits + offset.y * brush->stride;
454 for(y = rc->top; y < rc->bottom; y++, start += dib->stride)
456 INT brush_x = offset.x;
457 BYTE byte_and, byte_xor;
459 and_ptr = start_and + brush_x / 2;
460 xor_ptr = start_xor + brush_x / 2;
462 for(x = rc->left, ptr = start; x < rc->right; x++)
464 /* FIXME: Two pixels at a time */
465 if(x & 1) /* lower dst nibble */
467 if(brush_x & 1) /* lower pat nibble */
469 byte_and = *and_ptr++ | 0xf0;
470 byte_xor = *xor_ptr++ & 0x0f;
472 else /* upper pat nibble */
474 byte_and = (*and_ptr >> 4) | 0xf0;
475 byte_xor = (*xor_ptr >> 4) & 0x0f;
478 else /* upper dst nibble */
480 if(brush_x & 1) /* lower pat nibble */
482 byte_and = (*and_ptr++ << 4) | 0x0f;
483 byte_xor = (*xor_ptr++ << 4) & 0xf0;
485 else /* upper pat nibble */
487 byte_and = *and_ptr | 0x0f;
488 byte_xor = *xor_ptr & 0xf0;
491 do_rop_8(ptr, byte_and, byte_xor);
495 if(++brush_x == brush->width)
504 if(offset.y == brush->height)
506 start_and = and_bits;
507 start_xor = xor_bits;
512 start_and += brush->stride;
513 start_xor += brush->stride;
519 static void pattern_rects_null(const dib_info *dib, int num, const RECT *rc, const POINT *origin,
520 const dib_info *brush, void *and_bits, void *xor_bits)
525 static DWORD colorref_to_pixel_888(const dib_info *dib, COLORREF color)
527 return ( ((color >> 16) & 0xff) | (color & 0xff00) | ((color << 16) & 0xff0000) );
530 static inline DWORD put_field(DWORD field, int shift, int len)
532 shift = shift - (8 - len);
534 field &= (((1 << len) - 1) << (8 - len));
542 static DWORD colorref_to_pixel_masks(const dib_info *dib, COLORREF colour)
546 r = GetRValue(colour);
547 g = GetGValue(colour);
548 b = GetBValue(colour);
550 return put_field(r, dib->red_shift, dib->red_len) |
551 put_field(g, dib->green_shift, dib->green_len) |
552 put_field(b, dib->blue_shift, dib->blue_len);
555 static DWORD colorref_to_pixel_555(const dib_info *dib, COLORREF color)
557 return ( ((color >> 19) & 0x1f) | ((color >> 6) & 0x03e0) | ((color << 7) & 0x7c00) );
560 static DWORD colorref_to_pixel_colortable(const dib_info *dib, COLORREF color)
562 int i, best_index = 0;
564 DWORD diff, best_diff = 0xffffffff;
566 rgb.rgbRed = GetRValue(color);
567 rgb.rgbGreen = GetGValue(color);
568 rgb.rgbBlue = GetBValue(color);
570 for(i = 0; i < dib->color_table_size; i++)
572 RGBQUAD *cur = dib->color_table + i;
573 diff = (rgb.rgbRed - cur->rgbRed) * (rgb.rgbRed - cur->rgbRed)
574 + (rgb.rgbGreen - cur->rgbGreen) * (rgb.rgbGreen - cur->rgbGreen)
575 + (rgb.rgbBlue - cur->rgbBlue) * (rgb.rgbBlue - cur->rgbBlue);
592 static DWORD colorref_to_pixel_null(const dib_info *dib, COLORREF color)
597 static BOOL convert_to_8888(dib_info *dst, const dib_info *src, const RECT *src_rect)
599 DWORD *dst_start = dst->bits, *dst_pixel, src_val;
602 switch(src->bit_count)
606 DWORD *src_start = get_pixel_ptr_32(src, src_rect->left, src_rect->top);
607 if(src->funcs == &funcs_8888)
609 if(src->stride > 0 && dst->stride > 0 && src_rect->left == 0 && src_rect->right == src->width)
610 memcpy(dst->bits, src_start, (src_rect->bottom - src_rect->top) * src->stride);
613 for(y = src_rect->top; y < src_rect->bottom; y++)
615 memcpy(dst_start, src_start, (src_rect->right - src_rect->left) * 4);
616 dst_start += dst->stride / 4;
617 src_start += src->stride / 4;
623 FIXME("Unsupported conversion: 32 -> 8888\n");
631 BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
633 for(y = src_rect->top; y < src_rect->bottom; y++)
635 dst_pixel = dst_start;
636 src_pixel = src_start;
637 for(x = src_rect->left; x < src_rect->right; x++)
640 rgb.rgbBlue = *src_pixel++;
641 rgb.rgbGreen = *src_pixel++;
642 rgb.rgbRed = *src_pixel++;
644 *dst_pixel++ = ((rgb.rgbRed << 16) & 0xff0000) | ((rgb.rgbGreen << 8) & 0x00ff00) | (rgb.rgbBlue & 0x0000ff);
646 dst_start += dst->stride / 4;
647 src_start += src->stride;
654 WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
655 if(src->funcs == &funcs_555)
657 for(y = src_rect->top; y < src_rect->bottom; y++)
659 dst_pixel = dst_start;
660 src_pixel = src_start;
661 for(x = src_rect->left; x < src_rect->right; x++)
663 src_val = *src_pixel++;
664 *dst_pixel++ = ((src_val << 9) & 0xf80000) | ((src_val << 4) & 0x070000) |
665 ((src_val << 6) & 0x00f800) | ((src_val << 1) & 0x000700) |
666 ((src_val << 3) & 0x0000f8) | ((src_val >> 2) & 0x000007);
668 dst_start += dst->stride / 4;
669 src_start += src->stride / 2;
674 FIXME("Unsupported conversion: 16 -> 8888\n");
682 BYTE *src_start = get_pixel_ptr_8(src, src_rect->left, src_rect->top), *src_pixel;
683 for(y = src_rect->top; y < src_rect->bottom; y++)
685 dst_pixel = dst_start;
686 src_pixel = src_start;
687 for(x = src_rect->left; x < src_rect->right; x++)
690 src_val = *src_pixel++;
691 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
692 rgb = src->color_table[src_val];
693 *dst_pixel++ = rgb.rgbRed << 16 | rgb.rgbGreen << 8 | rgb.rgbBlue;
695 dst_start += dst->stride / 4;
696 src_start += src->stride;
703 BYTE *src_start = get_pixel_ptr_4(src, src_rect->left, src_rect->top), *src_pixel;
704 for(y = src_rect->top; y < src_rect->bottom; y++)
706 dst_pixel = dst_start;
707 src_pixel = src_start;
708 for(x = src_rect->left; x < src_rect->right; x++)
712 src_val = *src_pixel++ & 0xf;
714 src_val = (*src_pixel >> 4) & 0xf;
715 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
716 rgb = src->color_table[src_val];
717 *dst_pixel++ = rgb.rgbRed << 16 | rgb.rgbGreen << 8 | rgb.rgbBlue;
719 dst_start += dst->stride / 4;
720 src_start += src->stride;
726 FIXME("Unsupported conversion: %d -> 8888\n", src->bit_count);
733 static BOOL convert_to_32(dib_info *dst, const dib_info *src, const RECT *src_rect)
735 DWORD *dst_start = dst->bits, *dst_pixel, src_val;
738 switch(src->bit_count)
742 DWORD *src_start = get_pixel_ptr_32(src, src_rect->left, src_rect->top), *src_pixel;
744 if(src->funcs == &funcs_8888)
746 for(y = src_rect->top; y < src_rect->bottom; y++)
748 dst_pixel = dst_start;
749 src_pixel = src_start;
750 for(x = src_rect->left; x < src_rect->right; x++)
752 src_val = *src_pixel++;
753 *dst_pixel++ = put_field((src_val >> 16) & 0xff, dst->red_shift, dst->red_len) |
754 put_field((src_val >> 8) & 0xff, dst->green_shift, dst->green_len) |
755 put_field( src_val & 0xff, dst->blue_shift, dst->blue_len);
757 dst_start += dst->stride / 4;
758 src_start += src->stride / 4;
763 FIXME("Unsupported conversion: 32 -> 32\n");
771 BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
773 for(y = src_rect->top; y < src_rect->bottom; y++)
775 dst_pixel = dst_start;
776 src_pixel = src_start;
777 for(x = src_rect->left; x < src_rect->right; x++)
780 rgb.rgbBlue = *src_pixel++;
781 rgb.rgbGreen = *src_pixel++;
782 rgb.rgbRed = *src_pixel++;
784 *dst_pixel++ = put_field(rgb.rgbRed, dst->red_shift, dst->red_len) |
785 put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
786 put_field(rgb.rgbBlue, dst->blue_shift, dst->blue_len);
788 dst_start += dst->stride / 4;
789 src_start += src->stride;
796 WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
797 if(src->funcs == &funcs_555)
799 for(y = src_rect->top; y < src_rect->bottom; y++)
801 dst_pixel = dst_start;
802 src_pixel = src_start;
803 for(x = src_rect->left; x < src_rect->right; x++)
805 src_val = *src_pixel++;
806 *dst_pixel++ = put_field(((src_val >> 7) & 0xf8) | ((src_val >> 12) & 0x07), dst->red_shift, dst->red_len) |
807 put_field(((src_val >> 2) & 0xf8) | ((src_val >> 7) & 0x07), dst->green_shift, dst->green_len) |
808 put_field(((src_val << 3) & 0xf8) | ((src_val >> 2) & 0x07), dst->blue_shift, dst->blue_len);
810 dst_start += dst->stride / 4;
811 src_start += src->stride / 2;
816 FIXME("Unsupported conversion: 16 -> 8888\n");
824 BYTE *src_start = get_pixel_ptr_8(src, src_rect->left, src_rect->top), *src_pixel;
825 for(y = src_rect->top; y < src_rect->bottom; y++)
827 dst_pixel = dst_start;
828 src_pixel = src_start;
829 for(x = src_rect->left; x < src_rect->right; x++)
832 src_val = *src_pixel++;
833 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
834 rgb = src->color_table[src_val];
835 *dst_pixel++ = put_field(rgb.rgbRed, dst->red_shift, dst->red_len) |
836 put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
837 put_field(rgb.rgbBlue, dst->blue_shift, dst->blue_len);
839 dst_start += dst->stride / 4;
840 src_start += src->stride;
847 BYTE *src_start = get_pixel_ptr_4(src, src_rect->left, src_rect->top), *src_pixel;
848 for(y = src_rect->top; y < src_rect->bottom; y++)
850 dst_pixel = dst_start;
851 src_pixel = src_start;
852 for(x = src_rect->left; x < src_rect->right; x++)
856 src_val = *src_pixel++ & 0xf;
858 src_val = (*src_pixel >> 4) & 0xf;
859 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
860 rgb = src->color_table[src_val];
861 *dst_pixel++ = put_field(rgb.rgbRed, dst->red_shift, dst->red_len) |
862 put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
863 put_field(rgb.rgbBlue, dst->blue_shift, dst->blue_len);
865 dst_start += dst->stride / 4;
866 src_start += src->stride;
872 FIXME("Unsupported conversion: %d -> 32\n", src->bit_count);
879 static BOOL convert_to_24(dib_info *dst, const dib_info *src, const RECT *src_rect)
881 BYTE *dst_start = dst->bits, *dst_pixel;
885 switch(src->bit_count)
889 DWORD *src_start = get_pixel_ptr_32(src, src_rect->left, src_rect->top), *src_pixel;
890 if(src->funcs == &funcs_8888)
892 for(y = src_rect->top; y < src_rect->bottom; y++)
894 dst_pixel = dst_start;
895 src_pixel = src_start;
896 for(x = src_rect->left; x < src_rect->right; x++)
898 src_val = *src_pixel++;
899 *dst_pixel++ = src_val & 0xff;
900 *dst_pixel++ = (src_val >> 8) & 0xff;
901 *dst_pixel++ = (src_val >> 16) & 0xff;
903 dst_start += dst->stride;
904 src_start += src->stride / 4;
909 FIXME("Unsupported conversion: 32 -> 24\n");
917 BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top);
919 if(src->stride > 0 && dst->stride > 0 && src_rect->left == 0 && src_rect->right == src->width)
920 memcpy(dst->bits, src_start, (src_rect->bottom - src_rect->top) * src->stride);
923 for(y = src_rect->top; y < src_rect->bottom; y++)
925 memcpy(dst_start, src_start, (src_rect->right - src_rect->left) * 3);
926 dst_start += dst->stride;
927 src_start += src->stride;
935 WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
936 if(src->funcs == &funcs_555)
938 for(y = src_rect->top; y < src_rect->bottom; y++)
940 dst_pixel = dst_start;
941 src_pixel = src_start;
942 for(x = src_rect->left; x < src_rect->right; x++)
944 src_val = *src_pixel++;
945 *dst_pixel++ = ((src_val << 3) & 0xf8) | ((src_val >> 2) & 0x07);
946 *dst_pixel++ = ((src_val >> 2) & 0xf8) | ((src_val >> 7) & 0x07);
947 *dst_pixel++ = ((src_val >> 7) & 0xf8) | ((src_val >> 12) & 0x07);
949 dst_start += dst->stride;
950 src_start += src->stride / 2;
955 FIXME("Unsupported conversion: 16 -> 24\n");
963 BYTE *src_start = get_pixel_ptr_8(src, src_rect->left, src_rect->top), *src_pixel;
964 for(y = src_rect->top; y < src_rect->bottom; y++)
966 dst_pixel = dst_start;
967 src_pixel = src_start;
968 for(x = src_rect->left; x < src_rect->right; x++)
971 src_val = *src_pixel++;
972 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
973 rgb = src->color_table[src_val];
974 *dst_pixel++ = rgb.rgbBlue;
975 *dst_pixel++ = rgb.rgbGreen;
976 *dst_pixel++ = rgb.rgbRed;
978 dst_start += dst->stride;
979 src_start += src->stride;
986 BYTE *src_start = get_pixel_ptr_4(src, src_rect->left, src_rect->top), *src_pixel;
987 for(y = src_rect->top; y < src_rect->bottom; y++)
989 dst_pixel = dst_start;
990 src_pixel = src_start;
991 for(x = src_rect->left; x < src_rect->right; x++)
995 src_val = *src_pixel++ & 0xf;
997 src_val = (*src_pixel >> 4) & 0xf;
998 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
999 rgb = src->color_table[src_val];
1000 *dst_pixel++ = rgb.rgbBlue;
1001 *dst_pixel++ = rgb.rgbGreen;
1002 *dst_pixel++ = rgb.rgbRed;
1004 dst_start += dst->stride;
1005 src_start += src->stride;
1011 FIXME("Unsupported conversion: %d -> 24\n", src->bit_count);
1018 static BOOL convert_to_555(dib_info *dst, const dib_info *src, const RECT *src_rect)
1020 WORD *dst_start = dst->bits, *dst_pixel;
1024 switch(src->bit_count)
1028 DWORD *src_start = get_pixel_ptr_32(src, src_rect->left, src_rect->top), *src_pixel;
1030 if(src->funcs == &funcs_8888)
1032 for(y = src_rect->top; y < src_rect->bottom; y++)
1034 dst_pixel = dst_start;
1035 src_pixel = src_start;
1036 for(x = src_rect->left; x < src_rect->right; x++)
1038 src_val = *src_pixel++;
1039 *dst_pixel++ = ((src_val >> 9) & 0x7c00) |
1040 ((src_val >> 6) & 0x03e0) |
1041 ((src_val >> 3) & 0x001e);
1043 dst_start += dst->stride / 2;
1044 src_start += src->stride / 4;
1049 FIXME("Unsupported conversion: 32 -> 555\n");
1057 BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
1059 for(y = src_rect->top; y < src_rect->bottom; y++)
1061 dst_pixel = dst_start;
1062 src_pixel = src_start;
1063 for(x = src_rect->left; x < src_rect->right; x++)
1066 rgb.rgbBlue = *src_pixel++;
1067 rgb.rgbGreen = *src_pixel++;
1068 rgb.rgbRed = *src_pixel++;
1070 *dst_pixel++ = ((rgb.rgbRed << 7) & 0x7c00) |
1071 ((rgb.rgbGreen << 2) & 0x03e0) |
1072 ((rgb.rgbBlue >> 3) & 0x001f);
1074 dst_start += dst->stride / 2;
1075 src_start += src->stride;
1082 WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top);
1083 if(src->funcs == &funcs_555)
1085 if(src->stride > 0 && dst->stride > 0 && src_rect->left == 0 && src_rect->right == src->width)
1086 memcpy(dst->bits, src_start, (src_rect->bottom - src_rect->top) * src->stride);
1089 for(y = src_rect->top; y < src_rect->bottom; y++)
1091 memcpy(dst_start, src_start, (src_rect->right - src_rect->left) * 2);
1092 dst_start += dst->stride / 2;
1093 src_start += src->stride / 2;
1099 FIXME("Unsupported conversion: 16 -> 555\n");
1107 BYTE *src_start = get_pixel_ptr_8(src, src_rect->left, src_rect->top), *src_pixel;
1108 for(y = src_rect->top; y < src_rect->bottom; y++)
1110 dst_pixel = dst_start;
1111 src_pixel = src_start;
1112 for(x = src_rect->left; x < src_rect->right; x++)
1115 src_val = *src_pixel++;
1116 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1117 rgb = src->color_table[src_val];
1118 *dst_pixel++ = ((rgb.rgbRed << 7) & 0x7c00) |
1119 ((rgb.rgbGreen << 2) & 0x03e0) |
1120 ((rgb.rgbBlue >> 3) & 0x001f);
1122 dst_start += dst->stride / 2;
1123 src_start += src->stride;
1130 BYTE *src_start = get_pixel_ptr_4(src, src_rect->left, src_rect->top), *src_pixel;
1131 for(y = src_rect->top; y < src_rect->bottom; y++)
1133 dst_pixel = dst_start;
1134 src_pixel = src_start;
1135 for(x = src_rect->left; x < src_rect->right; x++)
1139 src_val = *src_pixel++ & 0xf;
1141 src_val = (*src_pixel >> 4) & 0xf;
1142 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1143 rgb = src->color_table[src_val];
1144 *dst_pixel++ = ((rgb.rgbRed << 7) & 0x7c00) |
1145 ((rgb.rgbGreen << 2) & 0x03e0) |
1146 ((rgb.rgbBlue >> 3) & 0x001f);
1148 dst_start += dst->stride / 2;
1149 src_start += src->stride;
1155 FIXME("Unsupported conversion: %d -> 555\n", src->bit_count);
1162 static BOOL convert_to_16(dib_info *dst, const dib_info *src, const RECT *src_rect)
1164 WORD *dst_start = dst->bits, *dst_pixel;
1168 switch(src->bit_count)
1172 DWORD *src_start = get_pixel_ptr_32(src, src_rect->left, src_rect->top), *src_pixel;
1174 if(src->funcs == &funcs_8888)
1176 for(y = src_rect->top; y < src_rect->bottom; y++)
1178 dst_pixel = dst_start;
1179 src_pixel = src_start;
1180 for(x = src_rect->left; x < src_rect->right; x++)
1182 src_val = *src_pixel++;
1183 *dst_pixel++ = put_field((src_val >> 16) & 0xff, dst->red_shift, dst->red_len) |
1184 put_field((src_val >> 8) & 0xff, dst->green_shift, dst->green_len) |
1185 put_field( src_val & 0xff, dst->blue_shift, dst->blue_len);
1187 dst_start += dst->stride / 2;
1188 src_start += src->stride / 4;
1193 FIXME("Unsupported conversion: 32 -> 16\n");
1201 BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
1203 for(y = src_rect->top; y < src_rect->bottom; y++)
1205 dst_pixel = dst_start;
1206 src_pixel = src_start;
1207 for(x = src_rect->left; x < src_rect->right; x++)
1210 rgb.rgbBlue = *src_pixel++;
1211 rgb.rgbGreen = *src_pixel++;
1212 rgb.rgbRed = *src_pixel++;
1214 *dst_pixel++ = put_field(rgb.rgbRed, dst->red_shift, dst->red_len) |
1215 put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
1216 put_field(rgb.rgbBlue, dst->blue_shift, dst->blue_len);
1218 dst_start += dst->stride / 2;
1219 src_start += src->stride;
1226 WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
1227 if(src->funcs == &funcs_555)
1229 for(y = src_rect->top; y < src_rect->bottom; y++)
1231 dst_pixel = dst_start;
1232 src_pixel = src_start;
1233 for(x = src_rect->left; x < src_rect->right; x++)
1235 src_val = *src_pixel++;
1236 *dst_pixel++ = put_field(((src_val >> 7) & 0xf8) | ((src_val >> 12) & 0x07), dst->red_shift, dst->red_len) |
1237 put_field(((src_val >> 2) & 0xf8) | ((src_val >> 7) & 0x07), dst->green_shift, dst->green_len) |
1238 put_field(((src_val << 3) & 0xf8) | ((src_val >> 2) & 0x07), dst->blue_shift, dst->blue_len);
1240 dst_start += dst->stride / 2;
1241 src_start += src->stride / 2;
1246 FIXME("Unsupported conversion: 16 -> 16\n");
1254 BYTE *src_start = get_pixel_ptr_8(src, src_rect->left, src_rect->top), *src_pixel;
1255 for(y = src_rect->top; y < src_rect->bottom; y++)
1257 dst_pixel = dst_start;
1258 src_pixel = src_start;
1259 for(x = src_rect->left; x < src_rect->right; x++)
1262 src_val = *src_pixel++;
1263 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1264 rgb = src->color_table[src_val];
1265 *dst_pixel++ = put_field(rgb.rgbRed, dst->red_shift, dst->red_len) |
1266 put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
1267 put_field(rgb.rgbBlue, dst->blue_shift, dst->blue_len);
1269 dst_start += dst->stride / 2;
1270 src_start += src->stride;
1277 BYTE *src_start = get_pixel_ptr_4(src, src_rect->left, src_rect->top), *src_pixel;
1278 for(y = src_rect->top; y < src_rect->bottom; y++)
1280 dst_pixel = dst_start;
1281 src_pixel = src_start;
1282 for(x = src_rect->left; x < src_rect->right; x++)
1286 src_val = *src_pixel++ & 0xf;
1288 src_val = (*src_pixel >> 4) & 0xf;
1289 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1290 rgb = src->color_table[src_val];
1291 *dst_pixel++ = put_field(rgb.rgbRed, dst->red_shift, dst->red_len) |
1292 put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
1293 put_field(rgb.rgbBlue, dst->blue_shift, dst->blue_len);
1295 dst_start += dst->stride / 2;
1296 src_start += src->stride;
1302 FIXME("Unsupported conversion: %d -> 16\n", src->bit_count);
1309 static inline BOOL color_tables_match(const dib_info *d1, const dib_info *d2)
1311 assert(d1->color_table_size && d2->color_table_size);
1313 if(d1->color_table_size != d2->color_table_size) return FALSE;
1314 return !memcmp(d1->color_table, d2->color_table, d1->color_table_size * sizeof(d1->color_table[0]));
1317 static BOOL convert_to_8(dib_info *dst, const dib_info *src, const RECT *src_rect)
1319 BYTE *dst_start = dst->bits, *dst_pixel;
1323 switch(src->bit_count)
1327 DWORD *src_start = get_pixel_ptr_32(src, src_rect->left, src_rect->top), *src_pixel;
1329 if(src->funcs == &funcs_8888)
1331 for(y = src_rect->top; y < src_rect->bottom; y++)
1333 dst_pixel = dst_start;
1334 src_pixel = src_start;
1335 for(x = src_rect->left; x < src_rect->right; x++)
1337 src_val = *src_pixel++;
1338 *dst_pixel++ = colorref_to_pixel_colortable(dst, ((src_val >> 16) & 0x0000ff) |
1339 ( src_val & 0x00ff00) |
1340 ((src_val << 16) & 0xff0000) );
1342 dst_start += dst->stride;
1343 src_start += src->stride / 4;
1348 FIXME("Unsupported conversion: 32 -> 8\n");
1356 BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
1358 for(y = src_rect->top; y < src_rect->bottom; y++)
1360 dst_pixel = dst_start;
1361 src_pixel = src_start;
1362 for(x = src_rect->left; x < src_rect->right; x++)
1365 rgb.rgbBlue = *src_pixel++;
1366 rgb.rgbGreen = *src_pixel++;
1367 rgb.rgbRed = *src_pixel++;
1369 *dst_pixel++ = colorref_to_pixel_colortable(dst, ( rgb.rgbRed & 0x0000ff) |
1370 ((rgb.rgbGreen << 8) & 0x00ff00) |
1371 ((rgb.rgbBlue << 16) & 0xff0000));
1373 dst_start += dst->stride;
1374 src_start += src->stride;
1381 WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
1382 if(src->funcs == &funcs_555)
1384 for(y = src_rect->top; y < src_rect->bottom; y++)
1386 dst_pixel = dst_start;
1387 src_pixel = src_start;
1388 for(x = src_rect->left; x < src_rect->right; x++)
1390 src_val = *src_pixel++;
1391 *dst_pixel++ = colorref_to_pixel_colortable(dst, ((src_val >> 7) & 0x0000f8) | ((src_val >> 12) & 0x000007) |
1392 ((src_val << 6) & 0x00f800) | ((src_val << 1) & 0x000700) |
1393 ((src_val << 19) & 0xf80000) | ((src_val << 14) & 0x070000) );
1395 dst_start += dst->stride;
1396 src_start += src->stride / 2;
1401 FIXME("Unsupported conversion: 16 -> 8\n");
1409 BYTE *src_start = get_pixel_ptr_8(src, src_rect->left, src_rect->top), *src_pixel;
1411 if(color_tables_match(dst, src))
1413 if(src->stride > 0 && dst->stride > 0 && src_rect->left == 0 && src_rect->right == src->width)
1414 memcpy(dst->bits, src_start, (src_rect->bottom - src_rect->top) * src->stride);
1417 for(y = src_rect->top; y < src_rect->bottom; y++)
1419 memcpy(dst_start, src_start, src_rect->right - src_rect->left);
1420 dst_start += dst->stride;
1421 src_start += src->stride;
1427 for(y = src_rect->top; y < src_rect->bottom; y++)
1429 dst_pixel = dst_start;
1430 src_pixel = src_start;
1431 for(x = src_rect->left; x < src_rect->right; x++)
1434 src_val = *src_pixel++;
1435 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1436 rgb = src->color_table[src_val];
1437 *dst_pixel++ = colorref_to_pixel_colortable(dst, RGB(rgb.rgbRed, rgb.rgbGreen, rgb.rgbBlue));
1439 dst_start += dst->stride;
1440 src_start += src->stride;
1448 BYTE *src_start = get_pixel_ptr_4(src, src_rect->left, src_rect->top), *src_pixel;
1449 for(y = src_rect->top; y < src_rect->bottom; y++)
1451 dst_pixel = dst_start;
1452 src_pixel = src_start;
1453 for(x = src_rect->left; x < src_rect->right; x++)
1457 src_val = *src_pixel++ & 0xf;
1459 src_val = (*src_pixel >> 4) & 0xf;
1460 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1461 rgb = src->color_table[src_val];
1462 *dst_pixel++ = colorref_to_pixel_colortable(dst, RGB(rgb.rgbRed, rgb.rgbGreen, rgb.rgbBlue));
1464 dst_start += dst->stride;
1465 src_start += src->stride;
1471 FIXME("Unsupported conversion: %d -> 8\n", src->bit_count);
1478 static BOOL convert_to_4(dib_info *dst, const dib_info *src, const RECT *src_rect)
1480 BYTE *dst_start = dst->bits, *dst_pixel, dst_val;
1484 switch(src->bit_count)
1488 DWORD *src_start = get_pixel_ptr_32(src, src_rect->left, src_rect->top), *src_pixel;
1490 if(src->funcs == &funcs_8888)
1492 for(y = src_rect->top; y < src_rect->bottom; y++)
1494 dst_pixel = dst_start;
1495 src_pixel = src_start;
1496 for(x = src_rect->left; x < src_rect->right; x++)
1498 src_val = *src_pixel++;
1499 dst_val = colorref_to_pixel_colortable(dst, ((src_val >> 16) & 0x0000ff) |
1500 ( src_val & 0x00ff00) |
1501 ((src_val << 16) & 0xff0000) );
1502 if((x - src_rect->left) & 1)
1504 *dst_pixel = (dst_val & 0x0f) | (*dst_pixel & 0xf0);
1508 *dst_pixel = (dst_val << 4) & 0xf0;
1510 dst_start += dst->stride;
1511 src_start += src->stride / 4;
1516 FIXME("Unsupported conversion: 32 -> 4\n");
1524 BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
1526 for(y = src_rect->top; y < src_rect->bottom; y++)
1528 dst_pixel = dst_start;
1529 src_pixel = src_start;
1530 for(x = src_rect->left; x < src_rect->right; x++)
1533 rgb.rgbBlue = *src_pixel++;
1534 rgb.rgbGreen = *src_pixel++;
1535 rgb.rgbRed = *src_pixel++;
1537 dst_val = colorref_to_pixel_colortable(dst, ( rgb.rgbRed & 0x0000ff) |
1538 ((rgb.rgbGreen << 8) & 0x00ff00) |
1539 ((rgb.rgbBlue << 16) & 0xff0000));
1541 if((x - src_rect->left) & 1)
1543 *dst_pixel = (dst_val & 0x0f) | (*dst_pixel & 0xf0);
1547 *dst_pixel = (dst_val << 4) & 0xf0;
1549 dst_start += dst->stride;
1550 src_start += src->stride;
1557 WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
1558 if(src->funcs == &funcs_555)
1560 for(y = src_rect->top; y < src_rect->bottom; y++)
1562 dst_pixel = dst_start;
1563 src_pixel = src_start;
1564 for(x = src_rect->left; x < src_rect->right; x++)
1566 src_val = *src_pixel++;
1567 dst_val = colorref_to_pixel_colortable(dst, ((src_val >> 7) & 0x0000f8) | ((src_val >> 12) & 0x000007) |
1568 ((src_val << 6) & 0x00f800) | ((src_val << 1) & 0x000700) |
1569 ((src_val << 19) & 0xf80000) | ((src_val << 14) & 0x070000) );
1570 if((x - src_rect->left) & 1)
1572 *dst_pixel = (dst_val & 0x0f) | (*dst_pixel & 0xf0);
1576 *dst_pixel = (dst_val << 4) & 0xf0;
1578 dst_start += dst->stride;
1579 src_start += src->stride / 2;
1584 FIXME("Unsupported conversion: 16 -> 4\n");
1592 BYTE *src_start = get_pixel_ptr_8(src, src_rect->left, src_rect->top), *src_pixel;
1594 for(y = src_rect->top; y < src_rect->bottom; y++)
1596 dst_pixel = dst_start;
1597 src_pixel = src_start;
1598 for(x = src_rect->left; x < src_rect->right; x++)
1601 src_val = *src_pixel++;
1602 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1603 rgb = src->color_table[src_val];
1604 dst_val = colorref_to_pixel_colortable(dst, RGB(rgb.rgbRed, rgb.rgbGreen, rgb.rgbBlue));
1605 if((x - src_rect->left) & 1)
1607 *dst_pixel = (dst_val & 0x0f) | (*dst_pixel & 0xf0);
1611 *dst_pixel = (dst_val << 4) & 0xf0;
1613 dst_start += dst->stride;
1614 src_start += src->stride;
1621 BYTE *src_start = get_pixel_ptr_4(src, src_rect->left, src_rect->top), *src_pixel;
1623 if(color_tables_match(dst, src) && (src_rect->left & 1) == 0)
1625 if(src->stride > 0 && dst->stride > 0 && src_rect->left == 0 && src_rect->right == src->width)
1626 memcpy(dst->bits, src_start, (src_rect->bottom - src_rect->top) * src->stride);
1629 for(y = src_rect->top; y < src_rect->bottom; y++)
1631 memcpy(dst_start, src_start, (src_rect->right - src_rect->left + 1) / 2);
1632 dst_start += dst->stride;
1633 src_start += src->stride;
1639 for(y = src_rect->top; y < src_rect->bottom; y++)
1641 dst_pixel = dst_start;
1642 src_pixel = src_start;
1643 for(x = src_rect->left; x < src_rect->right; x++)
1647 src_val = *src_pixel++ & 0xf;
1649 src_val = (*src_pixel >> 4) & 0xf;
1650 if(src_val >= src->color_table_size) src_val = src->color_table_size - 1;
1651 rgb = src->color_table[src_val];
1652 dst_val = colorref_to_pixel_colortable(dst, RGB(rgb.rgbRed, rgb.rgbGreen, rgb.rgbBlue));
1653 if((x - src_rect->left) & 1)
1655 *dst_pixel = (dst_val & 0x0f) | (*dst_pixel & 0xf0);
1659 *dst_pixel = (dst_val << 4) & 0xf0;
1661 dst_start += dst->stride;
1662 src_start += src->stride;
1669 FIXME("Unsupported conversion: %d -> 4\n", src->bit_count);
1677 static BOOL convert_to_null(dib_info *dst, const dib_info *src, const RECT *src_rect)
1682 const primitive_funcs funcs_8888 =
1686 colorref_to_pixel_888,
1690 const primitive_funcs funcs_32 =
1694 colorref_to_pixel_masks,
1698 const primitive_funcs funcs_24 =
1702 colorref_to_pixel_888,
1706 const primitive_funcs funcs_555 =
1710 colorref_to_pixel_555,
1714 const primitive_funcs funcs_16 =
1718 colorref_to_pixel_masks,
1722 const primitive_funcs funcs_8 =
1726 colorref_to_pixel_colortable,
1730 const primitive_funcs funcs_4 =
1734 colorref_to_pixel_colortable,
1738 const primitive_funcs funcs_null =
1742 colorref_to_pixel_null,