From 79dc21c98ad140f8d0453e53f26e3a3f388e26d7 Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Mon, 28 Oct 2002 19:31:07 +0000 Subject: [PATCH] Forgot to check in renamed files. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1739 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../print/pdf/linepathbuilder/PathView.cpp | 124 ++++++++++++++++++ .../print/pdf/linepathbuilder/PathView.h | 24 ++++ 2 files changed, 148 insertions(+) create mode 100644 src/tests/add-ons/print/pdf/linepathbuilder/PathView.cpp create mode 100644 src/tests/add-ons/print/pdf/linepathbuilder/PathView.h diff --git a/src/tests/add-ons/print/pdf/linepathbuilder/PathView.cpp b/src/tests/add-ons/print/pdf/linepathbuilder/PathView.cpp new file mode 100644 index 0000000000..1dd9dd4bbf --- /dev/null +++ b/src/tests/add-ons/print/pdf/linepathbuilder/PathView.cpp @@ -0,0 +1,124 @@ +#include "PathView.h" +#include "LinePathBuilder.h" +#include + +class ShapeLPB : public LinePathBuilder +{ + BShape fShape; + +protected: + virtual void MoveTo(BPoint p); + virtual void LineTo(BPoint p); + virtual void BezierTo(BPoint* p); + virtual void ClosePath(void); + +public: + ShapeLPB(SubPath *subPath, float penSize, cap_mode capMode, join_mode joinMode, float miterLimit); + BShape *Shape() { return &fShape; } +}; + +ShapeLPB::ShapeLPB(SubPath *subPath, float penSize, cap_mode capMode, join_mode joinMode, float miterLimit) + : LinePathBuilder(subPath, penSize, capMode, joinMode, miterLimit) +{ +} + +void ShapeLPB::MoveTo(BPoint p) +{ + fShape.MoveTo(p); +} + +void ShapeLPB::LineTo(BPoint p) +{ + fShape.LineTo(p); +} + +void ShapeLPB::BezierTo(BPoint p[3]) +{ + fShape.BezierTo(p); +} + +void ShapeLPB::ClosePath(void) +{ + fShape.Close(); +} + +PathView::PathView(BRect rect) + : BView(rect, NULL, B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_SUBPIXEL_PRECISE) { + //SetViewColor(B_TRANSPARENT_COLOR); + fMode = kStroke; + fCurPoint = -1; + fWidth = 16; +} + +void PathView::Draw(BRect updateRect) { + if (fMode == kDrawOutline) { + + } else if (fMode == kStroke) { + const int n = fPath.CountPoints(); + BShape shape; + for (int i = 0; i < n; i++) { + if (i == 0) + shape.MoveTo(fPath.PointAt(i)); + else + shape.LineTo(fPath.PointAt(i)); + } + if (fPath.IsClosed()) shape.Close(); + SetPenSize(fWidth); + StrokeShape(&shape); + + ShapeLPB path(&fPath, fWidth, LineCapMode(), LineJoinMode(), LineMiterLimit()); + path.CreateLinePath(); + SetPenSize(1); + + BPicture picture; + BeginPicture(&picture); + FillShape(path.Shape()); + EndPicture(); + + PushState(); + ClipToPicture(&picture); + SetHighColor(0, 255, 0); + FillRect(Bounds()); + PopState(); + + SetOrigin(200, 0); + SetHighColor(255, 0, 0); + StrokeShape(path.Shape()); + Flush(); + } +} + +void PathView::MouseDown(BPoint point) { + uint32 buttons; + GetMouse(&point, &buttons, false); + + if (buttons == B_SECONDARY_MOUSE_BUTTON) { + fCurPoint = fPath.CountPoints(); + fPath.AddPoint(point); + } else { + float d = 100000000000.0; + for (int i = 0; i < fPath.CountPoints(); i++) { + BPoint p = point - fPath.PointAt(i); + float e = p.x*p.x + p.y*p.y; + if (e < d) { fCurPoint = i; d = e; } + } + fPath.AtPut(fCurPoint, point); + } + Invalidate(); +} + +void PathView::MouseMoved(BPoint point, uint32 transit, const BMessage *message) { + if (fCurPoint != -1) { + fPath.AtPut(fCurPoint, point); + Invalidate(); + } +} + +void PathView::MouseUp(BPoint point) { + fCurPoint = -1; +} + +void PathView::SetClose(bool close) { + if (close) fPath.Close(); + else fPath.Open(); +} \ No newline at end of file diff --git a/src/tests/add-ons/print/pdf/linepathbuilder/PathView.h b/src/tests/add-ons/print/pdf/linepathbuilder/PathView.h new file mode 100644 index 0000000000..b9fc77ea40 --- /dev/null +++ b/src/tests/add-ons/print/pdf/linepathbuilder/PathView.h @@ -0,0 +1,24 @@ +#ifndef VIEW_H +#define VIEW_H + +#include "SubPath.h" +#include + +class PathView : public BView { + SubPath fPath; + enum { + kDrawOutline, + kStroke + } fMode; + int fCurPoint; + float fWidth; + +public: + PathView(BRect rect); + void Draw(BRect updateRect); + void MouseDown(BPoint point); + void MouseUp(BPoint point); + void MouseMoved(BPoint point, uint32 transit, const BMessage *message); + void SetClose(bool close); +}; +#endif