public static UnitSVGTable getInstance()
        {
            if (_instance == null)
            {
                lock (syncLock)
                {
                    if (_instance == null)
                    {
                        _instance = new UnitSVGTable();
                    }
                }
            }

            return(_instance);
        }
Beispiel #2
0
        private void Init()
        {
            //@"(?<=[M,m])"
            StringBuilder sb = new StringBuilder();

            sb.Append(@"(?=[");
            for (int i = 0; i < svgCommands.Length; i++)
            {
                sb.Append(svgCommands[i]);
                if (i < (svgCommands.Length - 1))
                {
                    sb.Append(',');
                }
            }
            sb.Append("])");
            _regex = sb.ToString();//@"(?=[" + sb.ToString() + "])";

            SymbolSVGTable st = SymbolSVGTable.getInstance();
            UnitSVGTable   ut = UnitSVGTable.getInstance();
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="symbolID"></param>
        /// <param name="modifiers"></param>
        /// <param name="attributes"></param>
        /// <returns></returns>
        public ImageInfo RenderUnit(String symbolID, Dictionary <int, String> modifiers, Dictionary <int, String> attributes)
        {
            //L 1.5 = 2650 pixel units in the svg font file
            double L1_5 = 2650;

            Bitmap coreBMP = null;

            try
            {
                Graphics g = Graphics.FromImage(dimensionsBMP);

                //get unit font
                Font unitFont = _unitFont;

                //get font character indexes
                int     fillIndex    = -1;
                int     frameIndex   = -1;
                int     symbol1Index = -1;
                int     symbol2Index = -1;
                SVGPath svgFill      = null;
                SVGPath svgFrame     = null;
                SVGPath svgSymbol1   = null;
                SVGPath svgSymbol2   = null;

                //get attributes
                int     alpha         = 255;
                Boolean drawAsIcon    = false;
                Boolean keepUnitRatio = true;
                int     pixelSize     = 0;
                Color   fillColor     = SymbolUtilities.getFillColorOfAffiliation(symbolID);
                Color   frameColor    = SymbolUtilities.getLineColorOfAffiliation(symbolID);

                if (attributes == null)
                {
                    attributes = new Dictionary <int, string>();
                }
                if (attributes.ContainsKey(MilStdAttributes.LineColor))
                {
                    frameColor = SymbolUtilities.getColorFromHexString(attributes[MilStdAttributes.LineColor]);
                }

                if (attributes.ContainsKey(MilStdAttributes.FillColor))
                {
                    fillColor = SymbolUtilities.getColorFromHexString(attributes[MilStdAttributes.FillColor]);
                }

                if (attributes.ContainsKey(MilStdAttributes.Alpha))
                {
                    alpha = Convert.ToInt32(attributes[MilStdAttributes.Alpha]);
                }

                if (attributes.ContainsKey(MilStdAttributes.DrawAsIcon))
                {
                    drawAsIcon = Convert.ToBoolean(attributes[MilStdAttributes.DrawAsIcon]);
                }

                if (attributes.ContainsKey(MilStdAttributes.PixelSize))
                {
                    pixelSize = Convert.ToInt32(attributes[MilStdAttributes.PixelSize]);
                }
                else
                {
                    pixelSize = 35;
                }

                if (attributes.ContainsKey(MilStdAttributes.KeepUnitRatio))
                {
                    keepUnitRatio = Convert.ToBoolean(attributes[MilStdAttributes.KeepUnitRatio]);
                }

                UnitFontLookupInfo ufli = UnitFontLookup.getInstance().getLookupInfo(symbolID);
                fillIndex  = UnitFontLookup.getFillCode(symbolID);
                frameIndex = UnitFontLookup.getFrameCode(symbolID, fillIndex);
                if (ufli != null)
                {
                    symbol1Index = ufli.getMapping1(symbolID);
                    symbol2Index = ufli.getMapping2();
                }

                if (fillIndex > 0)
                {
                    svgFill = UnitSVGTable.getInstance().getSVGPath(fillIndex);
                }
                if (frameIndex > 0)
                {
                    svgFrame = UnitSVGTable.getInstance().getSVGPath(frameIndex);
                }
                if (symbol1Index > 0)
                {
                    svgSymbol1 = UnitSVGTable.getInstance().getSVGPath(symbol1Index);
                }
                if (symbol2Index > 0)
                {
                    svgSymbol2 = UnitSVGTable.getInstance().getSVGPath(symbol2Index);
                }


                //get dimensions for this symbol given the font size & fill index


                Matrix matrix  = null;
                double heightL = 1;
                double widthL  = 1;

                if (keepUnitRatio)
                {
                    RectangleF rectFrame = svgFrame.getBounds();
                    double     ratio     = pixelSize / L1_5 / 1.5;
                    widthL  = UnitFontLookup.getUnitRatioWidth(fillIndex);
                    heightL = UnitFontLookup.getUnitRatioHeight(fillIndex);
                    if (widthL > heightL)
                    {
                        ratio = ratio * widthL;
                    }
                    else
                    {
                        ratio = ratio * heightL;
                    }
                    pixelSize = (int)((ratio * L1_5) + 0.5);
                }

                matrix = svgFrame.TransformToFitDimensions(pixelSize, pixelSize);

                RectangleF rectF = svgFrame.getBounds();

                int w = (int)(rectF.Width + 1.5f);
                int h = (int)(rectF.Height + 1.5f);
                coreBMP = new Bitmap(w, h);
                Point centerPoint = new Point(w / 2, h / 2);

                //draw location
                PointF location = new PointF(0, 0);
                location.X = (rectF.Width / 2.0f);// +0.5f;//use 0.5f to round up
                location.Y = -(rectF.Height / 2.0f);

                //get & setup graphics object for destination BMP
                g = Graphics.FromImage(coreBMP);
                g.SmoothingMode     = SmoothingMode.AntiAlias;
                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

                //draw symbol to BMP
                if (svgFill != null)
                {
                    svgFill.Draw(g, Color.Empty, 0, fillColor, matrix);
                }
                if (svgFrame != null)
                {
                    svgFrame.Draw(g, Color.Empty, 0, frameColor, null);
                }
                if (svgSymbol2 != null)
                {
                    svgSymbol2.Draw(g, Color.Empty, 0, ufli.getColor2(), matrix);
                }
                if (svgSymbol1 != null)
                {
                    svgSymbol1.Draw(g, Color.Empty, 0, ufli.getColor1(), matrix);
                }


                RectangleF coreDimensions  = new RectangleF(0, 0, w, h);
                Rectangle  finalDimensions = new Rectangle(0, 0, w, h);

                //adjust centerpoint for HQStaff if present

                /*if(SymbolUtilities.isHQ(symbolID))
                 * {
                 *      Point point1 = new Point();
                 *      Point point2 = new Point();
                 *      string affiliation = symbolID.Substring(1, 2);
                 *      if(affiliation==("F") ||
                 *              affiliation==("A") ||
                 *              affiliation==("D") ||
                 *              affiliation==("M") ||
                 *              affiliation==("J") ||
                 *              affiliation==("K") ||
                 *              affiliation==("N") ||
                 *              affiliation==("L"))
                 *      {
                 *              point1.X = 0;
                 * point1.Y = (coreBMP.Height);
                 *              point2.X = point1.X;
                 * point2.Y = point1.Y + coreBMP.Height;
                 *      }
                 *      else
                 *      {
                 *              point1.X = 1;
                 * point1.Y = (coreBMP.Height / 2);
                 *              point2.X = point1.X;
                 * point2.Y = point1.Y + coreBMP.Height;
                 *      }
                 *      centerPoint = point2;
                 * }//*/

                ImageInfo ii = new ImageInfo(coreBMP, centerPoint, coreDimensions);

                //process display modifiers
                ImageInfo iinew = null;

                Boolean hasDisplayModifiers = ModifierRenderer.hasDisplayModifiers(symbolID, modifiers);
                Boolean hasTextModifiers    = ModifierRenderer.hasTextModifiers(symbolID, modifiers, attributes);
                if (hasDisplayModifiers)
                {
                    iinew = ModifierRenderer.ProcessUnitDisplayModifiers(symbolID, ii, modifiers, attributes, true);
                }

                if (iinew != null)
                {
                    ii = iinew;
                }
                iinew = null;

                //process text modifiers
                if (hasTextModifiers)
                {
                    //iinew = ModifierRenderer.ProcessUnitTextModifiers(symbolID, ii, modifiers, attributes);
                    iinew = ModifierRenderer.ProcessUnitTextModifiers(ii, symbolID, modifiers, attributes);
                }

                if (iinew != null)
                {
                    ii = iinew;
                }
                iinew = null;

                g.Dispose();
                g = null;

                return(ii);
            }
            catch (Exception exc)
            {
                ErrorLogger.LogException("SinglePointRenderer", "RenderUnit", exc);
                return(null);
            }
        }