Huw Davies : gdi32: Add support for 24 bpp brushes.

Alexandre Julliard julliard at winehq.org
Wed Jun 1 12:11:07 CDT 2011


Module: wine
Branch: master
Commit: 146ad997ba8e29c9f3ff0cd0db1489c3a1d65691
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=146ad997ba8e29c9f3ff0cd0db1489c3a1d65691

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Jun  1 09:41:41 2011 +0100

gdi32: Add support for 24 bpp brushes.

---

 dlls/gdi32/dibdrv/primitives.c |  174 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 174 insertions(+), 0 deletions(-)

diff --git a/dlls/gdi32/dibdrv/primitives.c b/dlls/gdi32/dibdrv/primitives.c
index b7270e9..4711a65 100644
--- a/dlls/gdi32/dibdrv/primitives.c
+++ b/dlls/gdi32/dibdrv/primitives.c
@@ -626,6 +626,29 @@ static BOOL convert_to_8888(dib_info *dst, const dib_info *src, const RECT *src_
         break;
     }
 
+    case 24:
+    {
+        BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
+
+        for(y = src_rect->top; y < src_rect->bottom; y++)
+        {
+            dst_pixel = dst_start;
+            src_pixel = src_start;
+            for(x = src_rect->left; x < src_rect->right; x++)
+            {
+                RGBQUAD rgb;
+                rgb.rgbBlue  = *src_pixel++;
+                rgb.rgbGreen = *src_pixel++;
+                rgb.rgbRed   = *src_pixel++;
+
+                *dst_pixel++ = ((rgb.rgbRed << 16) & 0xff0000) | ((rgb.rgbGreen << 8) & 0x00ff00) | (rgb.rgbBlue & 0x0000ff);
+            }
+            dst_start += dst->stride / 4;
+            src_start += src->stride;
+        }
+        break;
+    }
+
     case 16:
     {
         WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
@@ -743,6 +766,31 @@ static BOOL convert_to_32(dib_info *dst, const dib_info *src, const RECT *src_re
         break;
     }
 
+    case 24:
+    {
+        BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
+
+        for(y = src_rect->top; y < src_rect->bottom; y++)
+        {
+            dst_pixel = dst_start;
+            src_pixel = src_start;
+            for(x = src_rect->left; x < src_rect->right; x++)
+            {
+                RGBQUAD rgb;
+                rgb.rgbBlue  = *src_pixel++;
+                rgb.rgbGreen = *src_pixel++;
+                rgb.rgbRed   = *src_pixel++;
+
+                *dst_pixel++ = put_field(rgb.rgbRed,   dst->red_shift,   dst->red_len)   |
+                               put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
+                               put_field(rgb.rgbBlue,  dst->blue_shift,  dst->blue_len);
+            }
+            dst_start += dst->stride / 4;
+            src_start += src->stride;
+        }
+        break;
+    }
+
     case 16:
     {
         WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
@@ -864,6 +912,24 @@ static BOOL convert_to_24(dib_info *dst, const dib_info *src, const RECT *src_re
         break;
     }
 
+    case 24:
+    {
+        BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top);
+
+        if(src->stride > 0 && dst->stride > 0 && src_rect->left == 0 && src_rect->right == src->width)
+            memcpy(dst->bits, src_start, (src_rect->bottom - src_rect->top) * src->stride);
+        else
+        {
+            for(y = src_rect->top; y < src_rect->bottom; y++)
+            {
+                memcpy(dst_start, src_start, (src_rect->right - src_rect->left) * 3);
+                dst_start += dst->stride;
+                src_start += src->stride;
+            }
+        }
+        break;
+    }
+
     case 16:
     {
         WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
@@ -986,6 +1052,31 @@ static BOOL convert_to_555(dib_info *dst, const dib_info *src, const RECT *src_r
         break;
     }
 
+    case 24:
+    {
+        BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
+
+        for(y = src_rect->top; y < src_rect->bottom; y++)
+        {
+            dst_pixel = dst_start;
+            src_pixel = src_start;
+            for(x = src_rect->left; x < src_rect->right; x++)
+            {
+                RGBQUAD rgb;
+                rgb.rgbBlue  = *src_pixel++;
+                rgb.rgbGreen = *src_pixel++;
+                rgb.rgbRed   = *src_pixel++;
+
+                *dst_pixel++ = ((rgb.rgbRed   << 7) & 0x7c00) |
+                               ((rgb.rgbGreen << 2) & 0x03e0) |
+                               ((rgb.rgbBlue  >> 3) & 0x001f);
+            }
+            dst_start += dst->stride / 2;
+            src_start += src->stride;
+        }
+        break;
+    }
+
     case 16:
     {
         WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top);
@@ -1105,6 +1196,31 @@ static BOOL convert_to_16(dib_info *dst, const dib_info *src, const RECT *src_re
         break;
     }
 
+    case 24:
+    {
+        BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
+
+        for(y = src_rect->top; y < src_rect->bottom; y++)
+        {
+            dst_pixel = dst_start;
+            src_pixel = src_start;
+            for(x = src_rect->left; x < src_rect->right; x++)
+            {
+                RGBQUAD rgb;
+                rgb.rgbBlue  = *src_pixel++;
+                rgb.rgbGreen = *src_pixel++;
+                rgb.rgbRed   = *src_pixel++;
+
+                *dst_pixel++ = put_field(rgb.rgbRed,   dst->red_shift,   dst->red_len) |
+                               put_field(rgb.rgbGreen, dst->green_shift, dst->green_len) |
+                               put_field(rgb.rgbBlue,  dst->blue_shift,  dst->blue_len);
+            }
+            dst_start += dst->stride / 2;
+            src_start += src->stride;
+        }
+        break;
+    }
+
     case 16:
     {
         WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
@@ -1235,6 +1351,31 @@ static BOOL convert_to_8(dib_info *dst, const dib_info *src, const RECT *src_rec
         break;
     }
 
+    case 24:
+    {
+        BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
+
+        for(y = src_rect->top; y < src_rect->bottom; y++)
+        {
+            dst_pixel = dst_start;
+            src_pixel = src_start;
+            for(x = src_rect->left; x < src_rect->right; x++)
+            {
+                RGBQUAD rgb;
+                rgb.rgbBlue  = *src_pixel++;
+                rgb.rgbGreen = *src_pixel++;
+                rgb.rgbRed   = *src_pixel++;
+
+                *dst_pixel++ = colorref_to_pixel_colortable(dst, ( rgb.rgbRed         & 0x0000ff) |
+                                                                 ((rgb.rgbGreen << 8) & 0x00ff00) |
+                                                                 ((rgb.rgbBlue << 16) & 0xff0000));
+            }
+            dst_start += dst->stride;
+            src_start += src->stride;
+        }
+        break;
+    }
+
     case 16:
     {
         WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;
@@ -1378,6 +1519,39 @@ static BOOL convert_to_4(dib_info *dst, const dib_info *src, const RECT *src_rec
         break;
     }
 
+    case 24:
+    {
+        BYTE *src_start = get_pixel_ptr_24(src, src_rect->left, src_rect->top), *src_pixel;
+
+        for(y = src_rect->top; y < src_rect->bottom; y++)
+        {
+            dst_pixel = dst_start;
+            src_pixel = src_start;
+            for(x = src_rect->left; x < src_rect->right; x++)
+            {
+                RGBQUAD rgb;
+                rgb.rgbBlue  = *src_pixel++;
+                rgb.rgbGreen = *src_pixel++;
+                rgb.rgbRed   = *src_pixel++;
+
+                dst_val = colorref_to_pixel_colortable(dst, ( rgb.rgbRed         & 0x0000ff) |
+                                                            ((rgb.rgbGreen << 8) & 0x00ff00) |
+                                                            ((rgb.rgbBlue << 16) & 0xff0000));
+
+                if((x - src_rect->left) & 1)
+                {
+                    *dst_pixel = (dst_val & 0x0f) | (*dst_pixel & 0xf0);
+                    dst_pixel++;
+                }
+                else
+                    *dst_pixel = (dst_val << 4) & 0xf0;
+            }
+            dst_start += dst->stride;
+            src_start += src->stride;
+        }
+        break;
+    }
+
     case 16:
     {
         WORD *src_start = get_pixel_ptr_16(src, src_rect->left, src_rect->top), *src_pixel;




More information about the wine-cvs mailing list