|
@@ -21,7 +21,7 @@ TYPE
|
|
VAR
|
|
VAR
|
|
lineWidth-: REAL; (** line width in pixels *)
|
|
lineWidth-: REAL; (** line width in pixels *)
|
|
capType-: LONGINT; (** line cap type *)
|
|
capType-: LONGINT; (** line cap type *)
|
|
-
|
|
|
|
|
|
+
|
|
srcOverDstMode: Raster.Mode;
|
|
srcOverDstMode: Raster.Mode;
|
|
pixAlphaMap: ARRAY 256 OF Raster.Pixel;
|
|
pixAlphaMap: ARRAY 256 OF Raster.Pixel;
|
|
|
|
|
|
@@ -43,11 +43,13 @@ TYPE
|
|
PROCEDURE SetColor(x: WMGraphics.Color);
|
|
PROCEDURE SetColor(x: WMGraphics.Color);
|
|
VAR
|
|
VAR
|
|
i: LONGINT;
|
|
i: LONGINT;
|
|
|
|
+ s: LONGINT;
|
|
r, g, b, a: LONGINT;
|
|
r, g, b, a: LONGINT;
|
|
BEGIN
|
|
BEGIN
|
|
SetColor^(x);
|
|
SetColor^(x);
|
|
WMGraphics.ColorToRGBA(color,r,g,b,a);
|
|
WMGraphics.ColorToRGBA(color,r,g,b,a);
|
|
- FOR i := 0 TO 255 DO Raster.SetRGBA(pixAlphaMap[i],r,g,b,255-i); END;
|
|
|
|
|
|
+ s := (256 * a) DIV 255;
|
|
|
|
+ FOR i := 0 TO 255 DO Raster.SetRGBA(pixAlphaMap[i],r,g,b,a - (s*i+128) DIV 256); END;
|
|
END SetColor;
|
|
END SetColor;
|
|
|
|
|
|
(**
|
|
(**
|
|
@@ -58,7 +60,7 @@ TYPE
|
|
IF w < 0.5 THEN w := 0.5; END;
|
|
IF w < 0.5 THEN w := 0.5; END;
|
|
lineWidth := w;
|
|
lineWidth := w;
|
|
END SetLineWidth;
|
|
END SetLineWidth;
|
|
-
|
|
|
|
|
|
+
|
|
(**
|
|
(**
|
|
Setup line cap type
|
|
Setup line cap type
|
|
*)
|
|
*)
|
|
@@ -197,6 +199,12 @@ TYPE
|
|
dx := x1 - x0;
|
|
dx := x1 - x0;
|
|
dy := y1 - y0;
|
|
dy := y1 - y0;
|
|
|
|
|
|
|
|
+ IF dx < 0 THEN
|
|
|
|
+ x0 := x0 + dx; x1 := x1 - dx;
|
|
|
|
+ y0 := y0 + dy; y1 := y1 - dy;
|
|
|
|
+ dx := -dx; dy := -dy;
|
|
|
|
+ END;
|
|
|
|
+
|
|
IF ABS(dy) > ABS(dx) THEN (* slope > 1 *)
|
|
IF ABS(dy) > ABS(dx) THEN (* slope > 1 *)
|
|
v := x0; x0 := y0; y0 := v;
|
|
v := x0; x0 := y0; y0 := v;
|
|
v := x1; x1 := y1; y1 := v;
|
|
v := x1; x1 := y1; y1 := v;
|
|
@@ -298,7 +306,7 @@ TYPE
|
|
END;
|
|
END;
|
|
|
|
|
|
END ThinSmoothLineReal;
|
|
END ThinSmoothLineReal;
|
|
-
|
|
|
|
|
|
+
|
|
(**
|
|
(**
|
|
Draw a thick (>1 pixel wide) antialiased line defined by starting and ending points with real coordinates
|
|
Draw a thick (>1 pixel wide) antialiased line defined by starting and ending points with real coordinates
|
|
|
|
|
|
@@ -308,7 +316,7 @@ TYPE
|
|
pixAlphaMap: pixel map for 256 alpha values for a given line color
|
|
pixAlphaMap: pixel map for 256 alpha values for a given line color
|
|
srcOverDstMode: raster mode corresponding to source over destination transfer (use Raster.InitMode(srcOverDstMode,Raster.srcOverDst);)
|
|
srcOverDstMode: raster mode corresponding to source over destination transfer (use Raster.InitMode(srcOverDstMode,Raster.srcOverDst);)
|
|
lineWidth: real-value line width
|
|
lineWidth: real-value line width
|
|
-
|
|
|
|
|
|
+
|
|
REMARK:
|
|
REMARK:
|
|
In this code the signed distance function is defined as: sdist(x,y) = (dx*(y-y0) - dy*(x-x0)) / sqrt(dx*dx+dy*dy), where dx = x1-x0, dy = y1-y0
|
|
In this code the signed distance function is defined as: sdist(x,y) = (dx*(y-y0) - dy*(x-x0)) / sqrt(dx*dx+dy*dy), where dx = x1-x0, dy = y1-y0
|
|
|
|
|
|
@@ -329,6 +337,12 @@ TYPE
|
|
dx := x1 - x0;
|
|
dx := x1 - x0;
|
|
dy := y1 - y0;
|
|
dy := y1 - y0;
|
|
|
|
|
|
|
|
+ IF dx < 0 THEN
|
|
|
|
+ x0 := x0 + dx; x1 := x1 - dx;
|
|
|
|
+ y0 := y0 + dy; y1 := y1 - dy;
|
|
|
|
+ dx := -dx; dy := -dy;
|
|
|
|
+ END;
|
|
|
|
+
|
|
IF ABS(dy) > ABS(dx) THEN (* slope > 1 *)
|
|
IF ABS(dy) > ABS(dx) THEN (* slope > 1 *)
|
|
v := x0; x0 := y0; y0 := v;
|
|
v := x0; x0 := y0; y0 := v;
|
|
v := x1; x1 := y1; y1 := v;
|
|
v := x1; x1 := y1; y1 := v;
|