1//------------------------------------------------------------------------------
2//	BBitmapTester.cpp
3//
4//------------------------------------------------------------------------------
5
6// Standard Includes -----------------------------------------------------------
7#include <stdio.h>
8
9// System Includes -------------------------------------------------------------
10#include <Message.h>
11#include <OS.h>
12#include <Application.h>
13#include <Bitmap.h>
14#include <String.h>
15
16// Project Includes ------------------------------------------------------------
17#include <TestShell.h>
18#include <TestUtils.h>
19#include <cppunit/TestAssert.h>
20
21// Local Includes --------------------------------------------------------------
22#include "BBitmapTester.h"
23
24// Local Defines ---------------------------------------------------------------
25
26// Globals ---------------------------------------------------------------------
27
28//------------------------------------------------------------------------------
29
30// get_bytes_per_row
31static inline
32int32
33get_bytes_per_row(color_space colorSpace, int32 width)
34{
35	int32 bpr = 0;
36	switch (colorSpace) {
37		// supported
38		case B_RGBA64: case B_RGBA64_BIG:
39			bpr = 8 * width;
40			break;
41		case B_RGB48: case B_RGB48_BIG:
42			bpr = 6 * width;
43			break;
44		case B_RGB32: case B_RGBA32:
45		case B_RGB32_BIG: case B_RGBA32_BIG:
46		case B_UVL32: case B_UVLA32:
47		case B_LAB32: case B_LABA32:
48		case B_HSI32: case B_HSIA32:
49		case B_HSV32: case B_HSVA32:
50		case B_HLS32: case B_HLSA32:
51		case B_CMY32: case B_CMYA32: case B_CMYK32:
52			bpr = 4 * width;
53			break;
54		case B_RGB24: case B_RGB24_BIG:
55		case B_UVL24: case B_LAB24: case B_HSI24:
56		case B_HSV24: case B_HLS24: case B_CMY24:
57			bpr = 3 * width;
58			break;
59		case B_RGB16:		case B_RGB15:		case B_RGBA15:
60		case B_RGB16_BIG:	case B_RGB15_BIG:	case B_RGBA15_BIG:
61			bpr = 2 * width;
62			break;
63		case B_CMAP8: case B_GRAY8:
64			bpr = width;
65			break;
66		case B_GRAY1:
67			bpr = (width + 7) / 8;
68			break;
69		case B_YCbCr422: case B_YUV422:
70			bpr = (width + 3) / 4 * 8;
71			break;
72		case B_YCbCr411: case B_YUV411:
73			bpr = (width + 3) / 4 * 6;
74			break;
75		case B_YCbCr444: case B_YUV444:
76			bpr = (width + 3) / 4 * 12;
77			break;
78		case B_YCbCr420: case B_YUV420:
79			bpr = (width + 3) / 4 * 6;
80			break;
81		// unsupported
82		case B_NO_COLOR_SPACE:
83		case B_YUV9: case B_YUV12:
84			break;
85	}
86	// align to int32
87	bpr = (bpr + 3) & 0x7ffffffc;
88	return bpr;
89}
90
91
92/*
93	BBitmap(BRect bounds, color_space colorSpace, bool acceptsViews,
94			bool needsContiguous);
95	@case 1			acceptsViews = false, needsContiguous = false, valid bounds,
96					different color spaces
97	@results		Bits() should be valid, BitsLength(), BytesPerRow() etc.
98					should return the correct values.
99 */
100void TBBitmapTester::BBitmap1()
101{
102	BApplication app("application/x-vnd.obos.bitmap-constructor-test");
103	struct test_case {
104		BRect		bounds;
105		color_space	space;
106	} testCases[] = {
107		{ BRect(0, 0, 39, 9),	B_RGBA64 },
108		{ BRect(0, 0, 39, 9),	B_RGBA64_BIG },
109		{ BRect(0, 0, 39, 9),	B_RGB48 },
110		{ BRect(0, 0, 39, 9),	B_RGB48_BIG },
111
112		{ BRect(0, 0, 39, 9),	B_RGB32 },
113		{ BRect(0, 0, 39, 9),	B_RGBA32 },
114		{ BRect(0, 0, 39, 9),	B_RGB32_BIG },
115		{ BRect(0, 0, 39, 9),	B_RGBA32_BIG },
116
117		{ BRect(0, 0, 39, 9),	B_UVL32 },
118		{ BRect(0, 0, 39, 9),	B_UVLA32 },
119		{ BRect(0, 0, 39, 9),	B_LAB32 },
120		{ BRect(0, 0, 39, 9),	B_LABA32 },
121		{ BRect(0, 0, 39, 9),	B_HSI32 },
122		{ BRect(0, 0, 39, 9),	B_HSIA32 },
123		{ BRect(0, 0, 39, 9),	B_HSV32 },
124		{ BRect(0, 0, 39, 9),	B_HSVA32 },
125		{ BRect(0, 0, 39, 9),	B_HLS32 },
126		{ BRect(0, 0, 39, 9),	B_HLSA32 },
127		{ BRect(0, 0, 39, 9),	B_CMY32 },
128		{ BRect(0, 0, 39, 9),	B_CMYA32 },
129		{ BRect(0, 0, 39, 9),	B_CMYK32 },
130		{ BRect(0, 0, 39, 9),	B_RGB24 },
131		{ BRect(0, 0, 18, 9),	B_RGB24 },
132		{ BRect(0, 0, 39, 9),	B_RGB24_BIG },
133		{ BRect(0, 0, 18, 9),	B_RGB24_BIG },
134		{ BRect(0, 0, 39, 9),	B_UVL24 },
135		{ BRect(0, 0, 18, 9),	B_UVL24 },
136		{ BRect(0, 0, 39, 9),	B_LAB24 },
137		{ BRect(0, 0, 18, 9),	B_LAB24 },
138		{ BRect(0, 0, 39, 9),	B_HSI24 },
139		{ BRect(0, 0, 18, 9),	B_HSI24 },
140		{ BRect(0, 0, 39, 9),	B_HSV24 },
141		{ BRect(0, 0, 18, 9),	B_HSV24 },
142		{ BRect(0, 0, 39, 9),	B_HLS24 },
143		{ BRect(0, 0, 18, 9),	B_HLS24 },
144		{ BRect(0, 0, 39, 9),	B_CMY24 },
145		{ BRect(0, 0, 18, 9),	B_CMY24 },
146		{ BRect(0, 0, 39, 9),	B_RGB16 },
147		{ BRect(0, 0, 18, 9),	B_RGB16 },
148		{ BRect(0, 0, 39, 9),	B_RGB16_BIG },
149		{ BRect(0, 0, 18, 9),	B_RGB16_BIG },
150		{ BRect(0, 0, 39, 9),	B_RGB15 },
151		{ BRect(0, 0, 18, 9),	B_RGB15 },
152		{ BRect(0, 0, 39, 9),	B_RGB15_BIG },
153		{ BRect(0, 0, 18, 9),	B_RGB15_BIG },
154		{ BRect(0, 0, 39, 9),	B_RGBA15 },
155		{ BRect(0, 0, 18, 9),	B_RGBA15 },
156		{ BRect(0, 0, 39, 9),	B_RGBA15_BIG },
157		{ BRect(0, 0, 18, 9),	B_RGBA15_BIG },
158		{ BRect(0, 0, 39, 9),	B_CMAP8 },
159		{ BRect(0, 0, 18, 9),	B_CMAP8 },
160		{ BRect(0, 0, 39, 9),	B_GRAY8 },
161		{ BRect(0, 0, 18, 9),	B_GRAY8 },
162		{ BRect(0, 0, 39, 9),	B_GRAY1 },
163		{ BRect(0, 0, 31, 9),	B_GRAY1 },
164		{ BRect(0, 0, 18, 9),	B_GRAY1 },
165		{ BRect(0, 0, 39, 9),	B_YCbCr422 },
166		{ BRect(0, 0, 18, 9),	B_YCbCr422 },
167		{ BRect(0, 0, 39, 9),	B_YUV422 },
168		{ BRect(0, 0, 18, 9),	B_YUV422 },
169// R5: calculates weird BPR values for B_YCbCr411, B_YUV411 and B_YUV420.
170// TODO: Investigate!
171#ifndef TEST_R5
172		{ BRect(0, 0, 39, 9),	B_YCbCr411 },
173		{ BRect(0, 0, 31, 9),	B_YCbCr411 },
174		{ BRect(0, 0, 18, 9),	B_YCbCr411 },
175		{ BRect(0, 0, 39, 9),	B_YUV411 },
176		{ BRect(0, 0, 31, 9),	B_YUV411 },
177		{ BRect(0, 0, 18, 9),	B_YUV411 },
178#endif
179		{ BRect(0, 0, 39, 9),	B_YCbCr444 },
180		{ BRect(0, 0, 18, 9),	B_YCbCr444 },
181		{ BRect(0, 0, 39, 9),	B_YUV444 },
182		{ BRect(0, 0, 18, 9),	B_YUV444 },
183		{ BRect(0, 0, 39, 9),	B_YCbCr420 },
184		{ BRect(0, 0, 31, 9),	B_YCbCr420 },
185		{ BRect(0, 0, 18, 9),	B_YCbCr420 },
186#ifndef TEST_R5
187		{ BRect(0, 0, 39, 9),	B_YUV420 },
188		{ BRect(0, 0, 31, 9),	B_YUV420 },
189		{ BRect(0, 0, 18, 9),	B_YUV420 },
190#endif
191	};
192	int32 testCaseCount = sizeof(testCases) / sizeof(test_case);
193	for (int32 i = 0; i < testCaseCount; i++) {
194		// get test case
195		const test_case &testCase = testCases[i];
196		int32 width = testCase.bounds.IntegerWidth() + 1;
197		int32 height = testCase.bounds.IntegerHeight() + 1;
198		int32 bpr = get_bytes_per_row(testCase.space, width);
199		// create and check bitmap
200		BBitmap bitmap(testCase.bounds, testCase.space);
201		CHK(bitmap.InitCheck() == B_OK);
202		CHK(bitmap.IsValid() == true);
203		CHK(bitmap.Bits() != NULL);
204		CHK(bitmap.Bounds() == testCase.bounds);
205		CHK(bitmap.ColorSpace() == testCase.space);
206if (bitmap.BytesPerRow() != bpr) {
207printf("space: %x: bpr: %ld (%ld)\n", testCase.space, bitmap.BytesPerRow(),
208bpr);
209}
210		CHK(bitmap.BytesPerRow() == bpr);
211		CHK(bitmap.BitsLength() == bpr * height);
212	}
213}
214
215
216Test* TBBitmapTester::Suite()
217{
218	TestSuite* SuiteOfTests = new TestSuite;
219
220	ADD_TEST4(BBitmap, SuiteOfTests, TBBitmapTester, BBitmap1);
221
222	return SuiteOfTests;
223}
224
225