Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions demos/FreeTypeDemo/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,15 @@ static void Core(string fileName, string[] fontNames, Func<string, FreeTypeFont>
{
yield return (DefaultFonts.SansSerif , "Helvetica");
yield return (DefaultFonts.SansSerifBold , "Helvetica (bold)");
yield return (DefaultFonts.SansSerifItalic , "Helvetica (italic)");
yield return (DefaultFonts.SansSerifBoldItalic, "Helvetica (bold, italic)");
yield return (DefaultFonts.Serif , "DejaVu Serif");
yield return (DefaultFonts.SerifBold , "DejaVu Serif (bold)");
yield return (DefaultFonts.SerifItalic , "DejaVu Serif (italic)");
yield return (DefaultFonts.SerifBoldItalic , "DejaVu Serif (bold, italic)");
yield return (DefaultFonts.MonoSpace , "Source Code Pro (monospace)");
yield return (DefaultFonts.MonoSpaceBold , "Source Code Pro (monospace, bold)");
yield return (DefaultFonts.MonoSpaceItalic , "Source Code Pro (monospace, italic)");
yield return (DefaultFonts.MonoSpaceBoldItalic, "Source Code Pro (monospace, bold, italic)");
}
}
Expand Down
4 changes: 4 additions & 0 deletions demos/PangoDemo/PangoDemo.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@
<ProjectReference Include="..\..\source\CairoSharp.Extensions\CairoSharp.Extensions.csproj" />
</ItemGroup>

<ItemGroup>
<Content Include="..\FreeTypeDemo\fonts\SanRemo.ttf" Link="fonts\SanRemo.ttf" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

</Project>
280 changes: 273 additions & 7 deletions demos/PangoDemo/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Cairo.Extensions.Pango;
using Cairo.Fonts;
using Cairo.Surfaces.PDF;
using Cairo.Surfaces.Recording;
using Cairo.Surfaces.SVG;
using Cairo.Surfaces.Tee;
using IOPath = System.IO.Path;
Expand All @@ -21,6 +22,7 @@
PangoNative.LibPangoName => IOPath.Combine(@"C:\Program Files\msys64\ucrt64\bin", "libpango-1.0-0.dll"),
PangoNative.LibPangoCairoName => IOPath.Combine(@"C:\Program Files\msys64\ucrt64\bin", "libpangocairo-1.0-0.dll"),
PangoNative.LibGObjectName => IOPath.Combine(@"C:\Program Files\msys64\ucrt64\bin", "libgobject-2.0-0.dll"),
PangoNative.LibGLibName => IOPath.Combine(@"C:\Program Files\msys64\ucrt64\bin", "libglib-2.0-0.dll"),
_ => null
};

Expand All @@ -37,11 +39,15 @@
Directory.CreateDirectory("output");
Environment.CurrentDirectory = IOPath.Combine(Environment.CurrentDirectory, "output");

DemoComparisonWithCairoText();
DemoFromPangoDocsWithTextAroundCircle();
DemoPangoFeatures();
ComparisonWithCairoTextDemo();
FontSelectionDemo();
PangoDocsDemoWithTextAroundCircle();
PangoFeaturesDemo();
FontMapDemo();
RecordingSurfaceDemo();
FontListDemo();
//-----------------------------------------------------------------------------
static void DemoComparisonWithCairoText()
static void ComparisonWithCairoTextDemo()
{
const int Width = 600;
const int Height = 150;
Expand Down Expand Up @@ -103,7 +109,60 @@ static void DemoComparisonWithCairoText()
tee.WriteToPng("cairo_comparison.png");
}
//-----------------------------------------------------------------------------
static void DemoFromPangoDocsWithTextAroundCircle()
static void FontSelectionDemo()
{
const int Width = 800;
const int Height = 100;
const string Text = "Hello from CairoSharp, w/o any AV and VA";

using SvgSurface svg = new("font-selection.svg", Width, Height);
using PdfSurface pdf = new("font-selection.pdf", Width, Height);
using TeeSurface tee = new(svg);
using CairoContext cr = new(tee);
tee.Add(pdf);

cr.Color = KnownColors.White;
cr.Paint();
cr.LineWidth = 6;
cr.Color = Color.Default;
cr.Rectangle(0, 0, Width, Height);
cr.Stroke();
cr.LineWidth = 1;

double curY = 10;
using PangoLayout pangoLayout = new(cr);

cr.MoveTo(10, curY);
pangoLayout.SetText($"{Text} (Pango font from string)");
string? fontDescriptionAsString = pangoLayout.SetFontDescriptionFromString("DejaVu Serif, Normal 22");
Console.WriteLine(fontDescriptionAsString);
pangoLayout.ShowLayout();
pangoLayout.GetSize(out double width, out double height);

curY += height;
cr.MoveTo(10, curY);
using PangoFontMap fontMap = PangoFontMap.CairoFontMapGetDefault();
using PangoFontFamily fontFamily = fontMap.GetFamily("DejaVu Serif");
using PangoFontFace? fontFace = fontFamily.GetFace(null);
Debug.Assert(fontFace is not null);
pangoLayout.SetText($"{Text} (Pango font selected)");
fontDescriptionAsString = pangoLayout.SetFontDescription(fontFace, size: 22);
Console.WriteLine(fontDescriptionAsString);
pangoLayout.ShowLayout();
pangoLayout.GetSize(out width, out height);
curY += height;

cr.SelectFontFace("DejaVu Serif");
cr.SetFontSize(22);
cr.FontExtents(out FontExtents fontExtents);
curY += fontExtents.Ascent;
cr.MoveTo(10, curY);
cr.ShowText($"{Text} (cairo)");

tee.WriteToPng("font-selection.png");
}
//-----------------------------------------------------------------------------
static void PangoDocsDemoWithTextAroundCircle()
{
// Demo from https://docs.gtk.org/PangoCairo/pango_cairo.html

Expand Down Expand Up @@ -161,7 +220,7 @@ static void DemoFromPangoDocsWithTextAroundCircle()
tee.WriteToPng("sample_from_docs.png");
}
//-----------------------------------------------------------------------------
static void DemoPangoFeatures()
static void PangoFeaturesDemo()
{
const int Width = 600;
const int Height = 620;
Expand Down Expand Up @@ -278,7 +337,7 @@ static void DemoPangoFeatures()
{
cr.Color = KnownColors.DeepSkyBlue;
cr.MoveTo(10, curY);
pangoLayout.SetText("Another long text, to showcase how justify works. And as we get on at least one more line, we can test next how JustifyLastLine works.");
pangoLayout.SetMarkup("Another long text, to showcase how <tt>Justify</tt> works. And as we get on at least one more line, we can test next how <tt>JustifyLastLine</tt> works."u8);
pangoLayout.ShowLayout();

pangoLayout.GetSize(out width, out height);
Expand Down Expand Up @@ -347,3 +406,210 @@ static void DemoPangoFeatures()

tee.WriteToPng("features.png");
}
//-----------------------------------------------------------------------------
static void FontMapDemo()
{
Console.WriteLine();
using StreamWriter sw = File.CreateText("font-families.csv");
sw.WriteLine("Name;IsMonospace;IsVariable");

using PangoFontMap fontMap = PangoFontMap.CairoFontMapGetDefault();
fontMap.AddFontFile(IOPath.Combine(AppContext.BaseDirectory, "fonts", "SanRemo.ttf"));

List<PangoFontFamily> families = [];
foreach (PangoFontFamily fontFamily in fontMap.ListFamilies())
{
families.Add(fontFamily);
}

string fontFamilyName = "";
foreach (PangoFontFamily fontFamily in families.OrderBy(f => f.Name))
{
fontFamilyName = fontFamily.Name;

sw.WriteLine($"{fontFamilyName};{fontFamily.IsMonospace};{fontFamily.IsVariable}");
Console.WriteLine(fontFamily);
Console.WriteLine("Faces:");

foreach (PangoFontFace fontFace in fontFamily.ListFaces())
{
Console.WriteLine($"\t{fontFace.Name}\tsynthesized: {fontFace.IsSynthesized}");
Console.WriteLine("\tSizes:");

foreach (double size in fontFace.ListSizes())
{
Console.WriteLine($"\t\t{size}");
}
}

Console.WriteLine();
}

const int Width = 600;
const int Height = 120;

using SvgSurface svg = new("font-map.svg", Width, Height);
using PdfSurface pdf = new("font-map.pdf", Width, Height);
using TeeSurface tee = new(svg);
using CairoContext cr = new(tee);
tee.Add(pdf);

using PangoLayout pangoLayout = new(cr);
double curY = 10;

cr.MoveTo(10, curY);
pangoLayout.SetFontDescriptionFromString($"{fontFamilyName} Normal 22");
pangoLayout.SetText($"Font: {fontFamilyName}");
pangoLayout.ShowLayout();
pangoLayout.GetSize(out double width, out double height);
curY += height;

cr.MoveTo(10, curY);
pangoLayout.SetFontDescriptionFromString("Viner Hand ITC, Normal 22");
pangoLayout.SetText("Font: Viner Hand ITC");
pangoLayout.ShowLayout();
pangoLayout.GetSize(out width, out height);
curY += height;

cr.MoveTo(10, curY);
pangoLayout.SetFontDescriptionFromString("San Remo, Normal 22");
pangoLayout.SetText("Font: San Remo");
pangoLayout.ShowLayout();
pangoLayout.GetSize(out width, out height);
curY += height;

tee.WriteToPng("font-map.png");

families.ForEach(f => f.Dispose());
}
//-----------------------------------------------------------------------------
static void RecordingSurfaceDemo()
{
using PangoFontMap fontMap = PangoFontMap.CairoFontMapGetDefault();
fontMap.AddFontFile(IOPath.Combine(AppContext.BaseDirectory, "fonts", "SanRemo.ttf"));

List<PangoFontFamily> families = [];
foreach (PangoFontFamily fontFamily in fontMap.ListFamilies())
{
families.Add(fontFamily);
}

string fontFamilyName = "";
foreach (PangoFontFamily fontFamily in families.OrderBy(f => f.Name))
{
fontFamilyName = fontFamily.Name;
}

using RecordingSurface surface = new();
using (CairoContext cr = new(surface))
{
using PangoLayout pangoLayout = new(cr);
double curY = 10;

cr.MoveTo(10, curY);
pangoLayout.SetFontDescriptionFromString($"{fontFamilyName} Normal 22");
pangoLayout.SetText($"Font: {fontFamilyName}");
pangoLayout.ShowLayout();
pangoLayout.GetSize(out double width, out double height);
curY += height;

cr.MoveTo(10, curY);
pangoLayout.SetFontDescriptionFromString("Viner Hand ITC, Normal 22");
pangoLayout.SetText("Font: Viner Hand ITC");
pangoLayout.ShowLayout();
pangoLayout.GetSize(out width, out height);
curY += height;

cr.MoveTo(10, curY);
pangoLayout.SetFontDescriptionFromString("San Remo, Normal 22");
pangoLayout.SetText("Font: San Remo");
pangoLayout.ShowLayout();
pangoLayout.GetSize(out width, out height);
curY += height;
}

Rectangle recordingExtents = surface.GetInkExtents();
const int Padding = 10;

using SvgSurface svg = new("recording.svg", recordingExtents.Width + 2 * Padding, recordingExtents.Height + 2 * Padding);
using PdfSurface pdf = new("recording.pdf", recordingExtents.Width + 2 * Padding, recordingExtents.Height + 2 * Padding);
using TeeSurface tee = new(svg);
using (CairoContext cr = new(tee))
{
tee.Add(pdf);

cr.SetSourceSurface(surface, Padding - recordingExtents.X, Padding - recordingExtents.Y);
cr.Paint();
}

tee.WriteToPng("recording.png");

families.ForEach(f => f.Dispose());
}
//-----------------------------------------------------------------------------
static void FontListDemo()
{
using PangoFontMap fontMap = PangoFontMap.CairoFontMapGetDefault();
fontMap.AddFontFile(IOPath.Combine(AppContext.BaseDirectory, "fonts", "SanRemo.ttf"));

List<PangoFontFamily> families = [];
foreach (PangoFontFamily fontFamily in fontMap.ListFamilies())
{
families.Add(fontFamily);
}
families = [.. families
.OrderBy(f => f.IsMonospace)
.ThenBy (f => f.Name)
];

using RecordingSurface surface = new();
using (CairoContext cr = new(surface))
{
using PangoLayout pangoLayout = new(cr);
double curY = 10;

foreach (PangoFontFamily fontFamily in families)
{
using PangoFontFace? fontFace = fontFamily.GetFace(null);

if (fontFace is null)
{
continue;
}

cr.MoveTo(10, curY);
pangoLayout.SetText($"Font: {fontFamily.Name} {fontFace.Name}; AV and VA to see kerning or not");
pangoLayout.SetFontDescription(fontFace, size: 22);
pangoLayout.ShowLayout();
pangoLayout.GetSize(out double width, out double height);
curY += height;
}
}

Rectangle recordingExtents = surface.GetInkExtents();
const int Padding = 10;
double surfaceWidth = recordingExtents.Width + 2 * Padding;
double surfaceHeight = recordingExtents.Height + 2 * Padding;

using SvgSurface svg = new("font-list.svg", surfaceWidth, surfaceHeight);
using PdfSurface pdf = new("font-list.pdf", surfaceWidth, surfaceHeight);
using TeeSurface tee = new(svg);
using (CairoContext cr = new(tee))
{
tee.Add(pdf);

cr.Color = KnownColors.White;
cr.Paint();
cr.Color = Color.Default;
cr.LineWidth = 4;
cr.Rectangle(0, 0, surfaceWidth, surfaceHeight);
cr.Stroke();

cr.SetSourceSurface(surface, Padding - recordingExtents.X, Padding - recordingExtents.Y);
cr.Paint();
}

tee.WriteToPng("font-list.png");

families.ForEach(f => f.Dispose());
}
Loading