コード例 #1
0
        /// <summary>
        /// This ensures nested image refs get defined when displaying only part of file
        /// </summary>
        /// <param name="defs"></param>
        /// <param name="isRoot"></param>
        public void AddImagesPart(Dictionary <uint, IDefinition> defs, bool isRoot)
        {
            uint imgCount = 0;

            foreach (uint key in defs.Keys)
            {
                IDefinition def = defs[key];
                if (defs[key] is Symbol)
                {
                    Symbol sym = (Symbol)defs[key];
                    for (int i = 0; i < sym.Shapes.Count; i++)
                    {
                        Shape sh = sym.Shapes[i];
                        if (sh.Fill is ImageFill)
                        {
                            ImageFill imf       = (ImageFill)sh.Fill;
                            Image     img       = new Image(imf.ImagePath, imgCount++);
                            string    brushName = imageBrushPrefix + img.Id.ToString();
                            xw.WriteImageBrushRef(brushName, img.Path);
                            imageBrushes.Add(img.Path, brushName);
                            images.Add(img.Path, img);
                        }
                    }
                }
            }
        }
コード例 #2
0
        public override void Metamorphose(LegoUIMeta uiMeta)
        {
            if (MetamorphoseStage == LegoMetamorphoseStage.Completed)
            {
                MetamorphoseStage = LegoMetamorphoseStage.Metamorphosing;
            }

            if (progressbarMeta == null)
            {
                progressbarMeta = uiMeta.NextProgressbar;
                RectMeta        = uiMeta.CurrentRect;
            }

            switch (progressbarStatus)
            {
            case YuProgressbarMetamorphoseStatus.Progressbar:
                MetamorphoseRect(RectMeta);
                progressbarStatus = YuProgressbarMetamorphoseStatus.ImageBackground;
                break;

            case YuProgressbarMetamorphoseStatus.ImageBackground:
                ImageBackground.Metamorphose(progressbarMeta.BackgroundImageRect,
                                             progressbarMeta.BackgroundImageMeta);
                progressbarStatus = YuProgressbarMetamorphoseStatus.RectTransform_FillArea;
                break;

            case YuProgressbarMetamorphoseStatus.RectTransform_FillArea:
                YuLegoUtility.MetamorphoseRect(RectFillArea, progressbarMeta.FillAreaMeta);
                progressbarStatus = YuProgressbarMetamorphoseStatus.Image_Fill;
                break;

            case YuProgressbarMetamorphoseStatus.Image_Fill:
                ImageFill.Metamorphose(progressbarMeta.FillImageRect,
                                       progressbarMeta.FillImageMeta);

                progressbarMeta   = null;
                progressbarStatus = YuProgressbarMetamorphoseStatus.Progressbar;
                MetamorphoseStage = LegoMetamorphoseStage.Completed;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
コード例 #3
0
        static void Main(string[] args)
        {
            var faded = new FadeMethods();

            faded.Setup();
            faded.flafla2();
            faded.Vector1();
            var image = new ImageFill();

            image.GlobalSetup();
            image.IterationSetup();
            image.OriginalGenerator();
            image.NewGenerator();



            //var summary1 = BenchmarkRunner.Run<FadeMethods>();
            var summary2 = BenchmarkRunner.Run <ImageFill>();
        }
コード例 #4
0
        public override void Metamorphose(LegoUIMeta uiMeta)
        {
            if (MetamorphoseStage == LegoMetamorphoseStage.Completed)
            {
                MetamorphoseStage = LegoMetamorphoseStage.Metamorphosing;
            }

            if (sliderMeta == null)
            {
                sliderMeta = uiMeta.NextSlider;
                RectMeta   = uiMeta.CurrentRect;
            }

            switch (metamorphoseStatus)
            {
            case YuLegoSliderMetamorphoseStatus.Slider:
                YuLegoUtility.MetamorphoseRect(RectTransform, uiMeta.CurrentRect);

                direction    = sliderMeta.Direction;
                minValue     = sliderMeta.MinValue;
                maxValue     = sliderMeta.MaxValue == 0?1:sliderMeta.MaxValue;
                wholeNumbers = sliderMeta.IsWholeNumbers;

                if (sliderMeta.Transition == LegoTransition.ColorTint)
                {
                    var colorTintMeta = sliderMeta.ColorTintMeta;

                    colors = new ColorBlock
                    {
                        normalColor      = colorTintMeta.NormalLegoColor.ToColor(),
                        highlightedColor = colorTintMeta.HighlightedLegoColor.ToColor(),
                        pressedColor     = colorTintMeta.PressedLegoColor.ToColor(),
                        disabledColor    = colorTintMeta.DisabledLegoColor.ToColor(),
                        colorMultiplier  = colorTintMeta.ColorMultiplier,
                        fadeDuration     = colorTintMeta.FadeDuration
                    };
                }

                metamorphoseStatus = YuLegoSliderMetamorphoseStatus.Image_Background;
                break;

            case YuLegoSliderMetamorphoseStatus.Image_Background:
                ImageBackground.Metamorphose(sliderMeta.BackgroundImageRect,
                                             sliderMeta.BackgroundImageMeta);
                metamorphoseStatus = YuLegoSliderMetamorphoseStatus.RectTransform_FillArea;
                break;

            case YuLegoSliderMetamorphoseStatus.RectTransform_FillArea:
                YuLegoUtility.MetamorphoseRect(RectFillArea, sliderMeta.FillAreaMeta);
                metamorphoseStatus = YuLegoSliderMetamorphoseStatus.Image_Fill;
                break;

            case YuLegoSliderMetamorphoseStatus.Image_Fill:
                ImageFill.Metamorphose(sliderMeta.FillImageRect, sliderMeta.FillImageMeta);
                metamorphoseStatus = YuLegoSliderMetamorphoseStatus.RectTransform_HandleSlideArea;
                break;

            case YuLegoSliderMetamorphoseStatus.RectTransform_HandleSlideArea:
                YuLegoUtility.MetamorphoseRect(HandleSlideArea, sliderMeta.HandleSlideAreaRect);
                metamorphoseStatus = YuLegoSliderMetamorphoseStatus.Image_Handle;
                break;

            case YuLegoSliderMetamorphoseStatus.Image_Handle:
                HandleImage.Metamorphose(sliderMeta.HandleImageRect, sliderMeta.HandleImageMeta);

                sliderMeta         = null;
                metamorphoseStatus = YuLegoSliderMetamorphoseStatus.Slider;
                MetamorphoseStage  = LegoMetamorphoseStage.Completed;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
コード例 #5
0
ファイル: GdiRenderer.cs プロジェクト: yzqlwt/Swf2XNA
        private void FillPaths(FillStyle fill, List <GraphicsPath> paths)
        {
            Brush b = null;

            foreach (GraphicsPath path in paths)
            {
                path.Transform(translateMatrix);
                switch (fill.FillType)
                {
                case FillType.Solid:
                    SolidFill sf = (SolidFill)fill;
                    b = new SolidBrush(GetColor(sf.Color));
                    break;

                case FillType.Linear:
                    GradientFill        lf   = (GradientFill)fill;
                    RectangleF          rect = Vex.GradientFill.GradientVexRect.SysRectangleF();
                    LinearGradientBrush lgb  = new LinearGradientBrush(
                        rect,
                        Ms.Color.White,
                        Ms.Color.White,
                        1.0F
                        );
                    lgb.InterpolationColors = GetColorBlend(lf);
                    lgb.Transform           = GetMatrix(lf.Transform);
                    lgb.WrapMode            = WrapMode.TileFlipX;
                    ExtendGradientBrush(lgb, path);
                    b = lgb;
                    break;

                case FillType.Radial:
                    GradientFill rf = (GradientFill)fill;

                    ColorBlend cb = GetColorBlend(rf);

                    SolidBrush bkgCol = new SolidBrush(cb.Colors[0]);
                    g.FillPath(bkgCol, path);
                    bkgCol.Dispose();

                    // radial fill part
                    GraphicsPath gp = new GraphicsPath();
                    gp.AddEllipse(Vex.GradientFill.GradientVexRect.SysRectangleF());

                    PathGradientBrush pgb = new PathGradientBrush(gp);
                    pgb.InterpolationColors = GetColorBlend(rf);
                    pgb.Transform           = GetMatrix(rf.Transform);
                    b = pgb;
                    break;

                case FillType.Image:
                    ImageFill imgFill = (ImageFill)fill;
                    Bitmap    bmp     = new Bitmap(imgFill.ImagePath);
                    b = new TextureBrush(bmp);
                    break;

                default:
                    b = new SolidBrush(Ms.Color.Red);
                    break;
                }
                g.FillPath(b, path);
            }
            if (b != null)
            {
                b.Dispose();
            }
        }
コード例 #6
0
        protected override void RenderPath(FillStyle fs, StrokeStyle ss, List <IShapeData> sh, bool silverlight)
        {
            // <Path Fill="#FFFF0000"
            // StrokeThickness="0.00491913" StrokeLineJoin="Round" Stroke="#FF014393"
            // Data="M 196.667,4L 388.667,100L 388.667,292L 196.667,388L 4.66669,292L 4.66669,100L 196.667,4 Z "/>
            if (sh.Count == 0)
            {
                return;
            }

            xw.WriteStartElement("Path");

            bool isGradient    = false;
            bool isTiledBitmap = false;

            if (fs != null)
            {
                if (fs.FillType == FillType.Solid)
                {
                    Color c = ((SolidFill)fs).Color;
                    xw.WriteStartAttribute("Fill");
                    xw.WriteColor(c);
                    xw.WriteEndAttribute();

                    // try to clean up faint edges
                    if (ss == null && c != new Color(0xFF, 0xFF, 0xFF) && c.A != 0)
                    {
                        ss = new SolidStroke(0.3F, c);
                    }
                }
                else if (
                    fs.FillType == FillType.Linear ||
                    fs.FillType == FillType.Radial ||
                    fs.FillType == FillType.Focal)
                {
                    isGradient = true;
                }
                else if (fs.FillType == FillType.Image)
                {
                    // Fill="{StaticResource vb_1}"
                    ImageFill img = (ImageFill)fs;
                    if (img.IsTiled || silverlight)
                    {
                        isTiledBitmap = true;// this causes bitmap to be written inline
                    }
                    else
                    {
                        string brushName = imageBrushes[img.ImagePath];
                        xw.WriteStartAttribute("Fill");
                        xw.WriteValue("{StaticResource " + brushName + "}");
                        xw.WriteEndAttribute();
                    }
                }
            }
            if (ss != null)
            {
                if (ss is SolidStroke)
                {
                    // StrokeThickness="3" StrokeLineJoin="Round" Stroke="#FF014393"
                    // StrokeStartLineCap="Round"
                    // StrokeEndLineCap="Round"
                    SolidStroke st = (SolidStroke)ss;

                    xw.WriteStartAttribute("StrokeThickness");
                    xw.WriteFloat(st.LineWidth);
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("StrokeLineJoin");
                    xw.WriteString("Round");
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("StrokeStartLineCap");
                    xw.WriteString("Round");
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("StrokeEndLineCap");
                    xw.WriteString("Round");
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("Stroke");
                    xw.WriteColor(st.Color);
                    xw.WriteEndAttribute();
                }
            }
            float minX = float.PositiveInfinity;
            float minY = float.PositiveInfinity;
            float maxX = float.NegativeInfinity;
            float maxY = float.NegativeInfinity;

            xw.WriteStartAttribute("Data");

            xw.WriteMoveTo(sh[0].StartPoint);

            Point lastPoint = sh[0].StartPoint;

            for (int i = 0; i < sh.Count; i++)
            {
                IShapeData sd = sh[i];
                if (lastPoint != sd.StartPoint)
                {
                    xw.WriteMoveTo(sd.StartPoint);
                }
                switch (sd.SegmentType)
                {
                case SegmentType.Line:
                    xw.WriteLineTo(sd.EndPoint);
                    lastPoint = sd.EndPoint;
                    break;

                case SegmentType.CubicBezier:
                    CubicBezier cb = (CubicBezier)sd;
                    xw.WriteCubicCurveTo(cb.Control0, cb.Control1, cb.Anchor1);
                    lastPoint = cb.EndPoint;
                    minX      = Math.Min(minX, cb.Control0.X);
                    maxX      = Math.Max(maxX, cb.Control0.X);
                    minY      = Math.Min(minY, cb.Control0.Y);
                    maxY      = Math.Max(maxY, cb.Control0.Y);
                    minX      = Math.Min(minX, cb.Control1.X);
                    maxX      = Math.Max(maxX, cb.Control1.X);
                    minY      = Math.Min(minY, cb.Control1.Y);
                    maxY      = Math.Max(maxY, cb.Control1.Y);
                    break;

                case SegmentType.QuadraticBezier:
                    QuadBezier qb = (QuadBezier)sd;
                    xw.WriteQuadraticCurveTo(qb.Control, qb.Anchor1);
                    lastPoint = qb.EndPoint;
                    minX      = Math.Min(minX, qb.Control.X);
                    maxX      = Math.Max(maxX, qb.Control.X);
                    minY      = Math.Min(minY, qb.Control.Y);
                    maxY      = Math.Max(maxY, qb.Control.Y);
                    break;
                }

                // need bounds for gradient :(
                if (isGradient)
                {
                    minX = Math.Min(minX, sd.StartPoint.X);
                    maxX = Math.Max(maxX, sd.StartPoint.X);
                    minY = Math.Min(minY, sd.StartPoint.Y);
                    maxY = Math.Max(maxY, sd.StartPoint.Y);

                    minX = Math.Min(minX, sd.EndPoint.X);
                    maxX = Math.Max(maxX, sd.EndPoint.X);
                    minY = Math.Min(minY, sd.EndPoint.Y);
                    maxY = Math.Max(maxY, sd.EndPoint.Y);
                }
            }
            xw.WriteEndAttribute();

            if (isGradient)
            {
                GradientFill gf = (GradientFill)fs;
                // need a gradient def here
                if (fs.FillType == FillType.Linear)
                {
                    //<Path.Fill>
                    //    <LinearGradientBrush StartPoint="0.14706,0.532137" EndPoint="1.14962,0.55353">
                    //        <LinearGradientBrush.GradientStops>
                    //            <GradientStop Color="#FF4A4A4A" Offset="0"/>
                    //            <GradientStop Color="#FFB0B0B0" Offset="0.412067"/>
                    //            <GradientStop Color="#FFBBBBBB" Offset="0.638141"/>
                    //            <GradientStop Color="#FF545454" Offset="1"/>
                    //        </LinearGradientBrush.GradientStops>
                    //    </LinearGradientBrush>
                    //</Path.Fill>
                    xw.WriteStartElement("Path.Fill");

                    xw.WriteStartElement("LinearGradientBrush");

                    Matrix           m    = gf.Transform;
                    Rectangle        r    = GradientFill.GradientVexRect;
                    sysDraw2D.Matrix m2   = new sysDraw2D.Matrix(m.ScaleX, m.Rotate0, m.Rotate1, m.ScaleY, m.TranslateX, m.TranslateY);
                    float            midY = r.Point.Y + (r.Size.Height / 2);
                    sysDraw.PointF   pt0  = new sysDraw.PointF(r.Point.X, midY);
                    sysDraw.PointF   pt1  = new sysDraw.PointF(r.Point.X + r.Size.Width, midY);
                    sysDraw.PointF[] pts  = new sysDraw.PointF[] { pt0, pt1 };
                    m2.TransformPoints(pts);

                    float ratX = 1 / (maxX - minX);
                    float ratY = 1 / (maxY - minY);
                    float d0x  = (pts[0].X - minX) * ratX;
                    float d0y  = (pts[0].Y - minY) * ratY;
                    float d1x  = (pts[1].X - minX) * ratX;
                    float d1y  = (pts[1].Y - minY) * ratY;

                    xw.WriteStartAttribute("StartPoint");
                    xw.WritePoint(new Point(d0x, d0y));
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("EndPoint");
                    xw.WritePoint(new Point(d1x, d1y));
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("SpreadMethod");
                    xw.WriteValue("Pad");
                    xw.WriteEndAttribute();

                    xw.WriteStartElement("LinearGradientBrush.GradientStops");
                    for (int i = 0; i < gf.Stops.Count; i++)
                    {
                        xw.WriteStartElement("GradientStop");

                        xw.WriteStartAttribute("Color");
                        xw.WriteColor(gf.Fills[i]);
                        xw.WriteEndAttribute();

                        xw.WriteStartAttribute("Offset");
                        xw.WriteFloat(gf.Stops[i]);
                        xw.WriteEndAttribute();

                        xw.WriteEndElement(); // GradientStop
                    }
                    xw.WriteEndElement();     // LinearGradientBrush.GradientStops
                    xw.WriteEndElement();     // LinearGradientBrush
                    xw.WriteEndElement();     // Path.Fill
                }
                else if (fs.FillType == FillType.Radial)
                {
                    //<Ellipse.Fill>
                    //    <RadialGradientBrush RadiusX="0.622359" RadiusY="0.604589" Center="0.5,0.5" GradientOrigin="0.5,0.5">
                    //        <RadialGradientBrush.RelativeTransform>
                    //            <TransformGroup/>
                    //        </RadialGradientBrush.RelativeTransform>
                    //        <GradientStop Color="#95000000" Offset="0.347222"/>
                    //        <GradientStop Color="#007877A7" Offset="0.773148"/>
                    //    </RadialGradientBrush>
                    //</Ellipse.Fill>

                    xw.WriteStartElement("Path.Fill");

                    xw.WriteStartElement("RadialGradientBrush");

                    Matrix           m    = gf.Transform;
                    Rectangle        r    = GradientFill.GradientVexRect;
                    sysDraw2D.Matrix m2   = new sysDraw2D.Matrix(m.ScaleX, m.Rotate0, m.Rotate1, m.ScaleY, m.TranslateX, m.TranslateY);
                    float            midX = r.Point.X + (r.Size.Width / 2);
                    float            midY = r.Point.Y + (r.Size.Height / 2);
                    sysDraw.PointF   pt0  = new sysDraw.PointF(midX, midY);                     // center
                    sysDraw.PointF   pt1  = new sysDraw.PointF(r.Point.X + r.Size.Width, midY); // radius vector
                    sysDraw.PointF[] pts  = new sysDraw.PointF[] { pt0, pt1 };
                    m2.TransformPoints(pts);

                    float ratX = 1 / (maxX - minX);
                    float ratY = 1 / (maxY - minY);
                    float d0x  = (pts[0].X - minX) * ratX;
                    float d0y  = (pts[0].Y - minY) * ratY;
                    float d1x  = (pts[1].X - pts[0].X);
                    //float d1y = (pts[1].Y - pts[0].Y) * ratY;

                    float rad = (float)Math.Sqrt(d1x * d1x);
                    xw.WriteStartAttribute("RadiusX");
                    xw.WriteFloat(rad * ratX);
                    xw.WriteEndAttribute();
                    xw.WriteStartAttribute("RadiusY");
                    xw.WriteFloat(rad * ratY);
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("Center");
                    xw.WritePoint(new Point(d0x, d0y));
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("GradientOrigin");
                    xw.WritePoint(new Point(d0x, d0y));
                    xw.WriteEndAttribute();

                    xw.WriteStartAttribute("SpreadMethod");
                    xw.WriteValue("Pad");
                    xw.WriteEndAttribute();

                    //xw.WriteStartElement("RadialGradientBrush.GradientStops");
                    for (int i = 0; i < gf.Stops.Count; i++)
                    {
                        xw.WriteStartElement("GradientStop");

                        xw.WriteStartAttribute("Color");
                        xw.WriteColor(gf.Fills[i]);
                        xw.WriteEndAttribute();

                        xw.WriteStartAttribute("Offset");
                        xw.WriteFloat(1 - gf.Stops[i]); // xaml fill is reversed from gdi
                        xw.WriteEndAttribute();

                        xw.WriteEndElement(); // GradientStop
                    }
                    //xw.WriteEndElement(); // LinearGradientBrush.GradientStops
                    xw.WriteEndElement(); // LinearGradientBrush
                    xw.WriteEndElement(); // Path.Fill
                }
            }
            else if (isTiledBitmap)
            {
                //<Path.Fill>
                //   <ImageBrush ImageSource="Resources\bmp_1.jpg" TileMode="Tile" RelativeTransform=".2,0,0,.2,0,0"/>
                //</Path.Fill>

                ImageFill img = (ImageFill)fs;

                xw.WriteStartElement("Path.Fill");
                xw.WriteStartElement("ImageBrush");

                xw.WriteStartAttribute("ImageSource");
                xw.WriteValue(img.ImagePath);
                xw.WriteEndAttribute();

                if (!silverlight)
                {
                    xw.WriteStartAttribute("TileMode");
                    xw.WriteValue("Tile");
                    xw.WriteEndAttribute();
                }

                //xw.WriteStartAttribute("ViewportUnits");
                //xw.WriteValue("Absolute");
                //xw.WriteEndAttribute();

                Matrix pMatrix = ApplyMatrixToShape(sh, img.Matrix, images[img.ImagePath].StrokeBounds);
                //Matrix pMatrix = ApplyMatrixToImage(img.Matrix, images[img.ImagePath].Bounds);
                xw.WriteStartAttribute("RelativeTransform");
                xw.WriteMatrix(pMatrix);
                //xw.WriteMatrix(img.Matrix);
                xw.WriteEndAttribute();

                xw.WriteEndElement(); // Path.Fill
                xw.WriteEndElement(); // ImageBrush
            }
            xw.WriteEndElement();     // Path
        }
コード例 #7
0
 public ImageWidget(string imageId, ImageFill imageFill)
     : base() 
 {
     ImageId = imageId;
     ImageFill = imageFill;
 }
コード例 #8
0
ファイル: SVGRenderer.cs プロジェクト: lardratboy/it3rate
        protected override void RenderPath(FillStyle fs, StrokeStyle ss, List <IShapeData> sh, bool silverlight)
        {
            // <Path Fill="#FFFF0000"
            // StrokeThickness="0.00491913" StrokeLineJoin="Round" Stroke="#FF014393"
            // Data="M 196.667,4L 388.667,100L 388.667,292L 196.667,388L 4.66669,292L 4.66669,100L 196.667,4 Z "/>
            if (sh.Count == 0)
            {
                return;
            }
            xw.WriteStartElement("path");

            if (fs != null)
            {
                switch (fs.FillType)
                {
                case FillType.Solid:
                    Color c = ((SolidFill)fs).Color;
                    xw.WriteStartAttribute("fill");
                    xw.WriteColor(c);
                    xw.WriteEndAttribute();

                    // try to clean up faint edges
                    if (ss == null && c != new Color(0xFF, 0xFF, 0xFF) && c.A != 0)
                    {
                        ss = new SolidStroke(0.3F, c);
                    }
                    break;

                case FillType.Linear:
                case FillType.Radial:
                case FillType.Focal:
                    GradientFill gf = (GradientFill)fs;
                    // fill="url(#lg)"
                    xw.WriteStartAttribute("fill");
                    xw.WriteValue("url(#gf_" + gf.TagId + ")");
                    xw.WriteEndAttribute();
                    break;

                case FillType.Image:
                    ImageFill img = (ImageFill)fs;
                    if (img.IsTiled)
                    {
                        //isTiledBitmap = true;
                    }
                    break;
                }
            }
            else
            {
                xw.WriteStartAttribute("fill");
                xw.WriteValue("none");
                xw.WriteEndAttribute();
            }


            if (ss != null)
            {
                if (ss is SolidStroke)
                {
                    // StrokeThickness="3" StrokeLineJoin="Round" Stroke="#FF014393"
                    // StrokeStartLineCap="Round"
                    // StrokeEndLineCap="Round"
                    SolidStroke st = (SolidStroke)ss;

                    if (st.LineWidth != 0.3f)
                    {
                        xw.WriteStartAttribute("stroke-width");
                        xw.WriteFloat(st.LineWidth);
                        xw.WriteEndAttribute();
                    }

                    xw.WriteStartAttribute("stroke");
                    xw.WriteColor(st.Color);
                    xw.WriteEndAttribute();
                }
            }

            // todo: this is pre defined in svg
            //if (isTiledBitmap)
            //{
            //    //<Path.Fill>
            //    //   <ImageBrush ImageSource="Resources\bmp_1.jpg" TileMode="Tile" RelativeTransform=".2,0,0,.2,0,0"/>
            //    //</Path.Fill>

            //    ImageFill img = (ImageFill)fs;

            //    xw.WriteStartElement("Path.Fill");
            //    xw.WriteStartElement("ImageBrush");

            //    xw.WriteStartAttribute("ImageSource");
            //    xw.WriteValue(img.ImagePath);
            //    xw.WriteEndAttribute();

            //    if (!silverlight)
            //    {
            //        xw.WriteStartAttribute("TileMode");
            //        xw.WriteValue("Tile");
            //        xw.WriteEndAttribute();
            //    }

            //    Matrix pMatrix = ApplyMatrixToShape(sh, img.Matrix, images[img.ImagePath].StrokeBounds);
            //    //Matrix pMatrix = ApplyMatrixToImage(img.Matrix, images[img.ImagePath].Bounds);
            //    xw.WriteStartAttribute("RelativeTransform");
            //    xw.WriteMatrix(pMatrix);
            //    //xw.WriteMatrix(img.Matrix);
            //    xw.WriteEndAttribute();

            //    xw.WriteEndElement(); // Path.Fill
            //    xw.WriteEndElement(); // ImageBrush
            //}


            xw.WriteStartAttribute("d");
            xw.WriteMoveTo(sh[0].StartPoint);
            Point lastPoint = sh[0].StartPoint;

            for (int i = 0; i < sh.Count; i++)
            {
                IShapeData sd = sh[i];
                if (lastPoint != sd.StartPoint)
                {
                    xw.WriteMoveTo(sd.StartPoint);
                }
                switch (sd.SegmentType)
                {
                case SegmentType.Line:
                    xw.WriteLineTo(sd.EndPoint);
                    lastPoint = sd.EndPoint;
                    break;

                case SegmentType.CubicBezier:
                    CubicBezier cb = (CubicBezier)sd;
                    xw.WriteCubicCurveTo(cb.Control0, cb.Control1, cb.Anchor1);
                    lastPoint = cb.EndPoint;
                    break;

                case SegmentType.QuadraticBezier:
                    QuadBezier qb = (QuadBezier)sd;
                    xw.WriteQuadraticCurveTo(qb.Control, qb.Anchor1);
                    lastPoint = qb.EndPoint;
                    break;
                }
            }
            xw.WriteEndAttribute();
            xw.WriteEndElement(); // Path
        }