From 9cbce601c709dc301887316d8952567ceee341c2 Mon Sep 17 00:00:00 2001
From: scuri <scuri>
Date: Wed, 11 Aug 2010 18:59:02 +0000
Subject: #  Fixed: cdCanvasClear not considering the transparency of the
 background color in the GDI+ base driver and in the CD_GL driver. # Fixed:
 background transparency was not being considered when backopacity was set to
 OPAQUE after the background color was set in the GDI+ base driver.

---
 src/gdiplus/cdwinp.cpp | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

(limited to 'src/gdiplus')

diff --git a/src/gdiplus/cdwinp.cpp b/src/gdiplus/cdwinp.cpp
index db09cd6..522f136 100644
--- a/src/gdiplus/cdwinp.cpp
+++ b/src/gdiplus/cdwinp.cpp
@@ -139,9 +139,7 @@ static void sUpdateFillBrush(cdCtxCanvas* ctxcanvas)
     {
       // only stipple depends on Foreground and Background Color.
       if (ctxcanvas->canvas->interior_style == CD_STIPPLE)
-      {
         cdstipple(ctxcanvas, ctxcanvas->canvas->stipple_w, ctxcanvas->canvas->stipple_h, ctxcanvas->canvas->stipple);
-      }
       break;
     }
   }
@@ -158,18 +156,17 @@ static long int cdforeground(cdCtxCanvas* ctxcanvas, long int color)
   return color;
 }
 
-static Color sSetAlpha(const Color& c, BYTE alpha)
+static Color sTranspAlpha(const Color& c)
 {
-  return Color(alpha, c.GetRed(), c.GetGreen(), c.GetBlue());
+  return Color(0, c.GetRed(), c.GetGreen(), c.GetBlue());
 }
 
 static long int cdbackground(cdCtxCanvas* ctxcanvas, long int color)
 {
   ctxcanvas->bg = sColor2Windows(color);
 
-  if ((ctxcanvas->canvas->back_opacity == CD_TRANSPARENT) &&
-    (cdAlpha(ctxcanvas->canvas->background) == 255)) 
-    ctxcanvas->bg = sSetAlpha(ctxcanvas->bg, (BYTE)0);
+  if (ctxcanvas->canvas->back_opacity == CD_TRANSPARENT) 
+    ctxcanvas->bg = sTranspAlpha(ctxcanvas->bg);  /* set background as full transparent */
 
   sUpdateFillBrush(ctxcanvas);
 
@@ -181,10 +178,10 @@ static int cdbackopacity(cdCtxCanvas* ctxcanvas, int opacity)
   switch (opacity)
   {
   case CD_TRANSPARENT:
-    ctxcanvas->bg = sSetAlpha(ctxcanvas->bg, (BYTE)0);
+    ctxcanvas->bg = sTranspAlpha(ctxcanvas->bg);  /* set background as full transparent */
     break;
   case CD_OPAQUE:
-    ctxcanvas->bg = sSetAlpha(ctxcanvas->bg, (BYTE)255);
+    ctxcanvas->bg = sColor2Windows(ctxcanvas->canvas->background);
     break;
   }
 
@@ -1619,7 +1616,8 @@ static void cdclear(cdCtxCanvas* ctxcanvas)
   if (ctxcanvas->canvas->clip_mode != CD_CLIPOFF) 
     ctxcanvas->graphics->ResetClip();
   
-  ctxcanvas->graphics->Clear(sSetAlpha(ctxcanvas->bg, (BYTE)255));
+  /* do NOT use "ctxcanvas->bg" here, because it depends on backopacity */
+  ctxcanvas->graphics->Clear(sColor2Windows(ctxcanvas->canvas->background));
   
   if (ctxcanvas->canvas->clip_mode != CD_CLIPOFF) 
     cdclip(ctxcanvas, ctxcanvas->canvas->clip_mode);
@@ -2717,8 +2715,8 @@ cdCtxCanvas *cdwpCreateCanvas(cdCanvas* canvas, Graphics* graphics, int wtype)
 
   set_aa_attrib(ctxcanvas, "1");  // default is ANTIALIAS=1
 
-  ctxcanvas->fg = Color(); // black
-  ctxcanvas->bg = Color(255, 255, 255); // white
+  ctxcanvas->fg = Color(); // black,opaque
+  ctxcanvas->bg = Color(255, 255, 255); // white,opaque => used only for fill
 
   canvas->invert_yaxis = 1;
 
-- 
cgit v1.2.3