]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix alpha handling in Scintilla when not using wxGraphicsContext.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 20 Sep 2012 20:00:48 +0000 (20:00 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 20 Sep 2012 20:00:48 +0000 (20:00 +0000)
When using raw bitmap data access classes such as wxAlphaPixelData we must
destroy them to ensure that the changes done via them are committed to the
bitmap before drawing the bitmap.

Just add an extra block (the diff should be viewed ignoring white space to see
the only significant change) to ensure that wxAlphaPixelData is destroyed
before DrawBitmap() is called.

Closes #14680.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72525 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/stc/PlatWX.cpp

index 9e69d2fcd587213f886d86527b709c0997a37d55..0a774a063cb915fd63fd4b0dfd8a990af7f59f01 100644 (file)
@@ -337,55 +337,60 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize,
     int x, y;
     wxRect r = wxRectFromPRectangle(rc);
     wxBitmap bmp(r.width, r.height, 32);
-    wxAlphaPixelData pixData(bmp);
 
-    // Set the fill pixels
-    ColourDesired cdf(fill.AsLong());
-    int red   = cdf.GetRed();
-    int green = cdf.GetGreen();
-    int blue  = cdf.GetBlue();
+    // This block is needed to ensure that the changes done to the bitmap via
+    // pixel data object are committed before the bitmap is drawn.
+    {
+        wxAlphaPixelData pixData(bmp);
+
+        // Set the fill pixels
+        ColourDesired cdf(fill.AsLong());
+        int red   = cdf.GetRed();
+        int green = cdf.GetGreen();
+        int blue  = cdf.GetBlue();
+
+        wxAlphaPixelData::Iterator p(pixData);
+        for (y=0; y<r.height; y++) {
+            p.MoveTo(pixData, 0, y);
+            for (x=0; x<r.width; x++) {
+                p.Red()   = wxPy_premultiply(red,   alphaFill);
+                p.Green() = wxPy_premultiply(green, alphaFill);
+                p.Blue()  = wxPy_premultiply(blue,  alphaFill);
+                p.Alpha() = alphaFill;
+                ++p;
+            }
+        }
 
-    wxAlphaPixelData::Iterator p(pixData);
-    for (y=0; y<r.height; y++) {
-        p.MoveTo(pixData, 0, y);
+        // Set the outline pixels
+        ColourDesired cdo(outline.AsLong());
+        red   = cdo.GetRed();
+        green = cdo.GetGreen();
+        blue  = cdo.GetBlue();
         for (x=0; x<r.width; x++) {
-            p.Red()   = wxPy_premultiply(red,   alphaFill);
-            p.Green() = wxPy_premultiply(green, alphaFill);
-            p.Blue()  = wxPy_premultiply(blue,  alphaFill);
-            p.Alpha() = alphaFill;
-            ++p;
+            p.MoveTo(pixData, x, 0);
+            p.Red()   = wxPy_premultiply(red,   alphaOutline);
+            p.Green() = wxPy_premultiply(green, alphaOutline);
+            p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
+            p.Alpha() = alphaOutline;
+            p.MoveTo(pixData, x, r.height-1);
+            p.Red()   = wxPy_premultiply(red,   alphaOutline);
+            p.Green() = wxPy_premultiply(green, alphaOutline);
+            p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
+            p.Alpha() = alphaOutline;
         }
-    }
-
-    // Set the outline pixels
-    ColourDesired cdo(outline.AsLong());
-    red   = cdo.GetRed();
-    green = cdo.GetGreen();
-    blue  = cdo.GetBlue();
-    for (x=0; x<r.width; x++) {
-        p.MoveTo(pixData, x, 0);
-        p.Red()   = wxPy_premultiply(red,   alphaOutline);
-        p.Green() = wxPy_premultiply(green, alphaOutline);
-        p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
-        p.Alpha() = alphaOutline;
-        p.MoveTo(pixData, x, r.height-1);
-        p.Red()   = wxPy_premultiply(red,   alphaOutline);
-        p.Green() = wxPy_premultiply(green, alphaOutline);
-        p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
-        p.Alpha() = alphaOutline;
-    }
 
-    for (y=0; y<r.height; y++) {
-        p.MoveTo(pixData, 0, y);
-        p.Red()   = wxPy_premultiply(red,   alphaOutline);
-        p.Green() = wxPy_premultiply(green, alphaOutline);
-        p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
-        p.Alpha() = alphaOutline;
-        p.MoveTo(pixData, r.width-1, y);
-        p.Red()   = wxPy_premultiply(red,   alphaOutline);
-        p.Green() = wxPy_premultiply(green, alphaOutline);
-        p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
-        p.Alpha() = alphaOutline;
+        for (y=0; y<r.height; y++) {
+            p.MoveTo(pixData, 0, y);
+            p.Red()   = wxPy_premultiply(red,   alphaOutline);
+            p.Green() = wxPy_premultiply(green, alphaOutline);
+            p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
+            p.Alpha() = alphaOutline;
+            p.MoveTo(pixData, r.width-1, y);
+            p.Red()   = wxPy_premultiply(red,   alphaOutline);
+            p.Green() = wxPy_premultiply(green, alphaOutline);
+            p.Blue()  = wxPy_premultiply(blue,  alphaOutline);
+            p.Alpha() = alphaOutline;
+        }
     }
 
     // Draw the bitmap