Ticket #511: graphics_win32.c.patch

File graphics_win32.c.patch, 2.7 KB (added by mis, 13 years ago)
  • graphics_win32.c

     
    12211221} /* end of source */
    12221222
    12231223static void
    1224 pngrender(struct graphics_image_priv *img, struct graphics_priv *gr, int x0,int y0)
     1224pngrender(struct graphics_image_priv *img, struct graphics_priv *gr, int x0, int y0)
    12251225{
    1226     if (img->hBitmap)
    1227     {
     1226        if (img->hBitmap)
     1227        {
    12281228                BLENDFUNCTION blendFunction ;
    12291229                blendFunction.BlendOp = AC_SRC_OVER;
    12301230                blendFunction.BlendFlags = 0;
     
    12321232                blendFunction.AlphaFormat = AC_SRC_ALPHA;
    12331233                HDC hdc = CreateCompatibleDC(NULL);
    12341234                HBITMAP oldBitmap = SelectBitmap(hdc, img->hBitmap);
    1235         gr->AlphaBlend(gr->hMemDC, x0, y0, img->width, img->height, hdc, 0, 0, img->width, img->height, blendFunction);
    1236         (void)SelectBitmap(hdc, oldBitmap);
    1237         DeleteDC(hdc);
    1238     }
    1239     else
    1240     {
    1241 
    1242                 int x,y;
     1235                gr->AlphaBlend(gr->hMemDC, x0, y0, img->width, img->height, hdc, 0, 0, img->width, img->height, blendFunction);
     1236                (void)SelectBitmap(hdc, oldBitmap);
     1237                DeleteDC(hdc);
     1238        }
     1239        else
     1240        {
     1241                int x, y;
    12431242                HDC hdc=gr->hMemDC;
    12441243                png_byte *pix_ptr = img->png_pixels;
    12451244                COLORREF *pixeldata;
     
    12541253                pnginfo.bmiHeader.biCompression = BI_RGB;
    12551254                pnginfo.bmiHeader.biPlanes = 1;
    12561255                HDC dc = CreateCompatibleDC(NULL);
    1257                 HBITMAP bitmap = CreateDIBSection(hdc, &pnginfo, DIB_RGB_COLORS , (void **)&pixeldata, NULL, 0);
     1256                HBITMAP bitmap = CreateDIBSection(hdc, &pnginfo, DIB_RGB_COLORS, (void **)&pixeldata, NULL, 0);
    12581257                HBITMAP oldBitmap = SelectBitmap(dc, bitmap);
    12591258                BitBlt(dc, 0, 0, img->width, img->height, hdc, x0, y0, SRCCOPY);
    12601259                for (y=0 ; y < img->width ; y++)
    12611260                {
    12621261                        for (x=0 ; x < img->height ; x++)
    12631262                        {
    1264                                 int ai,a=pix_ptr[3];
    1265                                 int r,g,b;
    1266                                 if (a == 0xff)
     1263                                int b = pix_ptr[0];
     1264                                int g = pix_ptr[1];
     1265                                int r = pix_ptr[2];
     1266                                int a = pix_ptr[3];
     1267                                if (a != 0xff)
    12671268                                {
    1268                                         r=pix_ptr[0];
    1269                                         g=pix_ptr[1];
    1270                                         b=pix_ptr[2];
     1269                                        int p = *pixeldata;
     1270                                        int ai = 0xff - a;
     1271                                        r = (r * a + ((p >> 16) & 0xff) * ai) / 255;
     1272                                        g = (g * a + ((p >>  8) & 0xff) * ai) / 255;
     1273                                        b = (b * a + ((p >>  0) & 0xff) * ai) / 255;
    12711274                                }
    1272                                 else
    1273                                 {
    1274                                         int p=*pixeldata;
    1275                                         ai=0xff-a;
    1276                                         r=(p >> 16) & 0xff;
    1277                                         g=(p >> 8) & 0xff;
    1278                                         b=(p >> 0) & 0xff;
    1279                                         r=(pix_ptr[0]*a+((p >> 16) & 0xff)*ai)/255;
    1280                                         g=(pix_ptr[1]*a+((p >>  8) & 0xff)*ai)/255;
    1281                                         b=(pix_ptr[2]*a+((p >>  0) & 0xff)*ai)/255;
    1282                                 }
    1283                                 *pixeldata++=(r << 16) | (g << 8) | b;
     1275                                *pixeldata++ = (r << 16) | (g << 8) | b;
    12841276                                pix_ptr+=img->channels;
    12851277                        }
    12861278                }
     
    12891281                (void)SelectBitmap(dc, oldBitmap);
    12901282                DeleteBitmap(bitmap);
    12911283                DeleteDC(dc);
    1292     }
     1284        }
    12931285}
    12941286
    12951287static int