private void FillSampleData(Bitmap pattern, byte[] sampleData, EnumerationStyle enumerationStyle) { var bitArray = sampleData.ToBitArray(); int bitArrayIndex = 0; var columnCount = (pattern.Width + _settings.DelimeterWidth) / (_settings.SymbolWidth + _settings.DelimeterWidth); var rowCount = (pattern.Height + _settings.DelimeterHeight) / (_settings.SymbolHeight + _settings.DelimeterHeight); var pixelTracker = new BitmapPixelTracker(_settings.CellsLookupDirection) { // Skip first row and columnt if they were used for rows/columns numbers XStart = enumerationStyle == EnumerationStyle.None? 0: 1, XEnd = columnCount, XDelta = 1, // Skip first row and columnt if they were used for rows/columns numbers YStart = enumerationStyle == EnumerationStyle.None? 0: 1, YEnd = rowCount, YDelta = 1 }; // Process cells // in this case pixel coords will correspond to cell foreach (var pixel in pixelTracker) { // get symbol top leftPoint var symbolX = pixel.X * (_settings.DelimeterWidth + _settings.SymbolWidth); var symbolY = pixel.Y * (_settings.DelimeterHeight + _settings.SymbolHeight); FillSymbol(symbolX, symbolY, pattern, bitArray, ref bitArrayIndex); } }
/// <summary> /// Fills bitmap with solid color and draws a grid on it /// </summary> /// <param name="patternWidthCount">width of grid in symbols (cells)</param> /// <param name="patternHeightCount">height of grid in symbols (cells)</param> /// <returns>production ready bitmap</returns> public Bitmap GeneratePattern(int patternWidthCount, int patternHeightCount, EnumerationStyle enumerationStyle, byte[] sampleData = null) { if (enumerationStyle != EnumerationStyle.None) { patternHeightCount++; patternWidthCount++; } var pattentWidth = patternWidthCount * _settings.SymbolWidth + (patternWidthCount - 1) * _settings.DelimeterWidth; var patternHeight = patternHeightCount * _settings.SymbolHeight + (patternHeightCount - 1) * _settings.DelimeterHeight; var pattern = new Bitmap(pattentWidth, patternHeight); ConsoleLogger.WriteMessage($"Generating pattern\nBitmap size {pattentWidth} x {patternHeight} px", MessageType.Info); FillBackground(pattern); DrawVerticalLines(pattern); DrawHorizontalLines(pattern); Enumerate(pattern, enumerationStyle); if (sampleData != null) { FillSampleData(pattern, sampleData, enumerationStyle); } return(pattern); }
/// <summary> /// Draws line and column numbers /// </summary> /// <param name="pattern">bitmap to draw in</param> /// <param name="enumerationStyle">style of digits</param> private void Enumerate(Bitmap pattern, EnumerationStyle enumerationStyle) { // 72 pixels in one pt const int pixelsPerPoint = 72; const string fontName = "Pixie.Resources.XpaiderPE.TTF"; if (enumerationStyle == EnumerationStyle.None) { return; } var graphics = Graphics.FromImage(pattern); // rows and column numbers will be 0.75 of symbol size var fontSize = (float)(_settings.SymbolHeight * 0.75 * pixelsPerPoint / pattern.VerticalResolution); var font = GetCustomFont(fontName, fontSize); var brush = new SolidBrush(_delimeterColor); // select string format specifier based on enumeration style var numbersStyle = enumerationStyle == EnumerationStyle.Hex ? "X" : "D2"; // we use 6px sized font so we don't need any anti-aliasing graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel; var rowHeight = _settings.SymbolHeight + _settings.DelimeterHeight; var columnWidth = _settings.SymbolWidth + _settings.DelimeterWidth; // Enumerate rows for (int rowNumber = 0, i = rowHeight; i < pattern.Height; i += rowHeight, rowNumber++) { graphics.DrawString(rowNumber.ToString(numbersStyle), font, brush, new RectangleF(0 - 1, i - 1, _settings.SymbolWidth, _settings.SymbolHeight)); } // Enumerate columns for (int columnNumber = 0, i = columnWidth; i < pattern.Width; i += columnWidth, columnNumber++) { graphics.DrawString(columnNumber.ToString(numbersStyle), font, brush, new RectangleF(i - 1, 0 - 1, _settings.SymbolWidth, _settings.SymbolHeight)); } }
/// <summary> /// Draws line and column numbers /// </summary> /// <param name="pattern">bitmap to draw in</param> /// <param name="enumerationStyle">style of digits</param> private void Enumerate(Bitmap pattern, EnumerationStyle enumerationStyle) { // 72 pixels in one pt const int PixelsPerPoint = 72; if (enumerationStyle == EnumerationStyle.None) { return; } var graphics = Graphics.FromImage(pattern); // rows and column numbers will 2 times smaller var fontSize = (float)(_settings.SymbolHeight * 0.5 * PixelsPerPoint / pattern.VerticalResolution); // align vertically in center int topPadding = _settings.SymbolHeight / 4 - 1; var font = new Font(FontFamily.GenericMonospace, fontSize); var brush = new SolidBrush(_delimeterColor); // select string format specifier based on enumeration style var numbersStyle = enumerationStyle == EnumerationStyle.Hex ? "X" : "D2"; // make numbers more readable on low resolutions graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; // Enumerate rows for (int rowHeight = _settings.SymbolHeight + _settings.DelimeterHeight, rowNumber = 0, i = rowHeight; i < pattern.Height; i += rowHeight) { graphics.DrawString(rowNumber++.ToString(numbersStyle), font, brush, 0, i + topPadding); } // Enumerate columns for (int columnWidth = _settings.SymbolWidth + _settings.DelimeterWidth, columnNumber = 0, i = columnWidth; i < pattern.Width; i += columnWidth) { graphics.DrawString(columnNumber++.ToString(numbersStyle), font, brush, i, topPadding); } }