#include #include #include #include #include #include #include static const char* kAppSignature = "application/x.vnd-Haiku.ShapeTest"; class TestView : public BView { public: TestView(BRect frame, const char* name, uint32 resizeFlags, uint32 flags); virtual void Draw(BRect updateRect); }; TestView::TestView(BRect frame, const char* name, uint32 resizeFlags, uint32 flags) : BView(frame, name, resizeFlags, flags) { } void TestView::Draw(BRect updateRect) { BRect r(Bounds()); SetDrawingMode(B_OP_ALPHA); SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); SetHighColor(0, 0, 0, 240); class TranslateIterator : public BShapeIterator { public: TranslateIterator() : fOffsetX(0), fOffsetY(0) { } TranslateIterator(float offsetX, float offsetY) : fOffsetX(offsetX), fOffsetY(offsetY) { } void SetOffset(float offsetX, float offsetY) { fOffsetX = offsetX; fOffsetY = offsetY; } virtual status_t IterateMoveTo(BPoint* point) { point->x += fOffsetX; point->y += fOffsetY; return B_OK; } virtual status_t IterateLineTo(int32 lineCount, BPoint* linePts) { while (lineCount--) { linePts->x += fOffsetX; linePts->y += fOffsetY; linePts++; } return B_OK; } virtual status_t IterateBezierTo(int32 bezierCount, BPoint* bezierPts) { while (bezierCount--) { bezierPts[0].x += fOffsetX; bezierPts[0].y += fOffsetY; bezierPts[1].x += fOffsetX; bezierPts[1].y += fOffsetY; bezierPts[2].x += fOffsetX; bezierPts[2].y += fOffsetY; bezierPts += 3; } return B_OK; } virtual status_t IterateArcTo(float& rx, float& ry, float& angle, bool largeArc, bool counterClockWise, BPoint& point) { point.x += fOffsetX; point.y += fOffsetY; return B_OK; } private: float fOffsetX; float fOffsetY; } translator; MovePenTo(B_ORIGIN); const float arcRX = 50; const float arcRY = 80; BShape shape; shape.MoveTo(BPoint(20, 10)); shape.LineTo(BPoint(10, 90)); shape.LineTo(BPoint(90, 100)); shape.ArcTo(arcRX, arcRY, 45, true, true, BPoint(100, 20)); shape.Close(); StrokeShape(&shape); shape.Clear(); shape.MoveTo(BPoint(20, 10)); shape.LineTo(BPoint(10, 90)); shape.LineTo(BPoint(90, 100)); shape.ArcTo(arcRX, arcRY, 45, false, true, BPoint(100, 20)); shape.Close(); translator.SetOffset(10, 10); translator.Iterate(&shape); SetHighColor(140, 30, 50, 255); StrokeShape(&shape); shape.Clear(); shape.MoveTo(BPoint(20, 10)); shape.LineTo(BPoint(10, 90)); shape.LineTo(BPoint(90, 100)); shape.ArcTo(arcRX, arcRY, 45, true, false, BPoint(100, 20)); shape.Close(); translator.SetOffset(20, 20); translator.Iterate(&shape); SetHighColor(140, 130, 50, 255); StrokeShape(&shape); shape.Clear(); shape.MoveTo(BPoint(20, 10)); shape.LineTo(BPoint(10, 90)); shape.LineTo(BPoint(90, 100)); shape.ArcTo(arcRX, arcRY, 45, false, false, BPoint(100, 20)); shape.Close(); translator.SetOffset(30, 30); translator.Iterate(&shape); SetHighColor(40, 130, 150, 255); StrokeShape(&shape); } // #pragma mark - int main(int argc, char** argv) { BApplication app(kAppSignature); BWindow* window = new BWindow(BRect(50.0, 50.0, 300.0, 250.0), "BShape Test", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE); BView* view = new TestView(window->Bounds(), "test", B_FOLLOW_ALL, B_WILL_DRAW); window->AddChild(view); window->Show(); app.Run(); return 0; }