Skip to content

Commit 4c50d56

Browse files
authored
Merge pull request #16 from Amomum/master
Added 6px font for enumeration
2 parents 763585a + 7719041 commit 4c50d56

4 files changed

Lines changed: 69 additions & 17 deletions

File tree

Pixie/PatternGenerator.cs

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55
using System.Drawing.Text;
66
using System.Xml;
77
using System.Collections.Generic;
8+
using System.Drawing.Drawing2D;
89
using System.Globalization;
10+
using System.IO;
911
using System.Linq;
12+
using System.Reflection;
13+
using System.Runtime.InteropServices;
1014

1115
namespace Pixie
1216
{
@@ -80,9 +84,13 @@ private void FillBackground(Bitmap pattern)
8084
private void DrawHorizontalLines(Bitmap pattern)
8185
{
8286
var g = Graphics.FromImage(pattern);
83-
for (var i = _settings.SymbolHeight; i < pattern.Height; i += _settings.SymbolHeight + _settings.DelimeterHeight)
87+
for (var i = _settings.SymbolHeight + _settings.DelimeterHeight/2; i < pattern.Height; i += _settings.SymbolHeight + _settings.DelimeterHeight)
8488
{
85-
g.DrawLine(new Pen(_delimeterColor, _settings.DelimeterHeight), 0, i, pattern.Width, i);
89+
var pen = new Pen(_delimeterColor, _settings.DelimeterHeight)
90+
{
91+
Alignment = PenAlignment.Outset
92+
};
93+
g.DrawLine(pen, 0, i, pattern.Width, i);
8694
}
8795

8896
}
@@ -94,12 +102,42 @@ private void DrawHorizontalLines(Bitmap pattern)
94102
private void DrawVerticalLines(Bitmap pattern)
95103
{
96104
var g = Graphics.FromImage(pattern);
97-
for (var i = _settings.SymbolWidth; i < pattern.Width; i += _settings.SymbolWidth + _settings.DelimeterWidth)
105+
for (var i = _settings.SymbolWidth + _settings.DelimeterWidth/2; i < pattern.Width; i += _settings.SymbolWidth + _settings.DelimeterWidth)
98106
{
99-
g.DrawLine(new Pen(_delimeterColor, _settings.DelimeterWidth), i, 0, i, pattern.Height);
107+
var pen = new Pen(_delimeterColor, _settings.DelimeterWidth)
108+
{
109+
Alignment = PenAlignment.Right
110+
};
111+
g.DrawLine(pen, i, 0, i, pattern.Height);
100112
}
101113
}
102114

115+
/// <summary>
116+
/// Loads custom font from resource and returns it
117+
/// </summary>
118+
/// <param name="resourceName">name of resource, containing font</param>
119+
/// <param name="size">font size</param>
120+
private Font GetCustomFont(string resourceName, float size)
121+
{
122+
var assembly = Assembly.GetExecutingAssembly();
123+
124+
// create private font collection object
125+
PrivateFontCollection pfc = new PrivateFontCollection();
126+
127+
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
128+
{
129+
var buffer = new byte[stream.Length];
130+
var result = stream.Read(buffer, 0, buffer.Length);
131+
// create an unsafe memory block for the font data
132+
System.IntPtr data = Marshal.AllocCoTaskMem(buffer.Length);
133+
// copy the bytes to the unsafe memory block
134+
Marshal.Copy(buffer, 0, data, buffer.Length);
135+
// pass the font to the font collection
136+
pfc.AddMemoryFont(data, buffer.Length);
137+
}
138+
return new Font(pfc.Families[0], size);
139+
}
140+
103141
/// <summary>
104142
/// Draws line and column numbers
105143
/// </summary>
@@ -108,40 +146,43 @@ private void DrawVerticalLines(Bitmap pattern)
108146
private void Enumerate(Bitmap pattern, EnumerationStyle enumerationStyle)
109147
{
110148
// 72 pixels in one pt
111-
const int PixelsPerPoint = 72;
149+
const int pixelsPerPoint = 72;
150+
const string fontName = "Pixie.Resources.XpaiderPE.TTF";
112151
if (enumerationStyle == EnumerationStyle.None)
113152
return;
114153

115154
var graphics = Graphics.FromImage(pattern);
116155

117156
// rows and column numbers will be 0.75 of symbol size
118-
var fontSize = (float)(_settings.SymbolHeight * 0.75 * PixelsPerPoint / pattern.VerticalResolution);
119-
// align vertically in center
120-
int topPadding = _settings.SymbolHeight / 4 - 1;
157+
var fontSize = (float)(_settings.SymbolHeight * 0.75 * pixelsPerPoint / pattern.VerticalResolution);
121158

122-
var font = new Font(FontFamily.GenericMonospace, fontSize);
159+
var font = GetCustomFont(fontName, fontSize);
123160
var brush = new SolidBrush(_delimeterColor);
124161

125162
// select string format specifier based on enumeration style
126163
var numbersStyle = enumerationStyle == EnumerationStyle.Hex ? "X" : "D2";
127164

128-
// make numbers more readable on low resolutions
129-
graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
165+
// we use 6px sized font so we don't need any anti-aliasing
166+
graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
130167

168+
var rowHeight = _settings.SymbolHeight + _settings.DelimeterHeight;
169+
var columnWidth = _settings.SymbolWidth + _settings.DelimeterWidth;
131170
// Enumerate rows
132-
for (int rowHeight = _settings.SymbolHeight + _settings.DelimeterHeight, rowNumber = 0, i = rowHeight;
171+
for (int rowNumber = 0, i = rowHeight;
133172
i < pattern.Height;
134-
i += rowHeight)
173+
i += rowHeight, rowNumber++)
135174
{
136-
graphics.DrawString(rowNumber++.ToString(numbersStyle), font, brush, 0, i + topPadding);
175+
graphics.DrawString(rowNumber.ToString(numbersStyle), font, brush,
176+
new RectangleF(0 - 1,i - 1,_settings.SymbolWidth, _settings.SymbolHeight));
137177
}
138178

139179
// Enumerate columns
140-
for (int columnWidth = _settings.SymbolWidth + _settings.DelimeterWidth, columnNumber = 0, i = columnWidth;
180+
for (int columnNumber = 0, i = columnWidth;
141181
i < pattern.Width;
142-
i += columnWidth)
182+
i += columnWidth, columnNumber++)
143183
{
144-
graphics.DrawString(columnNumber++.ToString(numbersStyle), font, brush, i, topPadding);
184+
graphics.DrawString(columnNumber.ToString(numbersStyle), font, brush,
185+
new RectangleF(i - 1,0 - 1,_settings.SymbolWidth, _settings.SymbolHeight));
145186
}
146187
}
147188

Pixie/Pixie.csproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<Import Project="..\packages\Microsoft.Net.Compilers.2.9.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.9.0\build\Microsoft.Net.Compilers.props')" />
34
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
45
<PropertyGroup>
56
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -13,6 +14,8 @@
1314
<FileAlignment>512</FileAlignment>
1415
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
1516
<TargetFrameworkProfile />
17+
<NuGetPackageImportStamp>
18+
</NuGetPackageImportStamp>
1619
</PropertyGroup>
1720
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
1821
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -77,8 +80,15 @@
7780
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
7881
</None>
7982
<None Include="packages.config" />
83+
<EmbeddedResource Include="Resources\XpaiderPE.TTF" />
8084
</ItemGroup>
8185
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
86+
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
87+
<PropertyGroup>
88+
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
89+
</PropertyGroup>
90+
<Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.2.9.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.2.9.0\build\Microsoft.Net.Compilers.props'))" />
91+
</Target>
8292
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
8393
Other similar extension points exist, see Microsoft.Common.targets.
8494
<Target Name="BeforeBuild">

Pixie/Resources/XpaiderPE.TTF

20.4 KB
Binary file not shown.

Pixie/packages.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="Microsoft.Net.Compilers" version="2.9.0" targetFramework="net46" developmentDependency="true" />
34
<package id="CommandLineParser" version="2.3.0" targetFramework="net46" />
45
</packages>

0 commit comments

Comments
 (0)