From 54730332d20e5d1fba4027c9598b9449854048ed Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Sun, 12 Aug 2007 13:01:52 +0000 Subject: [PATCH] Added tests for basic drawing operations. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21907 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../flatten_picture/PictureTestCases.cpp | 326 ++++++++++++++++-- .../flatten_picture/PictureTestWindow.cpp | 44 ++- .../flatten_picture/PictureTestWindow.h | 6 +- 3 files changed, 325 insertions(+), 51 deletions(-) diff --git a/src/tests/kits/interface/flatten_picture/PictureTestCases.cpp b/src/tests/kits/interface/flatten_picture/PictureTestCases.cpp index e3ce3adcb1..a58a9a9609 100644 --- a/src/tests/kits/interface/flatten_picture/PictureTestCases.cpp +++ b/src/tests/kits/interface/flatten_picture/PictureTestCases.cpp @@ -8,12 +8,33 @@ #include "PictureTestCases.h" -void testEmptyPicture(BView *view, BRect frame) +static const rgb_color kBlack = {0, 0, 0}; +static const rgb_color kWhite = {255, 255, 255}; +static const rgb_color kRed = {255, 0, 0}; +static const rgb_color kGreen = {0, 255, 0}; +static const rgb_color kBlue = {0, 0, 255}; + +static BPoint centerPoint(BRect rect) +{ + int x = (int)(rect.left + rect.IntegerWidth() / 2); + int y = (int)(rect.top + rect.IntegerHeight() / 2); + return BPoint(x, y); +} + +static void testNoOp(BView *view, BRect frame) { // no op } -void testDrawString(BView *view, BRect frame) +static void testDrawChar(BView *view, BRect frame) +{ + view->MovePenTo(frame.left, frame.bottom - 5); + view->DrawChar('A'); + + view->DrawChar('B', BPoint(frame.left + 20, frame.bottom - 5)); +} + +static void testDrawString(BView *view, BRect frame) { BFont font; view->GetFont(&font); @@ -21,43 +42,200 @@ void testDrawString(BView *view, BRect frame) font.GetHeight(&height); float baseline = frame.bottom - height.descent; // draw base line - view->SetHighColor(0, 255, 0); + view->SetHighColor(kGreen); view->StrokeLine(BPoint(frame.left, baseline - 1), BPoint(frame.right, baseline -1)); - view->SetHighColor(0, 0, 0); + view->SetHighColor(kBlack); view->DrawString("Haiku [ÖÜÄöüä]", BPoint(frame.left, baseline)); } -void testFillRed(BView *view, BRect frame) +static void testDrawStringWithLength(BView *view, BRect frame) +{ + BFont font; + view->GetFont(&font); + font_height height; + font.GetHeight(&height); + float baseline = frame.bottom - height.descent; + // draw base line + view->SetHighColor(kGreen); + view->StrokeLine(BPoint(frame.left, baseline - 1), BPoint(frame.right, baseline -1)); + + view->SetHighColor(kBlack); + view->DrawString("Haiku [ÖÜÄöüä]", 13, BPoint(frame.left, baseline)); +} + +static void testFillArc(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->FillArc(frame, 45, 180); +} + +static void testStrokeArc(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->StrokeArc(frame, 45, 180); +} + +static void testFillBezier(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BPoint points[4]; + points[0] = BPoint(frame.left, frame.bottom); + points[1] = BPoint(frame.left, frame.top); + points[1] = BPoint(frame.left, frame.top); + points[3] = BPoint(frame.right, frame.top); + view->FillBezier(points); +} + +static void testStrokeBezier(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BPoint points[4]; + points[0] = BPoint(frame.left, frame.bottom); + points[1] = BPoint(frame.left, frame.top); + points[1] = BPoint(frame.left, frame.top); + points[3] = BPoint(frame.right, frame.top); + view->StrokeBezier(points); +} + +static void testFillEllipse(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->FillEllipse(frame); + + view->SetHighColor(kRed); + float r = frame.Width() / 3; + float s = frame.Height() / 4; + view->FillEllipse(centerPoint(frame), r, s); +} + +static void testStrokeEllipse(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->StrokeEllipse(frame); + + view->SetHighColor(kRed); + float r = frame.Width() / 3; + float s = frame.Height() / 4; + view->StrokeEllipse(centerPoint(frame), r, s); +} + +static void testFillPolygon(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + + BPoint points[4]; + points[0] = BPoint(frame.left, frame.top); + points[1] = BPoint(frame.right, frame.bottom); + points[2] = BPoint(frame.right, frame.top); + points[3] = BPoint(frame.left, frame.bottom); + + view->FillPolygon(points, 4); +} + +static void testStrokePolygon(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + + BPoint points[4]; + points[0] = BPoint(frame.left, frame.top); + points[1] = BPoint(frame.right, frame.bottom); + points[2] = BPoint(frame.right, frame.top); + points[3] = BPoint(frame.left, frame.bottom); + + view->StrokePolygon(points, 4); +} + +static void testFillRect(BView *view, BRect frame) { frame.InsetBy(2, 2); - view->SetHighColor(255, 0, 0); view->FillRect(frame); } -void testStrokeRect(BView *view, BRect frame) +static void testStrokeRect(BView *view, BRect frame) { frame.InsetBy(2, 2); - int levels = (int)(frame.Height()/2 + 1); - for (int i = 0; i < levels; i ++) { - view->SetHighColor(0, 0, 255 * (levels-i) / levels); - view->StrokeRect(frame); - frame.InsetBy(1, 1); - } -} - -void testDiagonalLine(BView *view, BRect frame) -{ - view->StrokeLine(BPoint(frame.left, frame.top), BPoint(frame.right, frame.bottom)); -} - -void testStrokeScaledRect(BView *view, BRect frame) -{ - view->SetScale(0.5); view->StrokeRect(frame); } -void testRecordPicture(BView *view, BRect frame) +static void testFillRegion(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BRegion region(frame); + frame.InsetBy(2, 2); + region.Exclude(frame); + view->FillRegion(®ion); +} + +static void testFillRoundRect(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->FillRoundRect(frame, 5, 3); +} + +static void testStrokeRoundRect(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->StrokeRoundRect(frame, 5, 3); +} + +static void testFillTriangle(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BPoint points[3]; + points[0] = BPoint(frame.left, frame.bottom); + points[1] = BPoint(centerPoint(frame).x, frame.top); + points[2] = BPoint(frame.right, frame.bottom); + view->FillTriangle(points[0], points[1], points[2]); +} + +static void testStrokeTriangle(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BPoint points[3]; + points[0] = BPoint(frame.left, frame.bottom); + points[1] = BPoint(centerPoint(frame).x, frame.top); + points[2] = BPoint(frame.right, frame.bottom); + view->StrokeTriangle(points[0], points[1], points[2]); +} + +static void testStrokeLine(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->StrokeLine(BPoint(frame.left, frame.top), BPoint(frame.right, frame.top)); + + frame.top += 2; + frame.bottom -= 2; + view->StrokeLine(BPoint(frame.left, frame.top), BPoint(frame.right, frame.bottom)); + + frame.bottom += 2;; + frame.top = frame.bottom; + view->StrokeLine(BPoint(frame.right, frame.top), BPoint(frame.left, frame.top)); +} + +static void testFillShape(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BShape shape; + shape.MoveTo(BPoint(frame.left, frame.bottom)); + shape.LineTo(BPoint(frame.right, frame.top)); + shape.LineTo(BPoint(frame.left, frame.top)); + shape.LineTo(BPoint(frame.right, frame.bottom)); + view->FillShape(&shape); +} + +static void testStrokeShape(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BShape shape; + shape.MoveTo(BPoint(frame.left, frame.bottom)); + shape.LineTo(BPoint(frame.right, frame.top)); + shape.LineTo(BPoint(frame.left, frame.top)); + shape.LineTo(BPoint(frame.right, frame.bottom)); + view->StrokeShape(&shape); +} + +static void testRecordPicture(BView *view, BRect frame) { BPicture *picture = new BPicture(); view->BeginPicture(picture); @@ -66,7 +244,7 @@ void testRecordPicture(BView *view, BRect frame) delete picture; } -void testRecordAndPlayPicture(BView *view, BRect frame) +static void testRecordAndPlayPicture(BView *view, BRect frame) { BPicture *picture = new BPicture(); view->BeginPicture(picture); @@ -77,7 +255,7 @@ void testRecordAndPlayPicture(BView *view, BRect frame) delete picture; } -void testRecordAndPlayPictureWithOffset(BView *view, BRect frame) +static void testRecordAndPlayPictureWithOffset(BView *view, BRect frame) { BPicture *picture = new BPicture(); view->BeginPicture(picture); @@ -88,13 +266,70 @@ void testRecordAndPlayPictureWithOffset(BView *view, BRect frame) view->DrawPicture(picture, BPoint(10, 10)); // color of picture should not change - view->SetLowColor(0, 255, 0); - view->SetLowColor(255, 0, 0); + view->SetLowColor(kGreen); + view->SetLowColor(kRed); view->DrawPicture(picture, BPoint(0, 0)); delete picture; } -void testBitmap(BView *view, BRect frame) { +static void testAppendToPicture(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->BeginPicture(new BPicture()); + view->FillRect(frame); + BPicture* picture = view->EndPicture(); + if (picture == NULL) + return; + + frame.InsetBy(2, 2); + view->AppendToPicture(picture); + view->SetHighColor(kRed); + view->FillRect(frame); + if (view->EndPicture() != picture) + return; + + view->DrawPicture(picture); + delete picture; +} + +static void testLineArray(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->BeginLineArray(3); + view->AddLine(BPoint(frame.left, frame.top), BPoint(frame.right, frame.top), kBlack); + + frame.top += 2; + frame.bottom -= 2; + view->AddLine(BPoint(frame.left, frame.top), BPoint(frame.right, frame.bottom), kRed); + + frame.bottom += 2;; + frame.top = frame.bottom; + view->AddLine(BPoint(frame.right, frame.top), BPoint(frame.left, frame.top), kGreen); + + view->EndLineArray(); +} + +static void testCopyBits(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + BRect leftHalf(frame); + leftHalf.right = centerPoint(frame).x - 1; + + BRect rightHalf(frame); + rightHalf.left = centerPoint(frame).x + 1; + + view->StrokeRect(leftHalf); + + view->CopyBits(leftHalf, rightHalf); +} + +static void testInvertRect(BView *view, BRect frame) +{ + frame.InsetBy(2, 2); + view->InvertRect(frame); +} + +static void testBitmap(BView *view, BRect frame) { BBitmap bitmap(frame, B_RGBA32); for (int32 y = 0; y < bitmap.Bounds().IntegerHeight(); y ++) { for (int32 x = 0; x < bitmap.Bounds().IntegerWidth(); x ++) { @@ -111,16 +346,37 @@ void testBitmap(BView *view, BRect frame) { } TestCase gTestCases[] = { - { "Test Empty Picture", testEmptyPicture }, - { "Test Diagonal Line", testDiagonalLine }, - { "Test Stroke Rect", testStrokeRect }, + { "Test No Operation", testNoOp }, + { "Test DrawChar", testDrawChar }, { "Test Draw String", testDrawString }, - { "Test Fill Red", testFillRed }, - { "Test Stroke Scaled Rect", testStrokeScaledRect }, + { "Test Draw String With Length", testDrawStringWithLength }, + { "Test FillArc", testFillArc }, + { "Test StrokeArc", testStrokeArc }, + { "Test FillBezier", testFillBezier }, + { "Test StrokeBezier", testStrokeBezier }, + { "Test FillEllipse", testFillEllipse }, + { "Test StrokeEllipse", testStrokeEllipse }, + { "Test FillPolygon", testFillPolygon }, + { "Test StrokePolygon", testStrokePolygon }, + { "Test FillRect", testFillRect }, + { "Test StrokeRect", testStrokeRect }, + { "Test FillRegion", testFillRegion }, + { "Test FillRoundRect", testFillRoundRect }, + { "Test StrokeRoundRect", testStrokeRoundRect }, + { "Test FillTriangle", testFillTriangle }, + { "Test StrokeTriangle", testStrokeTriangle }, + { "Test StrokeLine", testStrokeLine }, + { "Test FillShape", testFillShape }, + { "Test StrokeShape", testStrokeShape }, { "Test Record Picture", testRecordPicture }, { "Test Record And Play Picture", testRecordAndPlayPicture }, { "Test Record And Play Picture With Offset", testRecordAndPlayPictureWithOffset }, - { "Test Draw Bitmap", testBitmap }, + { "Test AppendToPicture", testAppendToPicture }, + { "Test LineArray", testLineArray }, + // does not work under R5 for pictures! + { "Test CopyBits*", testCopyBits }, + { "Test InvertRect", testInvertRect }, + { "Test Bitmap", testBitmap }, { NULL, NULL } }; diff --git a/src/tests/kits/interface/flatten_picture/PictureTestWindow.cpp b/src/tests/kits/interface/flatten_picture/PictureTestWindow.cpp index b4bc09d12a..72af453f7a 100644 --- a/src/tests/kits/interface/flatten_picture/PictureTestWindow.cpp +++ b/src/tests/kits/interface/flatten_picture/PictureTestWindow.cpp @@ -54,9 +54,7 @@ void PictureTestWindow::BuildGUI() m = new BMenu("Tests"); m->AddItem(new BMenuItem("Run", new BMessage(kMsgRunTests), 'R')); - // not implemented - // m->AddSeparatorItem(); - // m->AddItem(new BMenuItem("Write images", new BMessage(kMsgWriteImages), 'W')); + m->AddItem(new BMenuItem("Run Color Space B_RGB32", new BMessage(kMsgRunTests1), 'S')); mb->AddItem(m); backdrop->AddChild(mb); @@ -96,6 +94,9 @@ PictureTestWindow::MessageReceived(BMessage *msg) { case kMsgRunTests: RunTests(); break; + case kMsgRunTests1: + RunTests1(); + break; } Inherited::MessageReceived(msg); } @@ -103,6 +104,29 @@ PictureTestWindow::MessageReceived(BMessage *msg) { void PictureTestWindow::RunTests() +{ + color_space colorSpaces[] = { + B_RGBA32, + B_RGB32, + B_RGB24, + B_RGB16, + B_RGB15 + }; + + RunTests(colorSpaces, sizeof(colorSpaces) / sizeof(color_space)); +} + +void +PictureTestWindow::RunTests1() +{ + color_space colorSpaces[] = { + B_RGBA32 + }; + RunTests(colorSpaces, 1); +} + +void +PictureTestWindow::RunTests(color_space *colorSpaces, int32 n) { for (int testIndex = 0; testIndex < 2; testIndex ++) { BString text; @@ -118,22 +142,14 @@ PictureTestWindow::RunTests() text = "Unknown test method!"; } fListView->AddItem(new BStringItem(text.String())); - RunTests(testIndex); + RunTests(testIndex, colorSpaces, n); } } void -PictureTestWindow::RunTests(int32 testIndex) +PictureTestWindow::RunTests(int32 testIndex, color_space *colorSpaces, int32 n) { - color_space colorSpaces[] = { - B_RGBA32, - B_RGB32, - B_RGB24, - B_RGB16, - B_RGB15 - }; - - for (uint32 csIndex = 0; csIndex < sizeof(colorSpaces)/sizeof(color_space); csIndex ++) { + for (int32 csIndex = 0; csIndex < n; csIndex ++) { color_space colorSpace = colorSpaces[csIndex]; const char *csText; switch (colorSpace) { diff --git a/src/tests/kits/interface/flatten_picture/PictureTestWindow.h b/src/tests/kits/interface/flatten_picture/PictureTestWindow.h index 45056c5492..eca0793427 100644 --- a/src/tests/kits/interface/flatten_picture/PictureTestWindow.h +++ b/src/tests/kits/interface/flatten_picture/PictureTestWindow.h @@ -24,13 +24,15 @@ private: enum { kMsgRunTests = 'PTst', - kMsgWriteImages, + kMsgRunTests1, }; void BuildGUI(); void UpdateHeader(); void RunTests(); - void RunTests(int32 testIndex); + void RunTests1(); + void RunTests(color_space *colorSpaces, int32 n); + void RunTests(int32 testIndex, color_space *colorSpaces, int32 n); void RunTests(int32 testIndex, color_space colorSpace); BListView *fListView;