示例#1
0
        static public Rect Rect(string text, Emugen.Image.Primitive.Font efont, PointF position)
        {
            var frameSize    = 0.0;
            var frameSizeMax = 0.0;
            var rfontFrames  = new List <Emugen.Image.Primitive.Font.FontFrame>();

            foreach (var frame in efont.fontFrames)
            {
                frameSizeMax += frame.size / 2;
                rfontFrames.Insert(0, frame);
            }
            frameSize = frameSizeMax;

            // Todo : フォントフレームの幅分だけマージンの対応が必要
            var margin = (int)System.Math.Floor(frameSize + subMargin);

            var font         = CreateFont(efont.fontPath, efont.fontSize);
            var emFontFize   = (float)font.Height * font.FontFamily.GetEmHeight(font.Style) / font.FontFamily.GetLineSpacing(font.Style);
            var stringFormat = new System.Drawing.StringFormat();

            // 描画
            var path = new System.Drawing.Drawing2D.GraphicsPath();

            path.AddString(text, font.FontFamily, (int)font.Style, emFontFize,
                           //path.AddString(text, font.FontFamily, (int)font.Style, (float)efont.fontSize,
                           new System.Drawing.PointF((float)(position.X), (float)(position.Y)),
                           stringFormat);

            var bound = path.GetBounds();
            //var result = new Rect(new Vector2D(bound.X - margin, bound.Y - margin), new Vector2D(bound.Width + margin * 2, bound.Height + margin * 2));
            var result = new Rect(new Vector2D(bound.X, bound.Y), new Vector2D(bound.Width, bound.Height));

            return(result);
        }
示例#2
0
        static public void Do(string text, Emugen.Image.Primitive.Font efont, Graphics graphics, PointF position)
        {
            var frameSize    = 0.0;
            var frameSizeMax = 0.0;
            var rfontFrames  = new List <Emugen.Image.Primitive.Font.FontFrame>();

            foreach (var frame in efont.fontFrames)
            {
                frameSizeMax += frame.size;
                rfontFrames.Insert(0, frame);
            }
            frameSize = frameSizeMax;

            // Todo : フォントフレームの幅分だけマージンの対応が必要
            //var margin = (int)System.Math.Floor(frameSize + subMargin);
            //var margin = 0;

            var font         = CreateFont(efont.fontPath, efont.fontSize);
            var emFontFize   = (float)font.Height * font.FontFamily.GetEmHeight(font.Style) / font.FontFamily.GetLineSpacing(font.Style);
            var stringFormat = new System.Drawing.StringFormat();

            // 描画
            var path = new System.Drawing.Drawing2D.GraphicsPath();

            path.AddString(text, font.FontFamily, (int)font.Style, emFontFize,
                           new System.Drawing.PointF((float)(position.X), (float)(position.Y)),
                           stringFormat);

            {
                var g = graphics;

                var brush = default(System.Drawing.SolidBrush);
                brush           = new System.Drawing.SolidBrush(efont.bodyColor.ToSystemDrawingColor());
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

                frameSize = frameSizeMax;

                foreach (var frame in rfontFrames)
                {
                    var pen = new System.Drawing.Pen(frame.color.ToSystemDrawingColor(), (float)frameSize);
                    g.DrawPath(pen, path);

                    frameSize -= frame.size;
                }

                g.FillPath(brush, path);
            }
        }
示例#3
0
        static public Bitmap CreateBitmap(string text, Emugen.Image.Primitive.Font efont)
        {
            // Todo このままだと 重いので、この情報を記録しておく必要がある
            var frameSize    = 0.0;
            var frameSizeMax = 0.0;
            var rfontFrames  = new List <Emugen.Image.Primitive.Font.FontFrame>();
            var layers       = new List <Layer>();

            var fontFamily = new Emugen.Image.Drawing.FontFamily(efont.fontPath);
            var font       = CreateFont(efont.fontPath, efont.fontSize);
            var fontSize   = efont.fontSize;

            // layerがボディ部分が足りてない
            {
                var layer = new Layer();
                layer.circleSize = frameSizeMax;
                layer.color      = efont.bodyColor.ToSystemDrawingColor();
                //layer.plane = null;
                layer.plane = new EmugenPlaneImage((int)(frameSizeMax * 2 + 1), (int)(frameSizeMax * 2 + 1));
                //layer.plane.DrawCircle(frameSizeMax, frameSizeMax, frameSizeMax, 1);

                layers.Add(layer);
            }

            //var i = 0;
            foreach (var frame in efont.fontFrames)
            {
                frameSizeMax += frame.size;
                rfontFrames.Insert(0, frame);

                var layer = new Layer();
                layer.circleSize = frameSizeMax;
                layer.color      = frame.color.ToSystemDrawingColor();
                layer.plane      = null;

                layer.plane = new EmugenPlaneImage((int)(frameSizeMax * 2 + 1), (int)(frameSizeMax * 2 + 1));
                layer.plane.DrawCircle(frameSizeMax, frameSizeMax, frameSizeMax, 1);

                layers.Add(layer);

                //if(i==0)
                //{
                //    var image = new EmugenImage(fontFamily.CreateBitmap(text, fontSize, layer.color, (int)frameSize + 1, out info));
                //}
                //i++;
            }
            frameSize = frameSizeMax;

            {
                var i = 0;
                foreach (var layer in layers)
                {
                    Emugen.Image.Drawing.FontFamily.FontStringInfo info;
                    layer.image = new EmugenImage(fontFamily.CreateBitmap(text, fontSize, new Emugen.Image.Drawing.Color(0, 0, 0, 255), (int)frameSize + 1, out info));


                    if (i != 0)
                    {
                        layer.image = layer.image.Filter(layer.plane, 255);
                    }


                    i++;
                }
            }

            {
                var i = 0;
                foreach (var layer in layers)
                {
                    layer.image.FillRGB(new Emugen.Image.Drawing.Color(layer.color));
                    i++;
                }
            }

            for (var i = (layers.Count - 2); i >= 0; i--)
            {
                layers[(layers.Count - 1)].image.DrawImage(layers[i].image);
            }

            {
                var image = layers[2].image;
                var bmp   = image.ToBitmap();
                return(bmp);
            }
        }