Skip to content

Commit 91b9b3f

Browse files
committed
Add per-workbook RenderContext on ExcelWorkbook and thread it through the SVG export pipeline for charts and shapes, replacing the global OpenTypeFonts singleton; split FontAvailability into a result enum plus RequireExactFont policy
2 parents 80c92b5 + 2dd0a5b commit 91b9b3f

133 files changed

Lines changed: 5862 additions & 8202 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/EPPlus.DrawingRenderer.Tests/Chart/LineChartToSvgTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public void GenerateSvgForLineCharts()
130130
}
131131

132132
[TestMethod]
133-
public void GenerateSvgForCharts_SecondaryAxis()
133+
public void GenerateSuperScript()
134134
{
135135
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
136136
using (var p = OpenTemplatePackage("ChartForSvg_SecondaryAxis.xlsx"))

src/EPPlus.DrawingRenderer.Tests/TestFontMeasurer.cs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,30 @@
44
using EPPlus.Fonts.OpenType.Utils;
55
using OfficeOpenXml.Interfaces.Drawing.Text;
66
using OfficeOpenXml.Interfaces.Fonts;
7+
using System.Drawing;
78

89
namespace TestProject1
910
{
1011
[TestClass]
1112
public class TestFontMeasurer
1213
{
14+
[TestInitialize]
15+
public void Setup()
16+
{
17+
_systemFolderEngine = new OpenTypeFontEngine(x => x.SearchSystemDirectories = true);
18+
}
19+
20+
[TestCleanup]
21+
public void Cleanup()
22+
{
23+
SystemFolderEngine.Dispose();
24+
_systemFolderEngine = null;
25+
}
26+
27+
private OpenTypeFontEngine? _systemFolderEngine;
28+
29+
private OpenTypeFontEngine SystemFolderEngine => _systemFolderEngine ?? new OpenTypeFontEngine(x => x.SearchSystemDirectories = true);
30+
1331
[TestMethod]
1432
public void CompareFontMeasurer3()
1533
{
@@ -20,7 +38,7 @@ public void CompareFontMeasurer3()
2038
Size = 72.0f,
2139
};
2240

23-
var handler = new TextHandler(mf);
41+
var handler = new TextHandler(SystemFolderEngine, mf);
2442

2543
var testStr = "Hello there⁴₂";
2644

@@ -56,7 +74,7 @@ public void TestWrapText()
5674
Style = MeasurementFontStyles.Regular
5775
};
5876

59-
var handler = new TextHandler(mf);
77+
var handler = new TextHandler(SystemFolderEngine, mf);
6078

6179
var strings = handler.WrapText(testStr, MaxPixelWidth.PixelToPoint());
6280

@@ -86,7 +104,7 @@ public void TestWrapTextLongContinous()
86104
Size = (float)fontSize,
87105
Style = MeasurementFontStyles.Regular
88106
};
89-
var handler = new TextHandler(mf);
107+
var handler = new TextHandler(SystemFolderEngine, mf);
90108

91109
var strings = handler.WrapText(testString, MaxPixelWidth.PixelToPoint());
92110

@@ -139,7 +157,7 @@ public void SpaceCase()
139157
Style = MeasurementFontStyles.Regular,
140158
Size = 11.0f,
141159
};
142-
var layout = OpenTypeFonts.GetTextLayoutEngineForFont(mf);
160+
var layout = SystemFolderEngine.GetTextLayoutEngineForFont(mf);
143161
var output = layout.WrapText(text, 11f, 39.4);
144162

145163
var shaper = OpenTypeFonts.GetShaperForFont(mf);
@@ -169,7 +187,7 @@ public void LoremIpsumTesting()
169187
Size = 11.0f,
170188
};
171189

172-
var handler = new TextHandler(mf);
190+
var handler = new TextHandler(SystemFolderEngine, mf);
173191
//float ptMax = 39.68503937007874015748031496063f;
174192
//float ptMax = 36.840393700787401574803149606299f - 1.5f;
175193
//float pixels = 53f;
@@ -232,7 +250,7 @@ public void WrapDifficultSpotSpace()
232250
Size = 11.0f,
233251
};
234252

235-
var handler = new TextHandler(mf);
253+
var handler = new TextHandler(SystemFolderEngine, mf);
236254

237255
var wrappedStrings = handler.WrapText(text, pointWidth);
238256

@@ -253,7 +271,7 @@ public void LoremIpsum20Paragraphs()
253271
Size = 11.0f,
254272
};
255273

256-
var handler = new TextHandler(mf);
274+
var handler = new TextHandler(SystemFolderEngine, mf);
257275

258276
double maxPixelWidth = 72d;
259277

@@ -300,7 +318,7 @@ public void LoremIpsum20ParagraphsMultipleFragments()
300318
Size = 11.0f,
301319
};
302320

303-
var handler = new TextHandler(mf);
321+
var handler = new TextHandler(SystemFolderEngine, mf);
304322

305323
double maxPixelWidth = 72d;
306324

src/EPPlus.DrawingRenderer/RenderItems/Textbox/ParagraphRenderItem.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,26 +134,30 @@ protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, b
134134
}
135135
}
136136

137-
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, bool setFallbackDefaultFont = true) : this(renderContext, parent, setFallbackDefaultFont)
137+
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, bool setFallbackDefaultFont = true)
138+
: this(renderContext, parent, setFallbackDefaultFont)
138139
{
139140
InitBasedOnParent(textBody);
140141
Bounds.Name = "Paragraph";
141142
}
142143

143-
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, string text, bool setFallbackDefaultFont = true) : this(renderContext, parent, textBody, setFallbackDefaultFont)
144+
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, string text, bool setFallbackDefaultFont = true)
145+
: this(renderContext, parent, textBody, setFallbackDefaultFont)
144146
{
145147
_lsMultiplier = 1d;
146148
ImportLinesAndTextRunsBase(text);
147149
}
148150

149-
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, IRichTextFormatSimple rtFormat) : this(renderContext, parent, textBody, false)
151+
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, IRichTextFormatSimple rtFormat)
152+
: this(renderContext, parent, textBody, false)
150153
{
151154
_lsMultiplier = 1d;
152155
DefaultParagraphFont = new FontFormatBase(rtFormat.Family, rtFormat.SubFamily, rtFormat.Size);
153156
AddRichText(rtFormat);
154157
}
155158

156-
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, IRichTextFormatDrawing rtFormat) : this(renderContext, parent, textBody, false)
159+
protected ParagraphRenderItem(RenderContext renderContext, BoundingBox parent, RenderTextBody textBody, IRichTextFormatDrawing rtFormat)
160+
: this(renderContext, parent, textBody, false)
157161
{
158162
AddRichText(rtFormat);
159163
}
@@ -203,7 +207,7 @@ TextLineCollection WrapFragmentsToLines(List<ITextFragmentBase>? fragments = nul
203207
{
204208
//This is highly innefficent. Really, LayoutSystem should be
205209
//Holding the fragments from the start/wrapping should only be done when textFragments are fully complete
206-
_layoutSystem = new LayoutSystem(OpenTypeFonts.GetDefaultEngine(), _textFragments);
210+
_layoutSystem = new LayoutSystem(RenderContext.FontEngine, _textFragments);
207211

208212
//if (fragments == null && _layoutSystem == null)
209213
//{

src/EPPlus.Export.Pdf.Tests/EPPlus.Export.Pdf.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<ItemGroup>
1919
<ProjectReference Include="..\..\..\EPPlus\src\EPPlusTest\EPPlus.Test.csproj" />
2020
<ProjectReference Include="..\EPPlus.Export.Pdf\EPPlus.Export.Pdf.csproj" />
21+
<ProjectReference Include="..\EPPlus\EPPlus.csproj" />
2122
</ItemGroup>
2223

2324
<ItemGroup>

0 commit comments

Comments
 (0)