Browse Source

* fixed alphablending for drawing freetype fonts on transparent backgrounds
(patch by Darius Blaszijk, mantis #17736)

git-svn-id: trunk@16446 -

Jonas Maebe 14 years ago
parent
commit
eec6d74ac0

+ 17 - 0
packages/fcl-image/src/fpcolcnv.inc

@@ -296,6 +296,23 @@ begin
 end;
 *)
 
+function AlphaBlend(color1, color2: TFPColor): TFPColor;
+var
+  factor: single;
+begin
+  if color2.alpha = $ffff then
+    Result := color2
+  else
+  begin
+    factor := (color1.alpha / $ffff) * (1 - color2.alpha / $ffff);
+
+    Result.red := Round(color1.red * factor + color2.red * color2.alpha / $ffff);
+    Result.green := Round(color1.green * factor + color2.green * color2.alpha / $ffff);
+    Result.blue := Round(color1.blue * factor + color2.blue * color2.alpha / $ffff);
+    Result.alpha := Round(factor * $ffff + color2.alpha);
+  end;
+end;
+
 function CompareColors(const Color1, Color2: TFPColor): integer;
 begin
   Result:=integer(Color1.Red)-integer(Color2.Red);

+ 3 - 0
packages/fcl-image/src/fpimage.pp

@@ -266,6 +266,9 @@ function ConvertColorToData (const From : TDeviceColor; Fmt : TColorFormat) : TC
 function ConvertColor (const From : TFPColor; Fmt : TColorFormat) : TDeviceColor;
 function ConvertColor (const From : TDeviceColor; Fmt : TColorFormat) : TDeviceColor;
 *)
+
+function AlphaBlend(color1, color2: TFPColor): TFPColor;
+
 function FPColor (r,g,b,a:word) : TFPColor;
 function FPColor (r,g,b:word) : TFPColor;
 {$ifdef debug}function MakeHex (n:TColordata;nr:byte): string;{$endif}

+ 4 - 14
packages/fcl-image/src/ftfont.pp

@@ -263,21 +263,11 @@ const
 procedure TFreeTypeFont.DrawChar (x,y:integer; data:PByteArray; pitch, width, height:integer);
 
   procedure Combine (canv:TFPCustomCanvas; x,y:integer; c : TFPColor; t:longword);
-  var a,r,g,b:longword;
+  var
+    pixelcolor: TFPColor;
   begin
-    if t = 255 then
-      canv.colors[x,y] := c
-    else if t <> 0 then
-      begin
-      with canv.colors[x,y] do
-        begin
-        a := 255-t;
-        r := ((red * a) + (c.red * t)) div 255;
-        g := ((green * a) + (c.green * t)) div 255;
-        b := ((blue * a) + (c.blue * t)) div 255;
-        end;
-      canv.colors[x,y] := FPImage.FPColor(r,g,b,alphaOpaque);
-      end;
+    pixelcolor := AlphaBlend(canv.colors[x,y], FPImage.FPColor(c.red, c.green,c.blue, (t+1) shl 8 - 1));
+    canv.colors[x,y] := pixelcolor;
   end;
 
 var b,rx,ry : integer;