Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
9a2d676
Added headings back
AdrianEPPlus May 27, 2026
843bc28
fixed some issues with headings.
AdrianEPPlus May 28, 2026
58d80a9
Perf fixes
swmal May 28, 2026
8bd3760
print titles progress
AdrianEPPlus May 28, 2026
d9d855f
Fix PDF rich text rendering; remove source workbook mutation in export
swmal Jun 2, 2026
631546b
Merged develop9 into testshaping-perf branch
swmal Jun 2, 2026
7cc305d
print titles progress
AdrianEPPlus Jun 2, 2026
245a66c
Merge branch 'textshaping-perf' of https://github.com/epplussoftware/…
AdrianEPPlus Jun 3, 2026
ca64ab0
fixed errors
AdrianEPPlus Jun 3, 2026
8cb5310
fixed wiriting negative pdf object references in font resource on page.
AdrianEPPlus Jun 3, 2026
9ab0fd1
Merge branch 'develop9' into feature/pdfheadings
AdrianEPPlus Jun 3, 2026
45ecf68
changed type
AdrianEPPlus Jun 3, 2026
f7e2250
Fixed duplication bug
OssianEPPlus Jun 3, 2026
9dc0822
Merge branch 'feature/pdfheadings' of https://github.com/EPPlusSoftwa…
OssianEPPlus Jun 3, 2026
21c4b06
Changed test name
OssianEPPlus Jun 3, 2026
d2c9e5c
Reverted tint change for pdf
OssianEPPlus Jun 3, 2026
e762f66
Fixed font dictionary setting wrong font name.
AdrianEPPlus Jun 4, 2026
0db239e
Added logging for trouble shooting
swmal Jun 4, 2026
dca477d
fixed more stuff with font dictionary adding wrong font name
AdrianEPPlus Jun 4, 2026
f478edc
print titles progress
AdrianEPPlus Jun 5, 2026
58c0e0f
Fixed performance issue with heading rendering
swmal Jun 8, 2026
7336c3a
print titles progress
AdrianEPPlus Jun 8, 2026
98d734c
Merge branch 'feature/pdfheadings' of https://github.com/epplussoftwa…
AdrianEPPlus Jun 8, 2026
4031bf5
fixed errors from merge
AdrianEPPlus Jun 8, 2026
0660489
Unittest for pdf added
swmal Jun 10, 2026
9248326
Added more unittests with improvment areas
swmal Jun 10, 2026
6be95c8
print titles fixes progress
AdrianEPPlus Jun 10, 2026
841d4cd
Merge branch 'feature/pdfheadings' of https://github.com/epplussoftwa…
AdrianEPPlus Jun 10, 2026
3fcca9a
One more commit
swmal Jun 10, 2026
e180d80
Merge branch 'feature/pdfheadings' of https://github.com/epplussoftwa…
AdrianEPPlus Jun 10, 2026
52ca0f3
progress
AdrianEPPlus Jun 10, 2026
1d22dc2
fixed more issues with print titles
AdrianEPPlus Jun 11, 2026
a94c11a
Made row headings less wide, changed to use DimensionByValue
AdrianEPPlus Jun 11, 2026
bcfb8b2
fixed a few issues.
AdrianEPPlus Jun 12, 2026
17b5df4
Fixed border rendering inside merged cells.
AdrianEPPlus Jun 15, 2026
89bf83f
Implemented conditional formatting for fills.
AdrianEPPlus Jun 15, 2026
b0d37f6
Added conditional formatting for text and borders.
AdrianEPPlus Jun 16, 2026
8497e9d
Changed unittest
swmal Jun 16, 2026
2620988
Merge branch 'feature/pdfheadings' of https://github.com/EPPlusSoftwa…
swmal Jun 16, 2026
59a569a
Made some changes to conditional formatting so formats get applied to…
AdrianEPPlus Jun 17, 2026
ec6eeb2
Fixed patternfills and DimensionByVisibility
swmal Jun 17, 2026
fae8130
Merge branch 'feature/pdfheadings' of https://github.com/EPPlusSoftwa…
swmal Jun 17, 2026
05fcfb0
Moving and restructing pdf code progress.
AdrianEPPlus Jun 18, 2026
949a2fd
Moving pdf code progress.
AdrianEPPlus Jun 22, 2026
a6b5508
Moving files progress
AdrianEPPlus Jun 23, 2026
b4c1779
Fixed more errors
AdrianEPPlus Jun 24, 2026
1ad8bcc
All errors has been slain.
AdrianEPPlus Jun 24, 2026
b9b1f69
Removed some unused code.
AdrianEPPlus Jun 25, 2026
818499f
test
AdrianEPPlus Jun 25, 2026
f4c6bf5
Updated todo.
AdrianEPPlus Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public void GenerateSvgForLineCharts()
}
}
[TestMethod]
public void GenerateSvgForLineCharts2()
public void GenerateSuperScript()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
using (var p = OpenTemplatePackage("Superscript.xlsx"))
Expand Down
1 change: 1 addition & 0 deletions src/EPPlus.Export.Pdf.Tests/EPPlus.Export.Pdf.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<ItemGroup>
<ProjectReference Include="..\..\..\EPPlus\src\EPPlusTest\EPPlus.Test.csproj" />
<ProjectReference Include="..\EPPlus.Export.Pdf\EPPlus.Export.Pdf.csproj" />
<ProjectReference Include="..\EPPlus\EPPlus.csproj" />
</ItemGroup>

<ItemGroup>
Expand Down
401 changes: 213 additions & 188 deletions src/EPPlus.Export.Pdf.Tests/PdfTests.cs

Large diffs are not rendered by default.

8 changes: 6 additions & 2 deletions src/EPPlus.Export.Pdf/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Date Author Change
*************************************************************************************************/
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;

// In SDK-style projects such as this one, several assembly attributes that were historically
// defined in this file are now automatically added during build and populated with
Expand All @@ -26,6 +27,9 @@ Date Author Change
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM.

[assembly: AllowPartiallyTrustedCallers]
[assembly: Guid("60855b7d-19da-4dfa-90b2-78231d227d65")]
[assembly: InternalsVisibleTo("EPPlus.Export.Pdf.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100dd3a3466a88cbf5d374fe992cec433c48022414fe96608933e8e36782001213dd31bc454dc6f962a54a3a76cfb9e03a32cd4c658ecd49d1a98709971a080ab92d5c5b65346155f8d6422db4ffbf662f78913996a9a8b78ee11ff3cda7e585208cd4468fb3201f15bbb1dfc45c120703c9d6ad495bb9de66893ae5ab5ac8f40dc")]
[assembly: InternalsVisibleTo("EPPlus, PublicKey=00240000048000009400000006020000002400005253413100040000010001002981343969ed86fe604c56a84c61e33109424ef07bb458ff12e9533c11ea23ac8ef7e014b2a2de4ceb5f7528f963c755fe9b32f09cc35d21de94319d2a952a6e663cd46d6d98465998c77b52093d4f17cdc20ec054751244696f08afa6f4417d85267b147b73b6a3f5e9015b9dfd3dcc3328ce63df53a7c08a5544c1526ea5a5")]
[assembly: InternalsVisibleTo("EPPlus.Export.Pdf.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100dd3a3466a88cbf5d374fe992cec433c48022414fe96608933e8e36782001213dd31bc454dc6f962a54a3a76cfb9e03a32cd4c658ecd49d1a98709971a080ab92d5c5b65346155f8d6422db4ffbf662f78913996a9a8b78ee11ff3cda7e585208cd4468fb3201f15bbb1dfc45c120703c9d6ad495bb9de66893ae5ab5ac8f40dc")]
//
[assembly: InternalsVisibleTo("EPPlus.PdfExportPerformance, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f5398d389a44aacee243c9e73152fae942e9ede958ebd4b06651a749e6b2c0395a66bc0fc133dce1cf83cd667fe8f761b433063e603968f12b0b17e474233410f8fe933853d2344e89526414ef65ed7236a7a5c012e30275ec30d7fb665dbe1bd3435439bec55f431b9e69e943294fd474942d6bcb431c94ef653cbeee5b8a9e")]
307 changes: 307 additions & 0 deletions src/EPPlus.Export.Pdf/DocumentObjects/ExcelPatternMask.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,307 @@
/*************************************************************************************************
Required Notice: Copyright (C) EPPlus Software AB.
This software is licensed under PolyForm Noncommercial License 1.0.0
and may only be used for noncommercial purposes
https://polyformproject.org/licenses/noncommercial/1.0.0/

A commercial license to use this software can be purchased at https://epplussoftware.com
*************************************************************************************************
Date Author Change
*************************************************************************************************
27/11/2025 EPPlus Software AB EPPlus 9
*************************************************************************************************/
using System.Collections.Generic;

namespace EPPlus.Export.Pdf.DocumentObjects
{
/// <summary>
/// The cell fill pattern types EPPlus renders in the PDF export, matching
/// the names of OfficeOpenXml.Style.ExcelFillStyle. The pattern geometry is
/// taken from how Microsoft Excel itself rasterises each pattern when it
/// exports to PDF (an 8x8 tile), NOT from the ECMA-376 ST_Shd masks. Excel
/// and ST_Shd only overlap for a few patterns; since the goal is visual
/// parity with Excel, Excel's own output is the reference.
/// </summary>
internal enum ExcelPatternMask
{
DarkGray,
MediumGray,
LightGray,
Gray125,
Gray0625,
DarkHorizontal,
DarkVertical,
DarkDown,
DarkUp,
DarkGrid,
DarkTrellis,
LightHorizontal,
LightVertical,
LightDown,
LightUp,
LightGrid,
LightTrellis,
}

/// <summary>
/// Reference catalog of the 8x8 cell fill pattern masks, transcribed from the
/// bitmaps Microsoft Excel produces when exporting each pattern fill to PDF.
///
/// IMPORTANT - polarity and orientation:
///
/// byte 1 == background == the cell fill background color.
/// byte 0 == foreground == the pattern color.
///
/// So it is the 0 cells that get painted with the foreground/pattern color,
/// matching the convention used by the ECMA ST_Shd reference data.
///
/// Row order matches the source bitmap exactly: row 0 is the TOP row. PDF
/// content streams have the origin at the bottom-left with y increasing
/// upward, so any comparison against rendered PDF output (or generation of a
/// PDF content stream) must mirror in y (row r maps to PDF y = 7 - r). That
/// y-flip is intentionally NOT applied here - the data is kept in bitmap
/// orientation and the flip is the responsibility of the render/diff step.
/// </summary>
internal static class ExcelPatternMaskData
{
private static readonly Dictionary<ExcelPatternMask, byte[,]> _masks = BuildMasks();

/// <summary>
/// Gets the 8x8 reference mask for the given pattern.
/// Indexed as [row, column] with row 0 = top, matching the source bitmap.
/// </summary>
/// <param name="pattern">The pattern to look up.</param>
/// <returns>An 8x8 matrix where 1 = background and 0 = foreground.</returns>
public static byte[,] GetMask(ExcelPatternMask pattern)
{
return _masks[pattern];
}

private static Dictionary<ExcelPatternMask, byte[,]> BuildMasks()
{
var masks = new Dictionary<ExcelPatternMask, byte[,]>();

// DarkGray (75 gray)
masks.Add(ExcelPatternMask.DarkGray, new byte[,]
{
{ 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0 },
});

// MediumGray (50 gray)
masks.Add(ExcelPatternMask.MediumGray, new byte[,]
{
{ 0, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 0, 1 },
{ 0, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 0, 1 },
{ 0, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 0, 1 },
{ 0, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 0, 1 },
});

// LightGray (25 gray)
masks.Add(ExcelPatternMask.LightGray, new byte[,]
{
{ 0, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 0, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
});

// Gray125 (12,5 gray)
masks.Add(ExcelPatternMask.Gray125, new byte[,]
{
{ 0, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 0, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
});

// Gray0625 (6,25 gray)
masks.Add(ExcelPatternMask.Gray0625, new byte[,]
{
{ 0, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
});

// DarkHorizontal (Horizontal stripe)
masks.Add(ExcelPatternMask.DarkHorizontal, new byte[,]
{
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
});

// DarkVertical (Vertical stripe)
masks.Add(ExcelPatternMask.DarkVertical, new byte[,]
{
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
});

// DarkDown (Reverse diagonal stripe)
masks.Add(ExcelPatternMask.DarkDown, new byte[,]
{
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 1, 1, 1 },
{ 1, 1, 0, 0, 0, 0, 1, 1 },
{ 1, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 1, 1, 1, 0, 0 },
{ 0, 0, 0, 1, 1, 1, 1, 0 },
});

// DarkUp (Diagonal stripe)
masks.Add(ExcelPatternMask.DarkUp, new byte[,]
{
{ 1, 1, 0, 0, 0, 0, 1, 1 },
{ 1, 0, 0, 0, 0, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 1, 1, 1, 1, 0 },
{ 0, 0, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 1, 1, 1, 0, 0, 0 },
{ 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 1 },
});

// DarkGrid (Diagonal crosshatch)
masks.Add(ExcelPatternMask.DarkGrid, new byte[,]
{
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 0, 0, 0, 0 },
});

// DarkTrellis (Thick diagonal crosshatch)
masks.Add(ExcelPatternMask.DarkTrellis, new byte[,]
{
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 0, 0, 0, 0, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 1, 1, 1, 0, 0 },
{ 0, 0, 0, 1, 1, 0, 0, 0 },
});

// LightHorizontal (Thin horizontal stripe)
masks.Add(ExcelPatternMask.LightHorizontal, new byte[,]
{
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
});

// LightVertical (Thin vertical stripe)
masks.Add(ExcelPatternMask.LightVertical, new byte[,]
{
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
});

// LightDown (Thin reverse diagonal stripe)
masks.Add(ExcelPatternMask.LightDown, new byte[,]
{
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 0, 1, 1 },
{ 1, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 1, 1, 1, 1, 1, 0 },
});

// LightUp (Thin diagonal stripe)
masks.Add(ExcelPatternMask.LightUp, new byte[,]
{
{ 1, 1, 1, 0, 0, 1, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 1, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 1, 1, 1, 1, 1, 1, 0 },
{ 1, 1, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 1, 1, 1, 0, 0, 1, 1 },
});

// LightGrid (Thin horizontal crosshatch)
masks.Add(ExcelPatternMask.LightGrid, new byte[,]
{
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 1, 1, 1, 1 },
});

// LightTrellis (Thin diagonal crosshatch)
masks.Add(ExcelPatternMask.LightTrellis, new byte[,]
{
{ 0, 0, 1, 0, 0, 1, 1, 1 },
{ 1, 0, 0, 0, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 1, 1, 1, 1 },
{ 0, 0, 1, 0, 0, 1, 1, 1 },
{ 0, 1, 1, 1, 0, 0, 1, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 1, 1, 1, 0, 0, 1, 0 },
});
return masks;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ Date Author Change
*************************************************************************************************
27/11/2025 EPPlus Software AB EPPlus 9
*************************************************************************************************/

namespace EPPlus.Export.Pdf.PdfObjects.PdfFonts
namespace EPPlus.Export.Pdf.DocumentObjects.Fonts
{
internal class CIDSystemInfo
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ Date Author Change
using System.Linq;
using System.Text;

namespace EPPlus.Export.Pdf.PdfObjects.PdfFonts
namespace EPPlus.Export.Pdf.DocumentObjects.Fonts
{
public enum CIDFontSubtype
internal enum CIDFontSubtype
{
CIDFontType0,
CIDFontType2
Expand Down Expand Up @@ -70,7 +70,6 @@ internal override string RenderDictionary()
}
if (Gids != null)
{
//var widthsStr = string.Join(" ", W.Select(w => w.ToString()).ToArray());
sb.AppendFormat($"\n /W [{BuildWidthsArray()}]");
}
if (DW2 != null)
Expand Down Expand Up @@ -107,7 +106,6 @@ internal override void RenderDictionary(BinaryWriter bw)
}
if (Gids != null)
{
//var widthsStr = string.Join(" ", W.Select(w => w.ToString()).ToArray());
sb.AppendFormat($"\n /W [ {BuildWidthsArray()} ]");
}
if (DW2 != null)
Expand All @@ -134,7 +132,6 @@ private string BuildWidthsArray()
{
var sortedGids = Gids.OrderBy(g => g).ToList();
var sb = new StringBuilder();

int i = 0;
while (i < sortedGids.Count)
{
Expand Down
Loading
Loading