static class in de main
Code:
TComplex = class
public
type
TEllipseProc = procedure(dst: TBmp; x1, y1, x2, y2: integer; const lineColor, fillColor: TPixel; skipBorder: boolean; skipFill: boolean);
TFloodFillProc = procedure(dst: TBmp; x, y: Integer; aColor: TPixel);
strict private
class var EllipseProc: TEllipseProc;
class var FloodFillProc: TFloodFillProc;
public
class procedure RegisterEllipseProc(const proc: TEllipseProc); static;
class procedure RegisterFloodFillProc(const proc: TFloodFillProc); static;
public
class procedure DoEllipse(dst: TBmp; x1, y1, x2, y2: integer; const lineColor, fillColor: TPixel; skipBorder: boolean; skipFill: boolean); static;
class procedure DoFloodFill(dst: TBmp; x, y: Integer; aColor: TPixel); static;
end;
Code:
{ TComplex }
class procedure TComplex.RegisterEllipseProc(const proc: TEllipseProc);
begin
EllipseProc := proc;
end;
class procedure TComplex.RegisterFloodFillProc(const proc: TFloodFillProc);
begin
FloodFillProc := proc;
end;
class procedure TComplex.DoEllipse(dst: TBmp; x1, y1, x2, y2: integer; const lineColor, fillColor: TPixel; skipBorder, skipFill: boolean);
begin
if Assigned(EllipseProc) then
EllipseProc(dst, x1, y1, x2, y2, lineColor, fillColor, skipBorder, skipFill)
else begin
dst.Canvas.Pen.Color := lineColor.AsWinColor;
dst.Canvas.Ellipse(x1, y1, x2, y2);
end;
end;
class procedure TComplex.DoFloodFill(dst: TBmp; x, y: Integer; aColor: TPixel);
begin
if Assigned(FloodFillProc) then
FloodfillProc(dst, x, y, aColor)
else begin
dst.Backend.Canvas.Brush.Color := aColor.AsWinColor;
dst.Backend.Canvas.FloodFill(x, y, aColor.AsWinColor, TFillStyle.fsSurface);
end;
end;
Init vanuit externe unit
Code:
initialization
TComplex.RegisterEllipseProc(TEllipseDrawing.Ellipse);
De call vanuit main
Code:
procedure TBmp.Ellipse(x1, y1, x2, y2: integer; const color: TPixel);
begin
TComplex.DoEllipse(Self, x1, y1, x2, y2, color, 0, False, True);
end;
misschien zijn interfaces toch soms wel handig en ook een mogelijkheid :-)
met name de floodfill is 8x sneller dan de canvas versie.
Bookmarks