1/* 2 * Copyright 2007, Haiku. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Michael Pfeiffer 7 */ 8 9 10#include <Application.h> 11#include <MenuItem.h> 12#include <MenuBar.h> 13#include <StringView.h> 14#include <ListItem.h> 15#include <View.h> 16 17#include <stdio.h> 18 19#include "PictureTest.h" 20#include "PictureTestCases.h" 21#include "PictureTestWindow.h" 22#include "TestResultItem.h" 23 24 25PictureTestWindow::PictureTestWindow() 26 : Inherited(BRect(10, 30, 630, 470), "Bitmap Drawing Tests", B_DOCUMENT_WINDOW, 0) 27 , fFailedTests(0) 28 , fNumberOfTests(0) 29{ 30 BuildGUI(); 31} 32 33bool PictureTestWindow::QuitRequested() 34{ 35 bool isOk = Inherited::QuitRequested(); 36 if (isOk) { 37 be_app->PostMessage(B_QUIT_REQUESTED); 38 } 39 40 return isOk; 41} 42 43 44void PictureTestWindow::BuildGUI() 45{ 46 BView* backdrop = new BView(Bounds(), "backdrop", B_FOLLOW_ALL, B_WILL_DRAW); 47 backdrop->SetViewColor(::ui_color(B_PANEL_BACKGROUND_COLOR)); 48 AddChild(backdrop); 49 50 BMenuBar* mb = new BMenuBar(Bounds(), "menubar"); 51 BMenu* m = new BMenu("File"); 52 m->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q')); 53 m->SetTargetForItems(be_app_messenger); 54 mb->AddItem(m); 55 56 m = new BMenu("Tests"); 57 m->AddItem(new BMenuItem("Run", new BMessage(kMsgRunTests), 'R')); 58 m->AddItem(new BMenuItem("Run Color Space B_RGB32", new BMessage(kMsgRunTests1), 'S')); 59 mb->AddItem(m); 60 61 backdrop->AddChild(mb); 62 63 BRect b = Bounds(); 64 b.top = mb->Bounds().bottom + 1; 65 66 fHeader = new BStringView(b, "header", 67 "X", B_FOLLOW_LEFT | B_FOLLOW_RIGHT | B_FOLLOW_TOP); 68 float width, height; 69 fHeader->GetPreferredSize(&width, &height); 70 fHeader->ResizeTo(b.Width(), height); 71 backdrop->AddChild(fHeader); 72 b.top = fHeader->Frame().bottom + 1; 73 74 b.right -= B_V_SCROLL_BAR_WIDTH; 75 b.bottom -= B_H_SCROLL_BAR_HEIGHT; 76 fListView = new BListView(b, "Results", B_SINGLE_SELECTION_LIST, 77 B_FOLLOW_ALL_SIDES, 78 B_WILL_DRAW | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE); 79 backdrop->AddChild(new BScrollView("scroll_results", fListView, B_FOLLOW_ALL_SIDES, 0, true, true)); 80 81 UpdateHeader(); 82} 83 84void 85PictureTestWindow::UpdateHeader() 86{ 87 BString text; 88 text << "failures = " << fFailedTests << ", tests =" << fNumberOfTests; 89 fHeader->SetText(text.String()); 90} 91 92void 93PictureTestWindow::MessageReceived(BMessage *msg) { 94 switch (msg->what) { 95 case kMsgRunTests: 96 RunTests(); 97 break; 98 case kMsgRunTests1: 99 RunTests1(); 100 break; 101 } 102 Inherited::MessageReceived(msg); 103} 104 105 106void 107PictureTestWindow::RunTests() 108{ 109 color_space colorSpaces[] = { 110 B_RGBA32, 111 B_RGB32, 112 B_RGB24, 113 B_RGB16, 114 B_RGB15 115 }; 116 117 RunTests(colorSpaces, sizeof(colorSpaces) / sizeof(color_space)); 118} 119 120void 121PictureTestWindow::RunTests1() 122{ 123 color_space colorSpaces[] = { 124 B_RGBA32 125 }; 126 RunTests(colorSpaces, 1); 127} 128 129void 130PictureTestWindow::RunTests(color_space *colorSpaces, int32 n) 131{ 132 for (int testIndex = 0; testIndex < 2; testIndex ++) { 133 BString text; 134 switch (testIndex) 135 { 136 case 0: 137 text = "Flatten Picture Test"; 138 break; 139 case 1: 140 text = "Archive Picture Test"; 141 break; 142 default: 143 text = "Unknown test method!"; 144 } 145 fListView->AddItem(new BStringItem(text.String())); 146 RunTests(testIndex, colorSpaces, n); 147 } 148 149 UpdateHeader(); 150} 151 152void 153PictureTestWindow::RunTests(int32 testIndex, color_space *colorSpaces, int32 n) 154{ 155 for (int32 csIndex = 0; csIndex < n; csIndex ++) { 156 color_space colorSpace = colorSpaces[csIndex]; 157 const char *csText; 158 switch (colorSpace) { 159 case B_RGBA32: 160 csText = "B_RGB32"; 161 break; 162 case B_RGB32: 163 csText = "B_RGB32"; 164 break; 165 case B_RGB24: 166 csText = "B_RGB24"; 167 break; 168 case B_RGB16: 169 csText = "B_RGB16"; 170 break; 171 case B_RGB15: 172 csText = "B_RGB15"; 173 break; 174 default: 175 csText = "Unknown"; 176 } 177 178 BString text; 179 text = "Color space: "; 180 text += csText; 181 fListView->AddItem(new BStringItem(text.String())); 182 183 BRect frame(0, 0, 100, 30); 184 fListView->AddItem(new HeaderListItem("Direct Drawing", "Picture Drawing", 185 "Restored Picture", "", "Test Name", "Error Message", frame)); 186 187 RunTests(testIndex, colorSpace); 188 } 189} 190 191void 192PictureTestWindow::RunTests(int32 testIndex, color_space colorSpace) 193{ 194 BRect frame(0, 0, 100, 30); 195 for (int i = 0; gTestCases[i].name != NULL; i ++) { 196 TestCase *testCase = &gTestCases[i]; 197 PictureTest *test; 198 switch (testIndex) { 199 case 0: 200 test = new FlattenPictureTest(); 201 break; 202 case 1: 203 test = new ArchivePictureTest(); 204 break; 205 default: 206 continue; 207 } 208 209 test->SetColorSpace(colorSpace); 210 bool ok = test->Test(testCase->func, frame); 211 212 TestResultItem *item = new TestResultItem(testCase->name, frame); 213 item->SetOk(ok); 214 item->SetErrorMessage(test->ErrorMessage()); 215 item->SetDirectBitmap(test->DirectBitmap(true)); 216 item->SetOriginalBitmap(test->BitmapFromPicture(true)); 217 item->SetArchivedBitmap(test->BitmapFromRestoredPicture(true)); 218 219 delete test; 220 221 fListView->AddItem(item); 222 223 fNumberOfTests ++; 224 if (!ok) 225 fFailedTests ++; 226 } 227} 228