예제 #1
0
파일: Figure.cs 프로젝트: djpnewton/ddraw
        protected override void PaintBody(DGraphics dg)
        {
#if BEHAVIOURS
            // select paint properties
            DColor Stroke = this.Stroke;
            double Alpha = this.Alpha;
            if (MouseOver)
            {
                if (MouseOverBehaviour.SetStroke)
                    Stroke = MouseOverBehaviour.Stroke;
                if (MouseOverBehaviour.SetAlpha)
                    Alpha = MouseOverBehaviour.Alpha;
            }
#endif
            // do painting
            if (Points != null && Points.Count > 1)
            {
                if (UseRealAlpha && Alpha != 1 && StrokeWidth > 0 && (StartMarker != DMarker.None || EndMarker != DMarker.None))
                {
                    DPoints smp;
                    if (StartMarker != DMarker.None)
                        smp = GetStartMarkerPoints();
                    else
                    {
                        if (Points.Count > 1)
                            smp = MarkerHelper.MarkerPoints(DMarker.Square, Points[0], Points[1], MarkerSize);
                        else
                            smp = new DPoints();
                    }
                    DPoints emp;
                    if (EndMarker != DMarker.None)
                        emp = GetEndMarkerPoints();
                    else
                    {
                        if (Points.Count > 1)
                            emp = MarkerHelper.MarkerPoints(DMarker.Square, Points[Points.Count - 1], Points[Points.Count - 2], MarkerSize);
                        else
                            emp = new DPoints();
                    }
                    DRect R = StrokeHelper.RectIncludingStrokeWidth(GetEncompassingRect(), StrokeWidth)
                        .Union(smp.Bounds()).Union(emp.Bounds());

                    dg.StartGroup(X, Y, R.Width, R.Height, X - R.X, Y - R.Y);
                    dg.DrawPolyline(Points, Stroke, 1, StrokeWidth, StrokeStyle, StrokeJoin, StrokeCap);
                    if (StartMarker != DMarker.None)
                        dg.FillPolygon(GetStartMarkerPoints(), Stroke, 1);
                    if (EndMarker != DMarker.None)
                        dg.FillPolygon(GetEndMarkerPoints(), Stroke, 1);
                    dg.DrawGroup(Alpha);
                }
                else
                {
                    dg.DrawPolyline(Points, Stroke, Alpha, StrokeWidth, StrokeStyle, StrokeJoin, StrokeCap);
                    if (StartMarker != DMarker.None)
                        dg.FillPolygon(GetStartMarkerPoints(), Stroke, Alpha);
                    if (EndMarker != DMarker.None)
                        dg.FillPolygon(GetEndMarkerPoints(), Stroke, Alpha);
                }
            }
        }
예제 #2
0
        private void PaintWmf(DGraphics dg)
        {
            dg.Save();
            dg.Clip(Rect);
            // store current matrix
            DMatrix m = dg.SaveTransform();
            // clear gdi objects
            WmfGdiObjects.Clear();
            // check for placeable key
            if (WmfIsPlaceable)
            {
                bytesRead = 0;
                // read placeable header
                placeable = GetWmfPlaceable();
                // checksum
                int sum = 0;
                for (int i = 0; i < (Marshal.SizeOf(typeof(Wmf.Placeable)) - 2 /* WmfPlaceable.Checksum is UInt16 */) / 2; i++)
                    sum = sum ^ BitConverter.ToUInt16(ImageData, i * 2);
                if (sum != placeable.Checksum)
                    System.Diagnostics.Debug.Fail("checksum failed");
                // init matrix
                WmfUpdateMaxtrix(dg, m);
                // read header
                header = GetWmfHeader();
                // iterate draw commands
                bool records = true;
                while (records)
                {
                    int bytesReadPlusFuncHeaderSize = bytesRead;
                    Wmf.FuncHeader fh = GetWmfFuncHeader();
                    bytesReadPlusFuncHeaderSize += (int)fh.Size * 2;
                    bool breakme = false;
                    switch (fh.Function)
                    {
                        case Wmf.SaveDC:
                            break;
                        case Wmf.CreatePalette:
                            break;
                        case Wmf.SetBkMode:
                            int bkMode = GetInt16();
                            break;
                        case Wmf.SetMapMode:
                            int mapMode = GetInt16();
                            break;
                        case Wmf.SetROP2:
                            break;
                        case Wmf.SetRelabs:
                            break;
                        case Wmf.SetPolyFillMode:
                            int polyfillMode = GetInt16();
                            if (polyfillMode == Wmf.PfmAlernate)
                                fillRule = DFillRule.EvenOdd;
                            else
                                fillRule = DFillRule.Winding;
                            break;
                        case Wmf.SetStretchBltMode:
                            break;
                        case Wmf.DeleteObject:
                            WmfDeleteGdiObject(GetInt16());
                            break;
                        case Wmf.RestoreDC:
                            break;
                        case Wmf.SelectObject:
                            WmfSelectGdiObject(GetInt16());
                            break;
                        case Wmf.SetTextAlign:
                            break;
                        case Wmf.SetBkColor:
                            break;
                        case Wmf.SetTextColor:
                            break;
                        case Wmf.SetWindowOrg:
                            winY = GetInt16();
                            winX = GetInt16();
                            WmfUpdateMaxtrix(dg, m);
                            break;
                        case Wmf.SetWindowExt:
                            winHeight = GetInt16();
                            winWidth = GetInt16();
                            WmfUpdateMaxtrix(dg, m);
                            break;
                        case Wmf.SetViewportOrg:
                            viewY = GetInt16();
                            viewX = GetInt16();
                            //wmfUpdateMaxtrix(dg, m);
                            break;
                        case Wmf.SetViewportExt:
                            viewHeight = GetInt16();
                            viewWidth = GetInt16();
                            //wmfUpdateMaxtrix(dg, m);
                            break;
                        case Wmf.LineTo:
                            DPoint pt = GetPoint();
                            if (StrokeValid)
                                dg.DrawLine(curPoint, pt, stroke, 1, strokeStyle, strokeWidth, strokeCap);
                            curPoint = pt;
                            break;
                        case Wmf.MoveTo:
                            curPoint = GetPoint();
                            break;
                        case Wmf.SelectPalette:
                            break;
                        case Wmf.CreatePenIndirect:
                            int gdiPenStyle = GetInt16();
                            int widthX = GetInt16();
                            int widthY = GetInt16();
                            DColor penColor = GetColor();
                            double penWidth = widthX;
                            WmfApplyTransforms(ref penWidth);
                            DStrokeStyle penStyle = DStrokeStyle.Solid;
                            DStrokeCap penCap = DStrokeCap.Round;
                            DStrokeJoin penJoin = DStrokeJoin.Round;

                            if ((gdiPenStyle & Wmf.PS_DASHDOTDOT) == Wmf.PS_DASHDOTDOT)
                                penStyle = DStrokeStyle.DashDotDot;
                            else if ((gdiPenStyle & Wmf.PS_DASHDOT) == Wmf.PS_DASHDOT)
                                penStyle = DStrokeStyle.DashDot;
                            else if ((gdiPenStyle & Wmf.PS_DOT) == Wmf.PS_DOT)
                                penStyle = DStrokeStyle.Dot;
                            else if ((gdiPenStyle & Wmf.PS_DASH) == Wmf.PS_DASH)
                                penStyle = DStrokeStyle.Dash;
                            else
                                penStyle = DStrokeStyle.Solid;

                            if ((gdiPenStyle & Wmf.PS_ENDCAP_FLAT) == Wmf.PS_ENDCAP_FLAT)
                                penCap = DStrokeCap.Butt;
                            else if ((gdiPenStyle & Wmf.PS_ENDCAP_SQUARE) == Wmf.PS_ENDCAP_SQUARE)
                                penCap = DStrokeCap.Square;
                            else
                                penCap = DStrokeCap.Round;

                            if ((gdiPenStyle & Wmf.PS_JOIN_MITER) == Wmf.PS_JOIN_MITER)
                                penJoin = DStrokeJoin.Mitre;
                            else if ((gdiPenStyle & Wmf.PS_JOIN_BEVEL) == Wmf.PS_JOIN_BEVEL)
                                penJoin = DStrokeJoin.Bevel;
                            else
                                penJoin = DStrokeJoin.Round;

                            if ((gdiPenStyle & Wmf.PS_NULL) == Wmf.PS_NULL)
                                WmfAddGdiObject(new WmfGdiPen(DColor.Empty, penWidth, penStyle, penCap, penJoin));
                            else
                                WmfAddGdiObject(new WmfGdiPen(penColor, penWidth, penStyle, penCap, penJoin));
                            break;
                        case Wmf.CreateFontIndirect:
                            WmfAddGdiObject("font");
                            break;
                        case Wmf.CreateBrushIndirect:
                            int brushStyle = GetInt16();
                            DColor brushColor = GetColor();
                            int brushHatch = GetInt16();
                            if ((brushStyle & Wmf.BS_NULL) == Wmf.BS_NULL)
                                WmfAddGdiObject(new WmfGdiBrush(DColor.Empty));
                            else
                                WmfAddGdiObject(new WmfGdiBrush(brushColor));
                            break;
                        case Wmf.Polygon:
                            DPoints polygonPts = GetPolyPoints(GetInt16(), true);
                            if (FillValid)
                                dg.FillPolygon(polygonPts, fill, 1, fillRule);
                            if (StrokeValid)
                                dg.DrawPolyline(polygonPts, stroke, 1, strokeWidth, strokeStyle, strokeJoin, strokeCap);
                            break;
                        case Wmf.Polyline:
                            DPoints polylinePts = GetPolyPoints(GetInt16(), false);
                            if (StrokeValid)
                                dg.DrawPolyline(polylinePts, stroke, 1, strokeWidth, strokeStyle, strokeJoin, strokeCap);
                            break;
                        case Wmf.Ellipse:
                            goto case Wmf.Rectangle;
                        case Wmf.Rectangle:
                            DPoint br = GetPoint();
                            DPoint tl = GetPoint();
                            if (FillValid)
                            {
                                if (fh.Function == Wmf.Rectangle)
                                    dg.FillRect(tl.X, tl.Y, br.X - tl.X, br.Y - tl.Y, fill, 1);
                                else if (fh.Function == Wmf.Ellipse)
                                    dg.FillEllipse(tl.X, tl.Y, br.X - tl.X, br.Y - tl.Y, fill, 1);
                            }
                            if (StrokeValid)
                            {
                                if (fh.Function == Wmf.Rectangle)
                                    dg.DrawRect(tl.X, tl.Y, br.X - tl.X, br.Y - tl.Y, stroke, 1, strokeWidth, strokeStyle, strokeJoin);
                                else if (fh.Function == Wmf.Ellipse)
                                    dg.DrawEllipse(tl.X, tl.Y, br.X - tl.X, br.Y - tl.Y, stroke, 1, strokeWidth, strokeStyle);
                            }
                            break;
                        case Wmf.PolyPolygon:
                            // find out how many points
                            int numPolygons = GetInt16();
                            int[] numPoints = new int[numPolygons];
                            for (int i = 0; i < numPolygons; i++)
                                numPoints[i] = GetInt16();
                            // join polygons together
                            DPoints polyPolyPoints = new DPoints();
                            for (int i = 0; i < numPolygons; i++)
                                foreach (DPoint polyPolyPt in GetPolyPoints(numPoints[i], true))
                                    polyPolyPoints.Add(polyPolyPt);
                            // draw
                            if (FillValid)
                                dg.FillPolygon(polyPolyPoints, fill, 1, fillRule);
                            if (StrokeValid)
                                dg.DrawPolyline(polyPolyPoints, stroke, 1, strokeWidth, strokeStyle, strokeJoin, strokeCap);
                            break;
                        case Wmf.Escape:
                            break;
                        default:
                            breakme = true;
                            break;
                    }

                    if (bytesRead != bytesReadPlusFuncHeaderSize)
                        bytesRead = bytesReadPlusFuncHeaderSize;
                    if (breakme)
                        break;
                }
            }
            dg.Restore();
        }
예제 #3
0
 protected override void PaintBody(DGraphics dg)
 {
     #if BEHAVIOURS
     // select paint properties
     DColor Fill = this.Fill;
     DColor Stroke = this.Stroke;
     double Alpha = this.Alpha;
     if (MouseOver)
     {
         if (MouseOverBehaviour.SetFill)
             Fill = MouseOverBehaviour.Fill;
         if (MouseOverBehaviour.SetStroke)
             Stroke = MouseOverBehaviour.Stroke;
         if (MouseOverBehaviour.SetAlpha)
             Alpha = MouseOverBehaviour.Alpha;
     }
     #endif
     // draw
     DPoints pts = DrawPoints();
     if (UseRealAlpha && Alpha != 1 && StrokeWidth > 0)
     {
         dg.StartGroup(X, Y, Width + StrokeWidth, Height + StrokeWidth, SwHalf, SwHalf);
         dg.FillPolygon(pts, Fill, 1);
         dg.DrawPolyline(pts, Stroke, 1, StrokeWidth, StrokeStyle, StrokeJoin, StrokeCap);
         dg.DrawGroup(Alpha);
     }
     else
     {
         dg.FillPolygon(pts, Fill, Alpha);
         dg.DrawPolyline(pts, Stroke, Alpha, StrokeWidth, StrokeStyle, StrokeJoin, StrokeCap);
     }
 }