55using System . Drawing . Text ;
66using System . Xml ;
77using System . Collections . Generic ;
8+ using System . Drawing . Drawing2D ;
89using System . Globalization ;
10+ using System . IO ;
911using System . Linq ;
12+ using System . Reflection ;
13+ using System . Runtime . InteropServices ;
1014
1115namespace 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
0 commit comments