FastReport_FMX_2.8.12/LibD28x64/fs_igraphicsrtti.pas
2024-07-06 22:41:12 +02:00

263 lines
8.8 KiB
ObjectPascal

{******************************************}
{ }
{ FastScript v1.9 }
{ Graphics.pas classes and functions }
{ }
{ (c) 2003-2007 by Alexander Tzyganenko, }
{ Fast Reports Inc }
{ }
{******************************************}
unit fs_igraphicsrtti;
interface
{$i fs.inc}
uses
SysUtils, Classes, fs_iinterpreter, fs_iclassesrtti{$IFDEF DELPHI16}, Controls{$ENDIF}
{$IFDEF CLX}
, QGraphics
{$ELSE}
, Graphics
{$ENDIF}
{$IFDEF Delphi16}
, System.Types
{$ENDIF};
type
{$i frxPlatformsAttribute.inc}
TfsGraphicsRTTI = class(TComponent); // fake component
implementation
type
THackGraphic = class(TGraphic)
end;
TFunctions = class(TfsRTTIModule)
private
function CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
function GetProp(Instance: TObject; ClassType: TClass;
const PropName: String): Variant;
procedure SetProp(Instance: TObject; ClassType: TClass;
const PropName: String; Value: Variant);
procedure GetColorProc(const Name: String);
public
constructor Create(AScript: TfsScript); override;
end;
{ TFunctions }
constructor TFunctions.Create(AScript: TfsScript);
begin
inherited Create(AScript);
with AScript do
begin
GetColorValues(GetColorProc);
{$IFDEF FPC}
AddEnumSet('TFontStyles', 'fsBold, fsItalic, fsStrikeout, fsUnderline');
{$ELSE}
AddEnumSet('TFontStyles', 'fsBold, fsItalic, fsUnderline, fsStrikeout');
{$ENDIF}
AddEnum('TFontPitch', 'fpDefault, fpVariable, fpFixed');
AddEnum('TPenStyle', 'psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear, psInsideFrame');
AddEnum('TPenMode', 'pmBlack, pmWhite, pmNop, pmNot, pmCopy, pmNotCopy, pmMergePenNot, ' +
'pmMaskPenNot, pmMergeNotPen, pmMaskNotPen, pmMerge, pmNotMerge, pmMask, pmNotMask, pmXor, pmNotXor');
AddEnum('TBrushStyle', 'bsSolid, bsClear, bsHorizontal, bsVertical, ' +
'bsFDiagonal, bsBDiagonal, bsCross, bsDiagCross');
with AddClass(TFont, 'TPersistent') do
AddConstructor('constructor Create', CallMethod);
with AddClass(TPen, 'TPersistent') do
AddConstructor('constructor Create', CallMethod);
with AddClass(TBrush, 'TPersistent') do
AddConstructor('constructor Create', CallMethod);
with AddClass(TCanvas, 'TPersistent') do
begin
AddConstructor('constructor Create', CallMethod);
AddMethod('procedure Draw(X, Y: Integer; Graphic: TGraphic)', CallMethod);
AddMethod('procedure Ellipse(X1, Y1, X2, Y2: Integer)', CallMethod);
AddMethod('procedure LineTo(X, Y: Integer)', CallMethod);
AddMethod('procedure MoveTo(X, Y: Integer)', CallMethod);
AddMethod('procedure Rectangle(X1, Y1, X2, Y2: Integer)', CallMethod);
AddMethod('procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer)', CallMethod);
AddMethod('procedure StretchDraw(X1, Y1, X2, Y2: Integer; Graphic: TGraphic)', CallMethod);
AddMethod('function TextHeight(const Text: string): Integer', CallMethod);
AddMethod('procedure TextOut(X, Y: Integer; const Text: string)', CallMethod);
AddMethod('function TextWidth(const Text: string): Integer', CallMethod);
{$IFNDEF CLX}
AddIndexProperty('Pixels', 'Integer, Integer', 'TColor', CallMethod);
{$ENDIF}
end;
with AddClass(TGraphic, 'TPersistent') do
begin
AddConstructor('constructor Create', CallMethod);
AddMethod('procedure LoadFromFile(const Filename: string)', CallMethod);
AddMethod('procedure SaveToFile(const Filename: string)', CallMethod);
AddProperty('Height', 'Integer', GetProp, SetProp);
AddProperty('Width', 'Integer', GetProp, SetProp);
end;
with AddClass(TPicture, 'TPersistent') do
begin
AddMethod('procedure LoadFromFile(const Filename: string)', CallMethod);
AddMethod('procedure SaveToFile(const Filename: string)', CallMethod);
AddProperty('Height', 'Integer', GetProp, nil);
AddProperty('Width', 'Integer', GetProp, nil);
end;
{$IFNDEF CROSS_COMPILE}
AddClass(TMetafile, 'TGraphic');
with AddClass(TMetafileCanvas, 'TCanvas') do
AddConstructor('constructor Create(AMetafile: TMetafile; ReferenceDevice: Integer)', CallMethod);
{$ENDIF}
with AddClass(TBitmap, 'TGraphic') do
AddProperty('Canvas', 'TCanvas', GetProp);
end;
end;
function TFunctions.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
var
_Canvas: TCanvas;
begin
Result := 0;
if ClassType = TFont then
begin
if MethodName = 'CREATE' then
Result := frxInteger(TFont(Instance).Create)
end
else if ClassType = TPen then
begin
if MethodName = 'CREATE' then
Result := frxInteger(TPen(Instance).Create)
end
else if ClassType = TBrush then
begin
if MethodName = 'CREATE' then
Result := frxInteger(TBrush(Instance).Create)
end
else if ClassType = TCanvas then
begin
_Canvas := TCanvas(Instance);
if MethodName = 'CREATE' then
Result := frxInteger(TCanvas(Instance).Create)
else if MethodName = 'DRAW' then
_Canvas.Draw(Caller.Params[0], Caller.Params[1], TGraphic(frxInteger(Caller.Params[2])))
else if MethodName = 'ELLIPSE' then
_Canvas.Ellipse(Caller.Params[0], Caller.Params[1], Caller.Params[2], Caller.Params[3])
else if MethodName = 'LINETO' then
_Canvas.LineTo(Caller.Params[0], Caller.Params[1])
else if MethodName = 'MOVETO' then
_Canvas.MoveTo(Caller.Params[0], Caller.Params[1])
else if MethodName = 'RECTANGLE' then
_Canvas.Rectangle(Caller.Params[0], Caller.Params[1], Caller.Params[2], Caller.Params[3])
else if MethodName = 'ROUNDRECT' then
_Canvas.RoundRect(Caller.Params[0], Caller.Params[1], Caller.Params[2], Caller.Params[3], Caller.Params[4], Caller.Params[5])
else if MethodName = 'STRETCHDRAW' then
_Canvas.StretchDraw(Rect(Caller.Params[0], Caller.Params[1], Caller.Params[2], Caller.Params[3]), TGraphic(frxInteger(Caller.Params[4])))
else if MethodName = 'TEXTHEIGHT' then
Result := _Canvas.TextHeight(Caller.Params[0])
else if MethodName = 'TEXTOUT' then
_Canvas.TextOut(Caller.Params[0], Caller.Params[1], Caller.Params[2])
else if MethodName = 'TEXTWIDTH' then
Result := _Canvas.TextWidth(Caller.Params[0])
{$IFNDEF CLX}
else if MethodName = 'PIXELS.GET' then
Result := _Canvas.Pixels[Caller.Params[0], Caller.Params[1]]
else if MethodName = 'PIXELS.SET' then
_Canvas.Pixels[Caller.Params[0], Caller.Params[1]] := Caller.Params[2]
{$ENDIF}
end
else if ClassType = TGraphic then
begin
if MethodName = 'CREATE' then
Result := frxInteger(THackGraphic(Instance).Create)
else if MethodName = 'LOADFROMFILE' then
TGraphic(Instance).LoadFromFile(Caller.Params[0])
else if MethodName = 'SAVETOFILE' then
TGraphic(Instance).SaveToFile(Caller.Params[0])
end
else if ClassType = TPicture then
begin
if MethodName = 'LOADFROMFILE' then
TPicture(Instance).LoadFromFile(Caller.Params[0])
else if MethodName = 'SAVETOFILE' then
TPicture(Instance).SaveToFile(Caller.Params[0])
end
{$IFNDEF CROSS_COMPILE}
else if ClassType = TMetafileCanvas then
begin
if MethodName = 'CREATE' then
Result := frxInteger(TMetafileCanvas(Instance).Create(TMetafile(frxInteger(Caller.Params[0])), Caller.Params[1]))
end
{$ENDIF}
end;
function TFunctions.GetProp(Instance: TObject; ClassType: TClass;
const PropName: String): Variant;
begin
Result := 0;
if ClassType = TGraphic then
begin
if PropName = 'HEIGHT' then
Result := TGraphic(Instance).Height
else if PropName = 'WIDTH' then
Result := TGraphic(Instance).Width
end
else if ClassType = TPicture then
begin
if PropName = 'HEIGHT' then
Result := TPicture(Instance).Height
else if PropName = 'WIDTH' then
Result := TPicture(Instance).Width
end
else if ClassType = TBitmap then
begin
if PropName = 'CANVAS' then
Result := frxInteger(TBitmap(Instance).Canvas)
end
end;
procedure TFunctions.SetProp(Instance: TObject; ClassType: TClass;
const PropName: String; Value: Variant);
begin
if ClassType = TGraphic then
begin
if PropName = 'HEIGHT' then
TGraphic(Instance).Height := Value
else if PropName = 'WIDTH' then
TGraphic(Instance).Width := Value
end
end;
procedure TFunctions.GetColorProc(const Name: String);
var
c: Integer;
begin
IdentToColor(Name, c);
Script.AddConst(Name, 'Integer', c);
end;
initialization
{$IFDEF Delphi16}
StartClassGroup(TControl);
ActivateClassGroup(TControl);
GroupDescendentsWith(TfsGraphicsRTTI, TControl);
{$ENDIF}
fsRTTIModules.Add(TFunctions);
finalization
fsRTTIModules.Remove(TFunctions);
end.