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 25 PictureTestWindow::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 33 bool 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 44 void 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 84 void 85 PictureTestWindow::UpdateHeader() 86 { 87 BString text; 88 text << "failures = " << fFailedTests << ", tests =" << fNumberOfTests; 89 fHeader->SetText(text.String()); 90 } 91 92 void 93 PictureTestWindow::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 106 void 107 PictureTestWindow::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 120 void 121 PictureTestWindow::RunTests1() 122 { 123 color_space colorSpaces[] = { 124 B_RGBA32 125 }; 126 RunTests(colorSpaces, 1); 127 } 128 129 void 130 PictureTestWindow::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 152 void 153 PictureTestWindow::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 191 void 192 PictureTestWindow::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