mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 04:39:22 +02:00
fpvectorial-html: Adds mathml embedding, fixes a wrong design in the sequential page rendering Y coord positioning, implements html header style
git-svn-id: trunk@46300 -
This commit is contained in:
parent
0c44221648
commit
0ed9a55069
@ -378,6 +378,10 @@ type
|
|||||||
EntityCanvasMinXY, EntityCanvasMaxXY: TPoint; // The size utilized in the canvas to draw this entity
|
EntityCanvasMinXY, EntityCanvasMaxXY: TPoint; // The size utilized in the canvas to draw this entity
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
TvEntityFeatures = record
|
||||||
|
DrawsUpwards: Boolean; // TvText, TvEmbeddedVectorialDoc, etc draws upwards, but in the future we might have entities drawing downwards
|
||||||
|
end;
|
||||||
|
|
||||||
{ Now all elements }
|
{ Now all elements }
|
||||||
|
|
||||||
{@@
|
{@@
|
||||||
@ -410,6 +414,7 @@ type
|
|||||||
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); virtual;
|
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); virtual;
|
||||||
function AdjustColorToBackground(AColor: TFPColor; ARenderInfo: TvRenderInfo): TFPColor;
|
function AdjustColorToBackground(AColor: TFPColor; ARenderInfo: TvRenderInfo): TFPColor;
|
||||||
function GetNormalizedPos(APage: TvVectorialPage; ANewMin, ANewMax: Double): T3DPoint;
|
function GetNormalizedPos(APage: TvVectorialPage; ANewMin, ANewMax: Double): T3DPoint;
|
||||||
|
function GetEntityFeatures: TvEntityFeatures; virtual;
|
||||||
function GenerateDebugTree(ADestRoutine: TvDebugAddItemProc; APageItem: Pointer): Pointer; virtual;
|
function GenerateDebugTree(ADestRoutine: TvDebugAddItemProc; APageItem: Pointer): Pointer; virtual;
|
||||||
class function GenerateDebugStrForFPColor(AColor: TFPColor): string;
|
class function GenerateDebugStrForFPColor(AColor: TFPColor): string;
|
||||||
end;
|
end;
|
||||||
@ -436,7 +441,8 @@ type
|
|||||||
elements might be able to override this setting. }
|
elements might be able to override this setting. }
|
||||||
Pen: TvPen;
|
Pen: TvPen;
|
||||||
constructor Create(APage: TvPage); override;
|
constructor Create(APage: TvPage); override;
|
||||||
procedure ApplyPenToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo);
|
procedure ApplyPenToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo); overload;
|
||||||
|
procedure ApplyPenToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo; APen: TvPen); overload;
|
||||||
procedure AssignPen(APen: TvPen);
|
procedure AssignPen(APen: TvPen);
|
||||||
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
|
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
|
||||||
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); override;
|
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); override;
|
||||||
@ -450,7 +456,8 @@ type
|
|||||||
elements might be able to override this setting. }
|
elements might be able to override this setting. }
|
||||||
Brush: TvBrush;
|
Brush: TvBrush;
|
||||||
constructor Create(APage: TvPage); override;
|
constructor Create(APage: TvPage); override;
|
||||||
procedure ApplyBrushToCanvas(ADest: TFPCustomCanvas);
|
procedure ApplyBrushToCanvas(ADest: TFPCustomCanvas); overload;
|
||||||
|
procedure ApplyBrushToCanvas(ADest: TFPCustomCanvas; ABrush: TvBrush); overload;
|
||||||
procedure AssignBrush(ABrush: TvBrush);
|
procedure AssignBrush(ABrush: TvBrush);
|
||||||
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
|
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
|
||||||
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); override;
|
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); override;
|
||||||
@ -464,7 +471,8 @@ type
|
|||||||
Font: TvFont;
|
Font: TvFont;
|
||||||
TextAnchor: TvTextAnchor;
|
TextAnchor: TvTextAnchor;
|
||||||
constructor Create(APage: TvPage); override;
|
constructor Create(APage: TvPage); override;
|
||||||
procedure ApplyFontToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo; AMulX: Double = 1.0);
|
procedure ApplyFontToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo; AMulX: Double = 1.0); overload;
|
||||||
|
procedure ApplyFontToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo; AFont: TvFont; AMulX: Double = 1.0); overload;
|
||||||
procedure AssignFont(AFont: TvFont);
|
procedure AssignFont(AFont: TvFont);
|
||||||
procedure Scale(ADeltaScaleX, ADeltaScaleY: Double); override;
|
procedure Scale(ADeltaScaleX, ADeltaScaleY: Double); override;
|
||||||
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
|
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
|
||||||
@ -480,6 +488,8 @@ type
|
|||||||
constructor Create(APage: TvPage); override;
|
constructor Create(APage: TvPage); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function GetCombinedStyle(AParent: TvEntityWithStyle): TvStyle;
|
function GetCombinedStyle(AParent: TvEntityWithStyle): TvStyle;
|
||||||
|
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
|
||||||
|
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TvClipMode = (vcmNonzeroWindingRule, vcmEvenOddRule);
|
TvClipMode = (vcmNonzeroWindingRule, vcmEvenOddRule);
|
||||||
@ -1173,7 +1183,8 @@ type
|
|||||||
{ Selection fields }
|
{ Selection fields }
|
||||||
SelectedElement: TvEntity;
|
SelectedElement: TvEntity;
|
||||||
// List of common styles, for conveniently finding them
|
// List of common styles, for conveniently finding them
|
||||||
StyleTextBody, StyleHeading1, StyleHeading2, StyleHeading3: TvStyle;
|
StyleTextBody, StyleHeading1, StyleHeading2, StyleHeading3,
|
||||||
|
StyleHeading4, StyleHeading5, StyleHeading6: TvStyle;
|
||||||
StyleTextBodyCentralized, StyleHeading1Centralized,
|
StyleTextBodyCentralized, StyleHeading1Centralized,
|
||||||
StyleHeading2Centralized, StyleHeading3Centralized: TvStyle;
|
StyleHeading2Centralized, StyleHeading3Centralized: TvStyle;
|
||||||
StyleBulletList, StyleNumberList : TvListStyle;
|
StyleBulletList, StyleNumberList : TvListStyle;
|
||||||
@ -2465,6 +2476,11 @@ begin
|
|||||||
Result.Z := (Z - APage.MinZ) * (ANewMax - ANewMin) / (APage.MaxZ - APage.MinZ) + ANewMin;
|
Result.Z := (Z - APage.MinZ) * (ANewMax - ANewMin) / (APage.MaxZ - APage.MinZ) + ANewMin;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TvEntity.GetEntityFeatures: TvEntityFeatures;
|
||||||
|
begin
|
||||||
|
Result.DrawsUpwards := True;
|
||||||
|
end;
|
||||||
|
|
||||||
function TvEntity.GenerateDebugTree(ADestRoutine: TvDebugAddItemProc;
|
function TvEntity.GenerateDebugTree(ADestRoutine: TvDebugAddItemProc;
|
||||||
APageItem: Pointer): Pointer;
|
APageItem: Pointer): Pointer;
|
||||||
var
|
var
|
||||||
@ -2508,9 +2524,15 @@ end;
|
|||||||
|
|
||||||
procedure TvEntityWithPen.ApplyPenToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo);
|
procedure TvEntityWithPen.ApplyPenToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo);
|
||||||
begin
|
begin
|
||||||
ADest.Pen.FPColor := AdjustColorToBackground(Pen.Color, ARenderInfo);
|
ApplyPenToCanvas(ADest, ARenderInfo, Pen);
|
||||||
ADest.Pen.Width := 1;//Pen.Width;
|
end;
|
||||||
ADest.Pen.Style := Pen.Style;
|
|
||||||
|
procedure TvEntityWithPen.ApplyPenToCanvas(ADest: TFPCustomCanvas;
|
||||||
|
ARenderInfo: TvRenderInfo; APen: TvPen);
|
||||||
|
begin
|
||||||
|
ADest.Pen.FPColor := AdjustColorToBackground(APen.Color, ARenderInfo);
|
||||||
|
ADest.Pen.Width := 1;//APen.Width;
|
||||||
|
ADest.Pen.Style := APen.Style;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TvEntityWithPen.AssignPen(APen: TvPen);
|
procedure TvEntityWithPen.AssignPen(APen: TvPen);
|
||||||
@ -2538,8 +2560,14 @@ end;
|
|||||||
|
|
||||||
procedure TvEntityWithPenAndBrush.ApplyBrushToCanvas(ADest: TFPCustomCanvas);
|
procedure TvEntityWithPenAndBrush.ApplyBrushToCanvas(ADest: TFPCustomCanvas);
|
||||||
begin
|
begin
|
||||||
ADest.Brush.FPColor := Brush.Color;
|
ApplyBrushToCanvas(ADest, Brush);
|
||||||
ADest.Brush.Style := Brush.Style;
|
end;
|
||||||
|
|
||||||
|
procedure TvEntityWithPenAndBrush.ApplyBrushToCanvas(ADest: TFPCustomCanvas;
|
||||||
|
ABrush: TvBrush);
|
||||||
|
begin
|
||||||
|
ADest.Brush.FPColor := ABrush.Color;
|
||||||
|
ADest.Brush.Style := ABrush.Style;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TvEntityWithPenAndBrush.AssignBrush(ABrush: TvBrush);
|
procedure TvEntityWithPenAndBrush.AssignBrush(ABrush: TvBrush);
|
||||||
@ -2580,7 +2608,14 @@ begin
|
|||||||
Font.Color := colBlack;
|
Font.Color := colBlack;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TvEntityWithPenBrushAndFont.ApplyFontToCanvas(ADest: TFPCustomCanvas; ARenderInfo: TvRenderInfo; AMulX: Double = 1.0);
|
procedure TvEntityWithPenBrushAndFont.ApplyFontToCanvas(ADest: TFPCustomCanvas;
|
||||||
|
ARenderInfo: TvRenderInfo; AMulX: Double = 1.0);
|
||||||
|
begin
|
||||||
|
ApplyFontToCanvas(ADest, ARenderInfo, Font, AMulX);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TvEntityWithPenBrushAndFont.ApplyFontToCanvas(ADest: TFPCustomCanvas;
|
||||||
|
ARenderInfo: TvRenderInfo; AFont: TvFont; AMulX: Double);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
{$ifdef USE_LCL_CANVAS}
|
{$ifdef USE_LCL_CANVAS}
|
||||||
@ -2589,20 +2624,20 @@ var
|
|||||||
//
|
//
|
||||||
LowerDim: T3DPoint;
|
LowerDim: T3DPoint;
|
||||||
begin
|
begin
|
||||||
ADest.Font.Size := Round(AmulX * Font.Size);
|
ADest.Font.Size := Round(AmulX * AFont.Size);
|
||||||
ADest.Font.Bold := Font.Bold;
|
ADest.Font.Bold := AFont.Bold;
|
||||||
ADest.Font.Italic := Font.Italic;
|
ADest.Font.Italic := AFont.Italic;
|
||||||
ADest.Font.Underline := Font.Underline;
|
ADest.Font.Underline := AFont.Underline;
|
||||||
{$IF (FPC_FULLVERSION<=20600) or (FPC_FULLVERSION=20602)}
|
{$IF (FPC_FULLVERSION<=20600) or (FPC_FULLVERSION=20602)}
|
||||||
ADest.Font.StrikeTrough := Font.StrikeThrough; //old version with typo
|
ADest.Font.StrikeTrough := AFont.StrikeThrough; //old version with typo
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
ADest.Font.StrikeThrough := Font.StrikeThrough;
|
ADest.Font.StrikeThrough := AFont.StrikeThrough;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
{$ifdef USE_LCL_CANVAS}
|
{$ifdef USE_LCL_CANVAS}
|
||||||
ALCLDest.Font.Orientation := Round(Font.Orientation * 16);
|
ALCLDest.Font.Orientation := Round(AFont.Orientation * 16);
|
||||||
{$endif}
|
{$endif}
|
||||||
ADest.Font.FPColor := AdjustColorToBackground(Font.Color, ARenderInfo);
|
ADest.Font.FPColor := AdjustColorToBackground(AFont.Color, ARenderInfo);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TvEntityWithPenBrushAndFont.AssignFont(AFont: TvFont);
|
procedure TvEntityWithPenBrushAndFont.AssignFont(AFont: TvFont);
|
||||||
@ -2670,6 +2705,19 @@ begin
|
|||||||
else Result := Style;
|
else Result := Style;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TvEntityWithStyle.Render(ADest: TFPCustomCanvas;
|
||||||
|
var ARenderInfo: TvRenderInfo; ADestX: Integer; ADestY: Integer;
|
||||||
|
AMulX: Double; AMulY: Double);
|
||||||
|
begin
|
||||||
|
inherited Render(ADest, ARenderInfo, ADestX, ADestY, AMulX, AMulY);
|
||||||
|
if (Style <> nil) then
|
||||||
|
begin
|
||||||
|
ApplyPenToCanvas(ADest, ARenderInfo, Style.Pen);
|
||||||
|
ApplyBrushToCanvas(ADest, Style.Brush);
|
||||||
|
ApplyFontToCanvas(ADest, ARenderInfo, Style.Font, AMulX);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TPath }
|
{ TPath }
|
||||||
|
|
||||||
constructor TPath.Create(APage: TvPage);
|
constructor TPath.Create(APage: TvPage);
|
||||||
@ -3337,10 +3385,13 @@ var
|
|||||||
i: Integer;
|
i: Integer;
|
||||||
lSize: TSize;
|
lSize: TSize;
|
||||||
lWidth, lHeight: Integer;
|
lWidth, lHeight: Integer;
|
||||||
|
lRenderInfo: TvRenderInfo;
|
||||||
{$ifdef USE_LCL_CANVAS}
|
{$ifdef USE_LCL_CANVAS}
|
||||||
ACanvas: TCanvas absolute ADest;
|
ACanvas: TCanvas absolute ADest;
|
||||||
{$endif}
|
{$endif}
|
||||||
begin
|
begin
|
||||||
|
inherited Render(ADest, lRenderInfo, 0, 0, 0, 0);
|
||||||
|
|
||||||
ALeft := X;
|
ALeft := X;
|
||||||
ATop := Y;
|
ATop := Y;
|
||||||
lWidth := 0;
|
lWidth := 0;
|
||||||
@ -3428,10 +3479,10 @@ begin
|
|||||||
Render_NextText_X := CoordToCanvasX(X)+XAnchorAdjustment;
|
Render_NextText_X := CoordToCanvasX(X)+XAnchorAdjustment;
|
||||||
ADest.TextOut(Render_NextText_X, Round(LowerDim.Y), lText);
|
ADest.TextOut(Render_NextText_X, Round(LowerDim.Y), lText);
|
||||||
|
|
||||||
CalcEntityCanvasMinMaxXY(ARenderInfo, Render_NextText_X, ADestY);
|
CalcEntityCanvasMinMaxXY(ARenderInfo, Render_NextText_X, Round(LowerDim.Y));
|
||||||
lTextSize := ACanvas.TextExtent(lText);
|
lTextSize := ACanvas.TextExtent(lText);
|
||||||
CalcEntityCanvasMinMaxXY(ARenderInfo, Render_NextText_X+lTextSize.cx,
|
CalcEntityCanvasMinMaxXY(ARenderInfo, Render_NextText_X+lTextSize.cx,
|
||||||
ADestY+lTextSize.cy);
|
Round(LowerDim.Y)+lTextSize.cy);
|
||||||
|
|
||||||
Render_NextText_X := Render_NextText_X + lTextSize.cx;
|
Render_NextText_X := Render_NextText_X + lTextSize.cx;
|
||||||
end;
|
end;
|
||||||
@ -5447,6 +5498,7 @@ var
|
|||||||
lText: TvText absolute lEntity;
|
lText: TvText absolute lEntity;
|
||||||
lPrevText: TvText = nil;
|
lPrevText: TvText = nil;
|
||||||
lFirstText: Boolean = True;
|
lFirstText: Boolean = True;
|
||||||
|
lResetOldStyle: Boolean = False;
|
||||||
begin
|
begin
|
||||||
// Don't call inherited Render(ADest, ARenderInfo, ADestX, ADestY, AMulX, AMulY);
|
// Don't call inherited Render(ADest, ARenderInfo, ADestX, ADestY, AMulX, AMulY);
|
||||||
lEntity := GetFirstEntity();
|
lEntity := GetFirstEntity();
|
||||||
@ -5454,6 +5506,14 @@ begin
|
|||||||
begin
|
begin
|
||||||
if lEntity is TvText then
|
if lEntity is TvText then
|
||||||
begin
|
begin
|
||||||
|
// Set the text style if not already set
|
||||||
|
lResetOldStyle := False;
|
||||||
|
if (Style <> nil) and (TvText(lEntity).Style = nil) then
|
||||||
|
begin
|
||||||
|
TvText(lEntity).Style := Style;
|
||||||
|
lResetOldStyle := True
|
||||||
|
end;
|
||||||
|
|
||||||
// Direct text position setting resets the auto-positioning
|
// Direct text position setting resets the auto-positioning
|
||||||
if (OldTextX <> lText.X) or (OldTextY <> lText.Y) then
|
if (OldTextX <> lText.X) or (OldTextY <> lText.Y) then
|
||||||
begin
|
begin
|
||||||
@ -5477,6 +5537,8 @@ begin
|
|||||||
|
|
||||||
lText.X := OldTextX;
|
lText.X := OldTextX;
|
||||||
lText.Y := OldTextY;
|
lText.Y := OldTextY;
|
||||||
|
if lResetOldStyle then
|
||||||
|
TvText(lEntity).Style := nil;
|
||||||
end;
|
end;
|
||||||
lEntity := GetNextEntity();
|
lEntity := GetNextEntity();
|
||||||
end;
|
end;
|
||||||
@ -6506,10 +6568,22 @@ end;
|
|||||||
|
|
||||||
procedure TvTextPageSequence.Render(ADest: TFPCustomCanvas; ADestX: Integer;
|
procedure TvTextPageSequence.Render(ADest: TFPCustomCanvas; ADestX: Integer;
|
||||||
ADestY: Integer; AMulX: Double; AMulY: Double);
|
ADestY: Integer; AMulX: Double; AMulY: Double);
|
||||||
|
|
||||||
|
function CoordToCanvasX(ACoord: Double): Integer;
|
||||||
|
begin
|
||||||
|
Result := Round(ADestX + AmulX * ACoord);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CoordToCanvasY(ACoord: Double): Integer;
|
||||||
|
begin
|
||||||
|
Result := Round(ADestY + AmulY * ACoord);
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
CurEntity: TvEntity;
|
CurEntity: TvEntity;
|
||||||
CurY: Integer = 0;
|
CurY: Integer = 0;
|
||||||
|
lBoundsLeft, lBoundsTop, lBoundsRight, lBoundsBottom: Double;
|
||||||
begin
|
begin
|
||||||
{$ifdef FPVECTORIAL_TOCANVAS_DEBUG}
|
{$ifdef FPVECTORIAL_TOCANVAS_DEBUG}
|
||||||
WriteLn(':>TvTextPageSequence.Render');
|
WriteLn(':>TvTextPageSequence.Render');
|
||||||
@ -6523,9 +6597,14 @@ begin
|
|||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
CurEntity := GetEntity(i);
|
CurEntity := GetEntity(i);
|
||||||
|
|
||||||
CurEntity.X := 0;
|
CurEntity.X := 0;
|
||||||
CurEntity.Y := 0;
|
CurEntity.Y := 0;
|
||||||
|
if CurEntity.GetEntityFeatures().DrawsUpwards then
|
||||||
|
begin
|
||||||
|
CurEntity.CalculateBoundingBox(ADest, lBoundsLeft, lBoundsTop, lBoundsRight, lBoundsBottom);
|
||||||
|
CurY := CurY + Abs(Round((lBoundsBottom - lBoundsTop) * AMulY));
|
||||||
|
end;
|
||||||
RenderInfo.BackgroundColor := BackgroundColor;
|
RenderInfo.BackgroundColor := BackgroundColor;
|
||||||
CurEntity.Render(ADest, RenderInfo, ADestX, CurY, AMulX, AMulY);
|
CurEntity.Render(ADest, RenderInfo, ADestX, CurY, AMulX, AMulY);
|
||||||
// Store the old position in X/Y but don't use it, we use this to debug out the position
|
// Store the old position in X/Y but don't use it, we use this to debug out the position
|
||||||
@ -6966,6 +7045,7 @@ begin
|
|||||||
lTextBody.Kind := vskTextBody;
|
lTextBody.Kind := vskTextBody;
|
||||||
lTextBody.Font.Size := 12;
|
lTextBody.Font.Size := 12;
|
||||||
lTextBody.Font.Name := 'Times New Roman';
|
lTextBody.Font.Name := 'Times New Roman';
|
||||||
|
lTextBody.Brush.Style := bsClear;
|
||||||
lTextBody.Alignment := vsaJustifed;
|
lTextBody.Alignment := vsaJustifed;
|
||||||
lTextBody.MarginTop := 0;
|
lTextBody.MarginTop := 0;
|
||||||
lTextBody.MarginBottom := 2.12;
|
lTextBody.MarginBottom := 2.12;
|
||||||
@ -6978,6 +7058,7 @@ begin
|
|||||||
lBaseHeading.Kind := vskHeading;
|
lBaseHeading.Kind := vskHeading;
|
||||||
lBaseHeading.Font.Size := 14;
|
lBaseHeading.Font.Size := 14;
|
||||||
lBaseHeading.Font.Name := 'Arial';
|
lBaseHeading.Font.Name := 'Arial';
|
||||||
|
lBaseHeading.Brush.Style := bsClear;
|
||||||
lBaseHeading.MarginTop := 4.23;
|
lBaseHeading.MarginTop := 4.23;
|
||||||
lBaseHeading.MarginBottom := 2.12;
|
lBaseHeading.MarginBottom := 2.12;
|
||||||
lBaseHeading.SetElements := [spbfFontSize, spbfFontName, sseMarginTop, sseMarginBottom];
|
lBaseHeading.SetElements := [spbfFontSize, spbfFontName, sseMarginTop, sseMarginBottom];
|
||||||
@ -6986,8 +7067,13 @@ begin
|
|||||||
lCurStyle.Name := 'Heading 1';
|
lCurStyle.Name := 'Heading 1';
|
||||||
lCurStyle.Parent := lBaseHeading;
|
lCurStyle.Parent := lBaseHeading;
|
||||||
lCurStyle.HeadingLevel := 1;
|
lCurStyle.HeadingLevel := 1;
|
||||||
lCurStyle.Font.Size := Round(1.15 * lBaseHeading.Font.Size);
|
|
||||||
lCurStyle.Font.Bold := True;
|
lCurStyle.Font.Bold := True;
|
||||||
|
case AFormat of
|
||||||
|
vfHTML: lCurStyle.Font.Size := 20;
|
||||||
|
else
|
||||||
|
lCurStyle.Font.Size := Round(1.15 * lBaseHeading.Font.Size);
|
||||||
|
end;
|
||||||
|
lCurStyle.Brush.Style := bsClear;
|
||||||
lCurStyle.SetElements := [spbfFontSize, spbfFontBold];
|
lCurStyle.SetElements := [spbfFontSize, spbfFontBold];
|
||||||
StyleHeading1 := lCurStyle;
|
StyleHeading1 := lCurStyle;
|
||||||
|
|
||||||
@ -6995,9 +7081,14 @@ begin
|
|||||||
lCurStyle.Name := 'Heading 2';
|
lCurStyle.Name := 'Heading 2';
|
||||||
lCurStyle.Parent := lBaseHeading;
|
lCurStyle.Parent := lBaseHeading;
|
||||||
lCurStyle.HeadingLevel := 2;
|
lCurStyle.HeadingLevel := 2;
|
||||||
lCurStyle.Font.Size := 14;
|
|
||||||
lCurStyle.Font.Bold := True;
|
lCurStyle.Font.Bold := True;
|
||||||
lCurStyle.Font.Italic := True;
|
case AFormat of
|
||||||
|
vfHTML: lCurStyle.Font.Size := 16;
|
||||||
|
else
|
||||||
|
lCurStyle.Font.Size := 14;
|
||||||
|
lCurStyle.Font.Italic := True;
|
||||||
|
end;
|
||||||
|
lCurStyle.Brush.Style := bsClear;
|
||||||
lCurStyle.SetElements := [spbfFontSize, spbfFontBold, spbfFontItalic];
|
lCurStyle.SetElements := [spbfFontSize, spbfFontBold, spbfFontItalic];
|
||||||
StyleHeading2 := lCurStyle;
|
StyleHeading2 := lCurStyle;
|
||||||
|
|
||||||
@ -7005,11 +7096,42 @@ begin
|
|||||||
lCurStyle.Name := 'Heading 3';
|
lCurStyle.Name := 'Heading 3';
|
||||||
lCurStyle.Parent := lBaseHeading;
|
lCurStyle.Parent := lBaseHeading;
|
||||||
lCurStyle.HeadingLevel := 3;
|
lCurStyle.HeadingLevel := 3;
|
||||||
lCurStyle.Font.Size := 14;
|
|
||||||
lCurStyle.Font.Bold := True;
|
lCurStyle.Font.Bold := True;
|
||||||
|
lCurStyle.Font.Size := 14;
|
||||||
|
lCurStyle.Brush.Style := bsClear;
|
||||||
lCurStyle.SetElements := [spbfFontSize, spbfFontName, spbfFontBold];
|
lCurStyle.SetElements := [spbfFontSize, spbfFontName, spbfFontBold];
|
||||||
StyleHeading3 := lCurStyle;
|
StyleHeading3 := lCurStyle;
|
||||||
|
|
||||||
|
lCurStyle := AddStyle();
|
||||||
|
lCurStyle.Name := 'Heading 4';
|
||||||
|
lCurStyle.Parent := lBaseHeading;
|
||||||
|
lCurStyle.HeadingLevel := 4;
|
||||||
|
lCurStyle.Font.Size := 12;
|
||||||
|
lCurStyle.Font.Bold := True;
|
||||||
|
lCurStyle.Brush.Style := bsClear;
|
||||||
|
lCurStyle.SetElements := [spbfFontSize, spbfFontName, spbfFontBold];
|
||||||
|
StyleHeading4 := lCurStyle;
|
||||||
|
|
||||||
|
lCurStyle := AddStyle();
|
||||||
|
lCurStyle.Name := 'Heading 5';
|
||||||
|
lCurStyle.Parent := lBaseHeading;
|
||||||
|
lCurStyle.HeadingLevel := 5;
|
||||||
|
lCurStyle.Font.Size := 10;
|
||||||
|
lCurStyle.Font.Bold := True;
|
||||||
|
lCurStyle.Brush.Style := bsClear;
|
||||||
|
lCurStyle.SetElements := [spbfFontSize, spbfFontName, spbfFontBold];
|
||||||
|
StyleHeading5 := lCurStyle;
|
||||||
|
|
||||||
|
lCurStyle := AddStyle();
|
||||||
|
lCurStyle.Name := 'Heading 6';
|
||||||
|
lCurStyle.Parent := lBaseHeading;
|
||||||
|
lCurStyle.HeadingLevel := 6;
|
||||||
|
lCurStyle.Font.Size := 8;
|
||||||
|
lCurStyle.Font.Bold := True;
|
||||||
|
lCurStyle.Brush.Style := bsClear;
|
||||||
|
lCurStyle.SetElements := [spbfFontSize, spbfFontName, spbfFontBold];
|
||||||
|
StyleHeading6 := lCurStyle;
|
||||||
|
|
||||||
// ---------------------------------
|
// ---------------------------------
|
||||||
// Centralized paragraph styles
|
// Centralized paragraph styles
|
||||||
// ---------------------------------
|
// ---------------------------------
|
||||||
@ -7086,18 +7208,21 @@ begin
|
|||||||
StyleTextSpanBold.Kind := vskTextSpan; // This implies this style should not be applied to Paragraphs
|
StyleTextSpanBold.Kind := vskTextSpan; // This implies this style should not be applied to Paragraphs
|
||||||
StyleTextSpanBold.Name := 'Bold';
|
StyleTextSpanBold.Name := 'Bold';
|
||||||
StyleTextSpanBold.Font.Bold := True;
|
StyleTextSpanBold.Font.Bold := True;
|
||||||
|
StyleTextSpanBold.Brush.Style := bsClear;
|
||||||
StyleTextSpanBold.SetElements := StyleTextSpanBold.SetElements + [spbfFontBold];
|
StyleTextSpanBold.SetElements := StyleTextSpanBold.SetElements + [spbfFontBold];
|
||||||
|
|
||||||
StyleTextSpanItalic := AddStyle();
|
StyleTextSpanItalic := AddStyle();
|
||||||
StyleTextSpanItalic.Kind := vskTextSpan; // This implies this style should not be applied to Paragraphs
|
StyleTextSpanItalic.Kind := vskTextSpan; // This implies this style should not be applied to Paragraphs
|
||||||
StyleTextSpanItalic.Name := 'Italic';
|
StyleTextSpanItalic.Name := 'Italic';
|
||||||
StyleTextSpanItalic.Font.Italic := True;
|
StyleTextSpanItalic.Font.Italic := True;
|
||||||
|
StyleTextSpanItalic.Brush.Style := bsClear;
|
||||||
StyleTextSpanItalic.SetElements := StyleTextSpanItalic.SetElements + [spbfFontItalic];
|
StyleTextSpanItalic.SetElements := StyleTextSpanItalic.SetElements + [spbfFontItalic];
|
||||||
|
|
||||||
StyleTextSpanUnderline := AddStyle();
|
StyleTextSpanUnderline := AddStyle();
|
||||||
StyleTextSpanUnderline.Kind := vskTextSpan; // This implies this style should not be applied to Paragraphs
|
StyleTextSpanUnderline.Kind := vskTextSpan; // This implies this style should not be applied to Paragraphs
|
||||||
StyleTextSpanUnderline.Name := 'Underline';
|
StyleTextSpanUnderline.Name := 'Underline';
|
||||||
StyleTextSpanUnderline.Font.Underline := True;
|
StyleTextSpanUnderline.Font.Underline := True;
|
||||||
|
StyleTextSpanUnderline.Brush.Style := bsClear;
|
||||||
StyleTextSpanUnderline.SetElements := StyleTextSpanUnderline.SetElements + [spbfFontUnderline];
|
StyleTextSpanUnderline.SetElements := StyleTextSpanUnderline.SetElements + [spbfFontUnderline];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ type
|
|||||||
function ReadHeaderFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
function ReadHeaderFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
||||||
function ReadParagraphFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
function ReadParagraphFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
||||||
function ReadSVGFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
function ReadSVGFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
||||||
|
function ReadMathFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
||||||
public
|
public
|
||||||
{ General reading methods }
|
{ General reading methods }
|
||||||
constructor Create; override;
|
constructor Create; override;
|
||||||
@ -67,6 +68,7 @@ begin
|
|||||||
'h1', 'h2', 'h3', 'h4', 'h5', 'h6': Result := ReadHeaderFromNode(ANode, AData, ADoc);
|
'h1', 'h2', 'h3', 'h4', 'h5', 'h6': Result := ReadHeaderFromNode(ANode, AData, ADoc);
|
||||||
'p': Result := ReadParagraphFromNode(ANode, AData, ADoc);
|
'p': Result := ReadParagraphFromNode(ANode, AData, ADoc);
|
||||||
'svg': Result := ReadSVGFromNode(ANode, AData, ADoc);
|
'svg': Result := ReadSVGFromNode(ANode, AData, ADoc);
|
||||||
|
'math': Result := ReadMathFromNode(ANode, AData, ADoc);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -85,9 +87,12 @@ begin
|
|||||||
lText := CurParagraph.AddText(lTextStr);
|
lText := CurParagraph.AddText(lTextStr);
|
||||||
lHeaderType := LowerCase(ANode.NodeName);
|
lHeaderType := LowerCase(ANode.NodeName);
|
||||||
case lHeaderType of
|
case lHeaderType of
|
||||||
'h1', 'h2': lText.Style := ADoc.StyleHeading1;
|
'h1': lText.Style := ADoc.StyleHeading1;
|
||||||
'h3', 'h4': lText.Style := ADoc.StyleHeading2;
|
'h2': lText.Style := ADoc.StyleHeading2;
|
||||||
'h5', 'h6': lText.Style := ADoc.StyleHeading3;
|
'h3': lText.Style := ADoc.StyleHeading3;
|
||||||
|
'h4': lText.Style := ADoc.StyleHeading4;
|
||||||
|
'h5': lText.Style := ADoc.StyleHeading5;
|
||||||
|
'h6': lText.Style := ADoc.StyleHeading6;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -125,6 +130,26 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TvHTMLVectorialReader.ReadMathFromNode(ANode: TDOMNode;
|
||||||
|
AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
|
||||||
|
var
|
||||||
|
CurSVG: TvEmbeddedVectorialDoc;
|
||||||
|
lText: TvText;
|
||||||
|
lDoc: TXMLDocument;
|
||||||
|
lImportedNode: TDOMNode;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
CurSVG := AData.AddEmbeddedVectorialDoc();
|
||||||
|
lDoc := TXMLDocument.Create;
|
||||||
|
try
|
||||||
|
lImportedNode := lDoc.ImportNode(ANode, True);
|
||||||
|
lDoc.AppendChild(lImportedNode);
|
||||||
|
CurSVG.Document.ReadFromXML(lDoc, vfMathML);
|
||||||
|
finally
|
||||||
|
lDoc.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TvHTMLVectorialReader.Create;
|
constructor TvHTMLVectorialReader.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
@ -186,6 +211,8 @@ begin
|
|||||||
lNodeValue := ANode.Attributes.Item[i].NodeValue;
|
lNodeValue := ANode.Attributes.Item[i].NodeValue;
|
||||||
end;}
|
end;}
|
||||||
|
|
||||||
|
AData.AddStandardTextDocumentStyles(vfHTML);
|
||||||
|
|
||||||
// ----------------
|
// ----------------
|
||||||
// Now process the elements
|
// Now process the elements
|
||||||
// ----------------
|
// ----------------
|
||||||
|
@ -31,6 +31,7 @@ type
|
|||||||
procedure AddNodeToFormula(ANode: TDOMNode; APage: TvVectorialPage; var AFormula: TvFormula);
|
procedure AddNodeToFormula(ANode: TDOMNode; APage: TvVectorialPage; var AFormula: TvFormula);
|
||||||
procedure ReadFormulaFromNodeChildren(ACurNode: TDOMNode; APage: TvVectorialPage; var AFormula: TvFormula);
|
procedure ReadFormulaFromNodeChildren(ACurNode: TDOMNode; APage: TvVectorialPage; var AFormula: TvFormula);
|
||||||
procedure ReadFromStream(AStream: TStream; AData: TvVectorialDocument); override;
|
procedure ReadFromStream(AStream: TStream; AData: TvVectorialDocument); override;
|
||||||
|
procedure ReadFromXML(Doc: TXMLDocument; AData: TvVectorialDocument); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -263,48 +264,54 @@ procedure TvMathMLVectorialReader.ReadFromStream(AStream: TStream;
|
|||||||
AData: TvVectorialDocument);
|
AData: TvVectorialDocument);
|
||||||
var
|
var
|
||||||
Doc: TXMLDocument;
|
Doc: TXMLDocument;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
// Read in xml file from the stream
|
||||||
|
ReadXMLFile(Doc, AStream);
|
||||||
|
ReadFromXML(Doc, AData);
|
||||||
|
finally
|
||||||
|
// finally, free the document
|
||||||
|
Doc.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TvMathMLVectorialReader.ReadFromXML(Doc: TXMLDocument;
|
||||||
|
AData: TvVectorialDocument);
|
||||||
|
var
|
||||||
lFirstLayer, lCurNode: TDOMNode;
|
lFirstLayer, lCurNode: TDOMNode;
|
||||||
lPage: TvVectorialPage;
|
lPage: TvVectorialPage;
|
||||||
lFormula: TvFormula;
|
lFormula: TvFormula;
|
||||||
lStr: DOMString;
|
lStr: DOMString;
|
||||||
begin
|
begin
|
||||||
try
|
{// Read the properties of the <svg> tag
|
||||||
// Read in xml file from the stream
|
AData.Width := StringWithUnitToFloat(Doc.DocumentElement.GetAttribute('width'));
|
||||||
ReadXMLFile(Doc, AStream);
|
AData.Height := StringWithUnitToFloat(Doc.DocumentElement.GetAttribute('height'));}
|
||||||
|
|
||||||
{// Read the properties of the <svg> tag
|
// Now process the elements inside the first layer
|
||||||
AData.Width := StringWithUnitToFloat(Doc.DocumentElement.GetAttribute('width'));
|
lFirstLayer := Doc.DocumentElement;
|
||||||
AData.Height := StringWithUnitToFloat(Doc.DocumentElement.GetAttribute('height'));}
|
lCurNode := lFirstLayer.FirstChild;
|
||||||
|
lPage := AData.AddPage();
|
||||||
// Now process the elements inside the first layer
|
lPage.Width := AData.Width;
|
||||||
lFirstLayer := Doc.DocumentElement;
|
lPage.Height := AData.Height;
|
||||||
lCurNode := lFirstLayer.FirstChild;
|
while Assigned(lCurNode) do
|
||||||
lPage := AData.AddPage();
|
begin
|
||||||
lPage.Width := AData.Width;
|
lStr := lCurNode.NodeName;
|
||||||
lPage.Height := AData.Height;
|
if lStr = 'mrow' then
|
||||||
while Assigned(lCurNode) do
|
|
||||||
begin
|
begin
|
||||||
lStr := lCurNode.NodeName;
|
lFormula := TvFormula.Create(lPage);
|
||||||
if lStr = 'mrow' then
|
ReadFormulaFromNodeChildren(lCurNode, lPage, lFormula);
|
||||||
begin
|
lPage.AddEntity(lFormula);
|
||||||
lFormula := TvFormula.Create(lPage);
|
end
|
||||||
ReadFormulaFromNodeChildren(lCurNode, lPage, lFormula);
|
else if lStr = 'mstack' then
|
||||||
lPage.AddEntity(lFormula);
|
begin
|
||||||
end
|
lFormula := TvVerticalFormulaStack.Create(lPage);
|
||||||
else if lStr = 'mstack' then
|
ReadFormulaFromNodeChildren(lCurNode, lPage, lFormula);
|
||||||
begin
|
lPage.AddEntity(lFormula);
|
||||||
lFormula := TvVerticalFormulaStack.Create(lPage);
|
end
|
||||||
ReadFormulaFromNodeChildren(lCurNode, lPage, lFormula);
|
else
|
||||||
lPage.AddEntity(lFormula);
|
raise Exception.Create(Format('[TvMathMLVectorialReader.ReadFromStream] Expected mrow or mstack, got %s', [lStr]));
|
||||||
end
|
|
||||||
else
|
|
||||||
raise Exception.Create(Format('[TvMathMLVectorialReader.ReadFromStream] Expected mrow or mstack, got %s', [lStr]));
|
|
||||||
|
|
||||||
lCurNode := lCurNode.NextSibling;
|
lCurNode := lCurNode.NextSibling;
|
||||||
end;
|
|
||||||
finally
|
|
||||||
// finally, free the document
|
|
||||||
Doc.Free;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user