Exemplo n.º 1
0
 public BitmapInfo(OutputConfiguration outConfig, Bitmap bmp, Color borderColor)
 {
     OutConfig      = outConfig;
     Original       = bmp;
     OriginalBorder = Border.GetBorders(Original, borderColor);
     ColorList      = MyExtensions.GetColorList(Original).Aggregate(new Dictionary <Color, bool>(), (dic, c) => { dic.Add(c, c.ToArgb() == borderColor.ToArgb()); return(dic); });
 }
Exemplo n.º 2
0
        // get the descriptors
        private static string getFontInfoDescriptorsString(bool blockLookupGenerated, OutputConfiguration outConfig, Font font)
        {
            string descriptorString = "";

            // if a lookup arrays are required, point to it
            if (outConfig.generateLookupBlocks)
            {
                // add to string
                descriptorString += String.Format("\t{0}, {1} Character block lookup{2}" + outConfig.nl,
                                                  blockLookupGenerated ? getCharacterDescriptorArrayLookupDisplayString(font) : "NULL",
                                                  outConfig.CommentStart, outConfig.CommentEnd);

                // add to string
                descriptorString += String.Format("\t{0}, {1} Character descriptor array{2}" + outConfig.nl,
                                                  blockLookupGenerated ? "NULL" : MyExtensions.GetVariableNameFromExpression(String.Format(outConfig.varNfCharInfo, getFontName(font, true))),
                                                  outConfig.CommentStart, outConfig.CommentEnd);
            }
            else
            {
                // add descriptor array
                descriptorString += String.Format("\t{0}, {1} Character descriptor array{2}" + outConfig.nl,
                                                  MyExtensions.GetVariableNameFromExpression(String.Format(outConfig.varNfCharInfo, getFontName(font, true))),
                                                  outConfig.CommentStart, outConfig.CommentEnd);
            }

            // return the string
            return(descriptorString);
        }
Exemplo n.º 3
0
 public BitmapInfo(OutputConfiguration outConfig, Bitmap bmp, Dictionary <Color, bool> colorList)
 {
     OutConfig      = outConfig;
     Original       = bmp;
     OriginalBorder = Border.GetBorders(Original, MyExtensions.GetEnabledKeys <Color>(colorList));
     ColorList      = colorList;
 }
Exemplo n.º 4
0
        public string GetBlockInfo()
        {
            Size s = bitmapInfo?.Size ?? new Size();

            // get the character descriptor string
            Func <OutputConfiguration.DescriptorFormat, int, string> GetCharacterDescString = ((descFormat, valueInBits) =>
            {
                switch (descFormat)
                {
                // don't display
                case OutputConfiguration.DescriptorFormat.DontDisplay:
                    return("");

                case OutputConfiguration.DescriptorFormat.DisplayInBits:
                case OutputConfiguration.DescriptorFormat.DisplayInBytes:
                    // add comma and return
                    return(MyExtensions.ConvertValueByDescriptorFormat(descFormat, valueInBits) + ", ");

                default:
                    throw new NotImplementedException();
                }
            });

            return(string.Format("\t{{{0}{1}{2}}},", GetCharacterDescString(OutConfig.descCharWidth, s.Width),
                                 GetCharacterDescString(OutConfig.descCharHeight, s.Height),
                                 OffsetInBytes)
                   .PadRight(15) +

                   string.Format("{0}{1}{2}" + OutConfig.nl,
                                 OutConfig.CommentStart,
                                 Character == '\\' ? "\\ (backslash)" : Character.ToString(),
                                 OutConfig.CommentEnd));
        }
Exemplo n.º 5
0
        private void btnBitmapLoad_Click(object sender, EventArgs e)
        {
            // set filter
            dlgOpenFile.Filter = string.Format("Image Files ({0})|{0}", "*.jpg; *.jpeg; *.gif; *.bmp; *.png");

            // open the dialog
            if (dlgOpenFile.ShowDialog() != DialogResult.Cancel)
            {
                if (m_currentLoadedBitmap != null)
                {
                    m_currentLoadedBitmap.Dispose();
                }
                m_currentLoadedBitmap = MyExtensions.ChangePixelFormat(new Bitmap(dlgOpenFile.FileName), PixelFormat.Format32bppArgb);

                // set the path
                txtImagePath.Text = dlgOpenFile.FileName;

                // guess a name
                txtImageName.Text = Path.GetFileNameWithoutExtension(dlgOpenFile.FileName);

                //
                colorList = MyExtensions.GetColorList(m_currentLoadedBitmap).ToDictionary <Color, Color, bool>(x => x, x => false);
                colorList[colorList.ElementAt(0).Key] = true;

                if (colorList.Count > 16)
                {
                    MessageBox.Show("Convert the image into black/white in a proper image processing program, to get better results.");
                }

                dataGridViewBackgroundColor.RowCount = colorList.Count;
                dataGridViewBackgroundColor.Refresh();

                // Set picterbox background
                pbxBitmap.BackColor = GetBackColorForPicturbox();

                Size sz = DetectTileSize();

                updateBitmapAllowed = false;
                numericUpDownInputImageTilesPerLine.Value = 16;
                numericUpDownInputImageTileSizeX.Value    = sz.Width;
                numericUpDownInputImageTileSizeY.Value    = sz.Height;
                updateBitmapAllowed = true;

                UpdateInputImageFont(sender, e);
            }
        }
Exemplo n.º 6
0
        // get the font name and format it
        public static string getFontName(Font font, bool variabelName = false)
        {
            string space = (variabelName) ? "_" : " ";
            string s;

            s = string.Format("{0}{2}{1}pt", font.Name, Math.Round(font.Size), space);

            if (font.Style != FontStyle.Regular)
            {
                s += space + font.Style.ToString();
                if (variabelName)
                {
                    s = s.Replace(", ", "_");
                }
            }

            return((variabelName) ? MyExtensions.ScrubVariableName(s) : s);
        }
Exemplo n.º 7
0
        private void updateBitmapPreview()
        {
            if (checkGroupBoxFontImage.Checked && m_currentLoadedBitmap != null)
            {
                int w            = (int)numericUpDownInputImageTileSizeX.Value;
                int h            = (int)numericUpDownInputImageTileSizeY.Value;
                int tilesPerLine = (int)numericUpDownInputImageTilesPerLine.Value;

                Point p = new Point(hScrollBarInputImageCharacterPos.Value % tilesPerLine * w, hScrollBarInputImageCharacterPos.Value / tilesPerLine * h);

                Rectangle r = new Rectangle(p, new Size(w, h));
                Color     c;
                if (colorList.ContainsValue(true))
                {
                    c = MyExtensions.GetEnabledKeys(colorList)[0];
                }
                else
                {
                    c = Color.Transparent;
                }
                Bitmap character = MyExtensions.Clone(m_currentLoadedBitmap, r, PixelFormat.Format32bppArgb, c);;

                Size newSize = r.Size;
                int  faktor  = 1;

                while (newSize.Height <= 32)
                {
                    newSize.Height *= 2;
                    newSize.Width  *= 2;
                    faktor         *= 2;
                }

                //convert to black white image
                character = MyExtensions.ToBitmap(MyExtensions.ToArgbArray(character).Select(argb =>
                {
                    return(colorList[Color.FromArgb(argb)] ? Color.Black.ToArgb() : Color.White.ToArgb());
                }).ToArray(), r.Size);

                pictureBoxInputImageFontCharacterPreview.Image = MyExtensions.ResizeImage(character, faktor);
                pictureBoxInputImageFontCharacterPreview.Size  = newSize;
            }
        }
Exemplo n.º 8
0
        // get character descriptor array block name
        private string charDescArrayGetBlockName(int currentBlockIndex,
                                                 bool includeTypeDefinition,
                                                 bool includeBlockIndex)
        {
            // get block id
            string blockIdString = String.Format("Block{0}", currentBlockIndex);

            // variable name
            string variableName = String.Format(OutConfig.varNfCharInfo, getFontName(Font, true));

            // remove type unless required
            if (!includeTypeDefinition)
            {
                variableName = MyExtensions.GetVariableNameFromExpression(variableName);
            }

            // return the block name
            return(String.Format("{0}{1}{2}",
                                 variableName,
                                 includeBlockIndex ? blockIdString : "",
                                 includeTypeDefinition ? "[]" : ""));
        }
Exemplo n.º 9
0
        private void generateOutputForFontImage(OutputConfiguration outConfig,
                                                Dictionary <Color, bool> colorList,
                                                Size tileSize,
                                                int codepage,
                                                Bitmap bitmapOriginal,
                                                StringBuilder textSource,
                                                StringBuilder textHeader)
        {
            // the name of the bitmap
            string imageName;

            Color[]    backgroundColors;
            BitmapInfo bi;

            textSource.Clear();
            textHeader.Clear();

            if (bitmapOriginal == null || txtImageName.Text == "")
            {
                textSource.Append("No image found ");
                return;
            }

            imageName        = MyExtensions.ScrubVariableName(txtImageName.Text);
            backgroundColors = MyExtensions.GetEnabledKeys <Color>(colorList);

            // check if bitmap is assigned
            if (m_currentLoadedBitmap != null)
            {
                //
                // Bitmap manipulation
                //
                bi = new BitmapInfo(m_outputConfig, m_currentLoadedBitmap, colorList);

                // try to manipulate the bitmap

                if (!bi.GenerateManipulatetBitmap(bi.OriginalBorder))
                {
                    // show error
                    MessageBox.Show("No blackground pixels found in bitmap",
                                    "Can't convert bitmap",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);

                    // stop here, failed to manipulate the bitmap for whatever reason
                    return;
                }

                // according to config
                if (m_outputConfig.addCommentVariableName)
                {
                    // add source file header
                    textSource.AppendFormat("{0}" + m_outputConfig.nl + "{1} Image data for {2}" + m_outputConfig.nl + "{3}" + m_outputConfig.nl + m_outputConfig.nl,
                                            m_outputConfig.CommentStart,
                                            m_outputConfig.CommentBlockMiddle,
                                            imageName,
                                            m_outputConfig.CommentBlockEnd);

                    // add header file header
                    textHeader.AppendFormat("{0}Bitmap info for {1}{2}" + m_outputConfig.nl,
                                            m_outputConfig.CommentStart,
                                            imageName,
                                            m_outputConfig.CommentEnd);
                }

                // bitmap varname
                string bitmapVarName = String.Format(m_outputConfig.varNfImageBitmap, imageName) + "[]";

                // add to source
                textSource.AppendFormat("{0} =" + m_outputConfig.nl + "{{" + m_outputConfig.nl, bitmapVarName);

                //
                // Bitmap to string
                //
                // page array
                bi.GeneratePageArray();

                // assign pages for fully populated 8 bits
                int pagesPerRow = MyExtensions.ConvertValueByDescriptorFormat(OutputConfiguration.DescriptorFormat.DisplayInBytes, bi.BitmapToGenerate.Width);

                // now convert to string
                bi.GenerateCharacterDataDescriptorAndVisulazer();
                textSource.Append(bi.Descriptor);

                // close
                textSource.AppendFormat("}};" + m_outputConfig.nl + m_outputConfig.nl);

                // according to config
                if (m_outputConfig.addCommentVariableName)
                {
                    // set sizes comment
                    textSource.AppendFormat("{0}Bitmap sizes for {1}{2}" + m_outputConfig.nl,
                                            m_outputConfig.CommentStart, imageName, m_outputConfig.CommentEnd);
                }

                Func <string> getImageWidthString = () =>
                {
                    const string format = "\t{2}, {0} {3}{1}{4}";
                    // display width in bytes?
                    switch (m_outputConfig.descImgWidth)
                    {
                    case OutputConfiguration.DescriptorFormat.DisplayInBytes:
                        return(string.Format(format,
                                             m_outputConfig.CommentStart,
                                             m_outputConfig.CommentEnd,
                                             pagesPerRow,
                                             "Image width in bytes (pages)",
                                             m_outputConfig.nl));

                    case OutputConfiguration.DescriptorFormat.DisplayInBits:
                        return(string.Format(format,
                                             m_outputConfig.CommentStart,
                                             m_outputConfig.CommentEnd,
                                             bi.BitmapToGenerate.Width,
                                             "Image width in pixels",
                                             m_outputConfig.nl));

                    case OutputConfiguration.DescriptorFormat.DontDisplay:
                        return("");

                    default:
                        throw new NotImplementedException();
                    }
                };

                Func <string> getImageHeigtString = () =>
                {
                    const string format = "\t{2}, {0} {3}{1}{4}";

                    switch (m_outputConfig.descImgHeight)
                    {
                    case OutputConfiguration.DescriptorFormat.DisplayInBytes:
                        return(string.Format(format,
                                             m_outputConfig.CommentStart,
                                             m_outputConfig.CommentEnd,
                                             MyExtensions.ConvertValueByDescriptorFormat(OutputConfiguration.DescriptorFormat.DisplayInBytes, bi.BitmapToGenerate.Height),
                                             "Image height in bytes (pages)",
                                             m_outputConfig.nl));

                    case OutputConfiguration.DescriptorFormat.DisplayInBits:
                        return(string.Format(format,
                                             m_outputConfig.CommentStart,
                                             m_outputConfig.CommentEnd,
                                             bi.BitmapToGenerate.Height,
                                             "Image height in pixels",
                                             m_outputConfig.nl));

                    case OutputConfiguration.DescriptorFormat.DontDisplay:
                        return("");

                    default:
                        throw new NotImplementedException();
                    }
                };

                // get var name
                string imageInfoVarName = String.Format(m_outputConfig.varNfImageInfo, imageName);

                // image info header
                textHeader.AppendFormat("extern {0};" + m_outputConfig.nl, imageInfoVarName);

                // image info source
                textSource.AppendFormat("{2} =" + m_outputConfig.nl + "{{" + m_outputConfig.nl +
                                        "{3}" +
                                        "{4}" +
                                        "\t{5}, {0} Image bitmap array{1}" + m_outputConfig.nl +
                                        "}};" + m_outputConfig.nl,
                                        m_outputConfig.CommentStart,
                                        m_outputConfig.CommentEnd,
                                        imageInfoVarName,
                                        getImageWidthString(),
                                        getImageHeigtString(),
                                        MyExtensions.GetVariableNameFromExpression(bitmapVarName));
            }
        }
Exemplo n.º 10
0
        // generate the strings
        private void GenerateStringsFromFontInfo()
        {
            StringBuilder sourceText = new StringBuilder();
            StringBuilder headerText = new StringBuilder();

            if (OutConfig.addCommentVariableName)
            {
                // add source file header
                sourceText.AppendFormat("{0}" + OutConfig.nl + "{1} Font data for {2}" + OutConfig.nl + "{3}" + OutConfig.nl + OutConfig.nl,
                                        OutConfig.CommentStart,
                                        OutConfig.CommentBlockMiddle,
                                        getFontName(Font, false),
                                        OutConfig.CommentBlockEnd);

                // add source header
                sourceText.AppendFormat("{0}Character bitmaps for {1} {2}" + OutConfig.nl,
                                        OutConfig.CommentStart,
                                        getFontName(Font, false),
                                        OutConfig.CommentEnd);

                // add header file header
                headerText.AppendFormat("{0}Font data for {1} {2}" + OutConfig.nl,
                                        OutConfig.CommentStart,
                                        getFontName(Font, false),
                                        OutConfig.CommentEnd);
            }

            // get bitmap name
            string charBitmapVarName = String.Format(OutConfig.varNfBitmaps, getFontName(Font, true)) + "[]";

            // source var
            sourceText.AppendFormat("{0} = " + OutConfig.nl + "{{" + OutConfig.nl, charBitmapVarName);

            Characters.ToList().ForEach(chi => chi.GenerateCharacterDataDescriptorAndVisulazer());
            Characters.Aggregate(sourceText, (sb, chi) =>
            {
                // skip empty bitmaps
                if (chi.BitmapToGenerate == null)
                {
                    return(sb);
                }

                // now add letter array
                sourceText.Append(chi.Descriptor);
                // space out
                if (OutConfig.addCommentCharDescriptor && chi.Character != chi.ParentFontInfo.LastChar)
                {
                    // space between chars
                    sb.Append(OutConfig.nl);
                }

                return(sb);
            });

            // space out
            sourceText.Append("};" + OutConfig.nl + OutConfig.nl);

            //
            // Charater descriptor
            //
            // whether or not block lookup was generated
            bool blockLookupGenerated = false;

            // check if required by configuration
            if (OutConfig.generateLookupArray)
            {
                // generate the lookup array
                blockLookupGenerated = generateStringsFromCharacterDescriptorBlockList(sourceText, headerText);
            }
            //
            // Font descriptor
            //

            // according to config
            if (OutConfig.addCommentVariableName)
            {
                // result string
                sourceText.AppendFormat("{0}Font information for {1} {2}" + OutConfig.nl,
                                        OutConfig.CommentStart,
                                        getFontName(Font, false),
                                        OutConfig.CommentEnd);
            }

            // character name
            string fontInfoVarName = String.Format(OutConfig.varNfFontInfo, getFontName(Font, true));

            // add character array for header
            headerText.AppendFormat("extern {0};" + OutConfig.nl, fontInfoVarName);

            // the font character height
            string fontCharHeightString = "";

            // get character height sstring - displayed according to output configuration
            if (OutConfig.descFontHeight != OutputConfiguration.DescriptorFormat.DontDisplay)
            {
                // convert the value
                fontCharHeightString = String.Format("\t{0}, {1} Character height{2}" + OutConfig.nl,
                                                     MyExtensions.ConvertValueByDescriptorFormat(OutConfig.descFontHeight, FixedAbsolutCharHeight),
                                                     OutConfig.CommentStart,
                                                     OutConfig.CommentEnd);
            }

            string fontCodePage = "";

            if (OutConfig.addCodePage)
            {
                fontCodePage = string.Format("\t{0}, {1} CodePage {3}{2}" + OutConfig.nl,
                                             OutConfig.CodePage,
                                             OutConfig.CommentStart,
                                             OutConfig.CommentEnd,
                                             CodePageInfo.GetCodepageName(OutConfig.CodePage));
            }

            string spaceCharacterPixelWidthString = "";

            // get space char width, if it is up to driver to generate
            if (!OutConfig.generateSpaceCharacterBitmap)
            {
                // convert the value
                spaceCharacterPixelWidthString = String.Format("\t{0}, {1} Width, in pixels, of space character{2}" + OutConfig.nl,
                                                               OutConfig.spaceGenerationPixels,
                                                               OutConfig.CommentStart,
                                                               OutConfig.CommentEnd);
            }

            // font info
            sourceText.AppendFormat("{2} =" + OutConfig.nl + "{{" + OutConfig.nl +
                                    "{3}" +
                                    "\t{4}, {0} First character '{9}'{1}" + OutConfig.nl +
                                    "\t{5}, {0} Last character '{10}'{1}" + OutConfig.nl +
                                    "{6}" +
                                    "{7}" +
                                    "\t{8}, {0} Character bitmap array{1}" + OutConfig.nl +
                                    "{11}" +
                                    "}};" + OutConfig.nl,
                                    OutConfig.CommentStart,
                                    OutConfig.CommentEnd,
                                    fontInfoVarName,
                                    fontCharHeightString,
                                    getCharacterDisplayString(CodePageInfo, FirstChar),
                                    getCharacterDisplayString(CodePageInfo, LastChar),
                                    spaceCharacterPixelWidthString,
                                    getFontInfoDescriptorsString(blockLookupGenerated, OutConfig, Font),
                                    MyExtensions.GetVariableNameFromExpression(String.Format(OutConfig.varNfBitmaps, getFontName(Font, true))),
                                    FirstChar,
                                    LastChar,
                                    fontCodePage);

            // add the appropriate entity to the header
            if (blockLookupGenerated)
            {
                // add block lookup to header
                headerText.AppendFormat("extern const FONT_CHAR_INFO_LOOKUP {0}[];" + OutConfig.nl, getCharacterDescriptorArrayLookupDisplayString(Font));
            }
            else
            {
                // add block lookup to header
                headerText.AppendFormat("extern {0}[];" + OutConfig.nl, String.Format(OutConfig.varNfCharInfo, getFontName(Font, true)));
            }

            TextSource = sourceText.ToString();
            TextHeader = headerText.ToString();
        }
Exemplo n.º 11
0
        public static Border GetBorders(Bitmap bmp, Color[] borderColorList)
        {
            int[]  pixel = MyExtensions.ToArgbArray(bmp);
            Border b = new Border();
            int    width = bmp.Width, height = bmp.Height;

            int[] borderColorListInt = borderColorList.Select <Color, int>(p => p.ToArgb()).ToArray();

            Func <int, int, int> getPixel = delegate(int x, int y)
            {
                return(pixel[y * width + x]);
            };

            // returns whether a bitmap column is empty (empty means all is border color)
            Func <int, bool> columnIsEmpty = delegate(int column)
            {
                // for each row in the column
                for (int row = 0; row < height; ++row)
                {
                    // is the pixel black?
                    if (!borderColorListInt.Contains(getPixel(column, row)))
                    {
                        // found. column is not empty
                        return(false);
                    }
                }

                // column is empty
                return(true);
            };

            // returns whether a bitmap row is empty (empty means all is border color)
            Func <int, bool> rowIsEmpty = delegate(int row)
            {
                // for each column in the row
                for (int column = 0; column < width; ++column)
                {
                    // is the pixel black?
                    if (!borderColorListInt.Contains(getPixel(column, row)))
                    {
                        // found. row is not empty
                        return(false);
                    }
                }

                // row is empty
                return(true);
            };

            for (b.Left = 0; b.Left < width; ++b.Left)
            {
                if (!columnIsEmpty(b.Left))
                {
                    break;
                }
            }
            for (b.Right = width - 1; b.Right >= 0; --b.Right)
            {
                if (!columnIsEmpty(b.Right))
                {
                    break;
                }
            }
            for (b.Top = 0; b.Top < height; ++b.Top)
            {
                if (!rowIsEmpty(b.Top))
                {
                    break;
                }
            }
            for (b.Bottom = height - 1; b.Bottom >= 0; --b.Bottom)
            {
                if (!rowIsEmpty(b.Bottom))
                {
                    break;
                }
            }

            return(b);
        }
Exemplo n.º 12
0
        // create the page array
        public void GeneratePageArray()
        {
            int[] pixels = MyExtensions.ToArgbArray(BitmapToGenerate);
            int   width = BitmapToGenerate.Width, height = BitmapToGenerate.Height;
            int   black = Color.Black.ToArgb(), white = Color.White.ToArgb();
            Dictionary <int, List <byte> > dpages           = new Dictionary <int, List <byte> >();
            Dictionary <int, bool>         backColorListInt = ColorList.ToDictionary <KeyValuePair <Color, bool>, int, bool>(kvp => kvp.Key.ToArgb(), kvp => kvp.Value);
            bool ColumnMajor = OutConfig.bitLayout == OutputConfiguration.BitLayout.ColumnMajor;

            // create pages
            Pages = new byte[0];

            Func <int, int, int> getPixel = delegate(int x, int y)
            {
                return(pixels[y * width + x]);
            };

            Action <int> ConvertRow = row =>
            {
                dpages.Add(row, new List <byte>());
                // current byte value
                byte currentValue = 0, bitsRead = 0;

                // for each column
                for (int column = 0; column < width; ++column)
                {
                    // is pixel set?
                    if (!backColorListInt[getPixel(column, row)])
                    {
                        // set the appropriate bit in the page
                        if (OutConfig.byteOrderMsbFirst)
                        {
                            currentValue |= (byte)(1 << (7 - bitsRead));
                        }
                        else
                        {
                            currentValue |= (byte)(1 << bitsRead);
                        }
                    }

                    // increment number of bits read
                    // have we filled a page?
                    if (++bitsRead == 8)
                    {
                        // add byte to page array
                        dpages[row].Add(currentValue);

                        // zero out current value
                        currentValue = 0;

                        // zero out bits read
                        bitsRead = 0;
                    }
                }
                // if we have bits left, add it as is
                if (bitsRead != 0)
                {
                    dpages[row].Add(currentValue);
                }
            };

            // for each row
            for (int row = 0; row < height; row++)
            {
                ConvertRow(row);
            }

            List <byte> tempPages = new List <byte>();

            for (int i = 0; i < dpages.Count; i++)
            {
                tempPages.AddRange(dpages[i]);
            }
            Pages = tempPages.ToArray();

            // transpose the pages if column major data is requested
            if (ColumnMajor)
            {
                Pages = Transpose(Pages, BitmapToGenerate.Width, BitmapToGenerate.Height, OutConfig.byteOrderMsbFirst);
            }
        }