//------------------------------------------------------------------------------ // BBitmapTester.cpp // //------------------------------------------------------------------------------ // Standard Includes ----------------------------------------------------------- #include // System Includes ------------------------------------------------------------- #include #include #include #include #include // Project Includes ------------------------------------------------------------ #include #include #include // Local Includes -------------------------------------------------------------- #include "BBitmapTester.h" // Local Defines --------------------------------------------------------------- // Globals --------------------------------------------------------------------- //------------------------------------------------------------------------------ // get_bytes_per_row static inline int32 get_bytes_per_row(color_space colorSpace, int32 width) { int32 bpr = 0; switch (colorSpace) { // supported case B_RGBA64: case B_RGBA64_BIG: bpr = 8 * width; break; case B_RGB48: case B_RGB48_BIG: bpr = 6 * width; break; case B_RGB32: case B_RGBA32: case B_RGB32_BIG: case B_RGBA32_BIG: case B_UVL32: case B_UVLA32: case B_LAB32: case B_LABA32: case B_HSI32: case B_HSIA32: case B_HSV32: case B_HSVA32: case B_HLS32: case B_HLSA32: case B_CMY32: case B_CMYA32: case B_CMYK32: bpr = 4 * width; break; case B_RGB24: case B_RGB24_BIG: case B_UVL24: case B_LAB24: case B_HSI24: case B_HSV24: case B_HLS24: case B_CMY24: bpr = 3 * width; break; case B_RGB16: case B_RGB15: case B_RGBA15: case B_RGB16_BIG: case B_RGB15_BIG: case B_RGBA15_BIG: bpr = 2 * width; break; case B_CMAP8: case B_GRAY8: bpr = width; break; case B_GRAY1: bpr = (width + 7) / 8; break; case B_YCbCr422: case B_YUV422: bpr = (width + 3) / 4 * 8; break; case B_YCbCr411: case B_YUV411: bpr = (width + 3) / 4 * 6; break; case B_YCbCr444: case B_YUV444: bpr = (width + 3) / 4 * 12; break; case B_YCbCr420: case B_YUV420: bpr = (width + 3) / 4 * 6; break; // unsupported case B_NO_COLOR_SPACE: case B_YUV9: case B_YUV12: break; } // align to int32 bpr = (bpr + 3) & 0x7ffffffc; return bpr; } /* BBitmap(BRect bounds, color_space colorSpace, bool acceptsViews, bool needsContiguous); @case 1 acceptsViews = false, needsContiguous = false, valid bounds, different color spaces @results Bits() should be valid, BitsLength(), BytesPerRow() etc. should return the correct values. */ void TBBitmapTester::BBitmap1() { BApplication app("application/x-vnd.obos.bitmap-constructor-test"); struct test_case { BRect bounds; color_space space; } testCases[] = { { BRect(0, 0, 39, 9), B_RGBA64 }, { BRect(0, 0, 39, 9), B_RGBA64_BIG }, { BRect(0, 0, 39, 9), B_RGB48 }, { BRect(0, 0, 39, 9), B_RGB48_BIG }, { BRect(0, 0, 39, 9), B_RGB32 }, { BRect(0, 0, 39, 9), B_RGBA32 }, { BRect(0, 0, 39, 9), B_RGB32_BIG }, { BRect(0, 0, 39, 9), B_RGBA32_BIG }, { BRect(0, 0, 39, 9), B_UVL32 }, { BRect(0, 0, 39, 9), B_UVLA32 }, { BRect(0, 0, 39, 9), B_LAB32 }, { BRect(0, 0, 39, 9), B_LABA32 }, { BRect(0, 0, 39, 9), B_HSI32 }, { BRect(0, 0, 39, 9), B_HSIA32 }, { BRect(0, 0, 39, 9), B_HSV32 }, { BRect(0, 0, 39, 9), B_HSVA32 }, { BRect(0, 0, 39, 9), B_HLS32 }, { BRect(0, 0, 39, 9), B_HLSA32 }, { BRect(0, 0, 39, 9), B_CMY32 }, { BRect(0, 0, 39, 9), B_CMYA32 }, { BRect(0, 0, 39, 9), B_CMYK32 }, { BRect(0, 0, 39, 9), B_RGB24 }, { BRect(0, 0, 18, 9), B_RGB24 }, { BRect(0, 0, 39, 9), B_RGB24_BIG }, { BRect(0, 0, 18, 9), B_RGB24_BIG }, { BRect(0, 0, 39, 9), B_UVL24 }, { BRect(0, 0, 18, 9), B_UVL24 }, { BRect(0, 0, 39, 9), B_LAB24 }, { BRect(0, 0, 18, 9), B_LAB24 }, { BRect(0, 0, 39, 9), B_HSI24 }, { BRect(0, 0, 18, 9), B_HSI24 }, { BRect(0, 0, 39, 9), B_HSV24 }, { BRect(0, 0, 18, 9), B_HSV24 }, { BRect(0, 0, 39, 9), B_HLS24 }, { BRect(0, 0, 18, 9), B_HLS24 }, { BRect(0, 0, 39, 9), B_CMY24 }, { BRect(0, 0, 18, 9), B_CMY24 }, { BRect(0, 0, 39, 9), B_RGB16 }, { BRect(0, 0, 18, 9), B_RGB16 }, { BRect(0, 0, 39, 9), B_RGB16_BIG }, { BRect(0, 0, 18, 9), B_RGB16_BIG }, { BRect(0, 0, 39, 9), B_RGB15 }, { BRect(0, 0, 18, 9), B_RGB15 }, { BRect(0, 0, 39, 9), B_RGB15_BIG }, { BRect(0, 0, 18, 9), B_RGB15_BIG }, { BRect(0, 0, 39, 9), B_RGBA15 }, { BRect(0, 0, 18, 9), B_RGBA15 }, { BRect(0, 0, 39, 9), B_RGBA15_BIG }, { BRect(0, 0, 18, 9), B_RGBA15_BIG }, { BRect(0, 0, 39, 9), B_CMAP8 }, { BRect(0, 0, 18, 9), B_CMAP8 }, { BRect(0, 0, 39, 9), B_GRAY8 }, { BRect(0, 0, 18, 9), B_GRAY8 }, { BRect(0, 0, 39, 9), B_GRAY1 }, { BRect(0, 0, 31, 9), B_GRAY1 }, { BRect(0, 0, 18, 9), B_GRAY1 }, { BRect(0, 0, 39, 9), B_YCbCr422 }, { BRect(0, 0, 18, 9), B_YCbCr422 }, { BRect(0, 0, 39, 9), B_YUV422 }, { BRect(0, 0, 18, 9), B_YUV422 }, // R5: calculates weird BPR values for B_YCbCr411, B_YUV411 and B_YUV420. // TODO: Investigate! #ifndef TEST_R5 { BRect(0, 0, 39, 9), B_YCbCr411 }, { BRect(0, 0, 31, 9), B_YCbCr411 }, { BRect(0, 0, 18, 9), B_YCbCr411 }, { BRect(0, 0, 39, 9), B_YUV411 }, { BRect(0, 0, 31, 9), B_YUV411 }, { BRect(0, 0, 18, 9), B_YUV411 }, #endif { BRect(0, 0, 39, 9), B_YCbCr444 }, { BRect(0, 0, 18, 9), B_YCbCr444 }, { BRect(0, 0, 39, 9), B_YUV444 }, { BRect(0, 0, 18, 9), B_YUV444 }, { BRect(0, 0, 39, 9), B_YCbCr420 }, { BRect(0, 0, 31, 9), B_YCbCr420 }, { BRect(0, 0, 18, 9), B_YCbCr420 }, #ifndef TEST_R5 { BRect(0, 0, 39, 9), B_YUV420 }, { BRect(0, 0, 31, 9), B_YUV420 }, { BRect(0, 0, 18, 9), B_YUV420 }, #endif }; int32 testCaseCount = sizeof(testCases) / sizeof(test_case); for (int32 i = 0; i < testCaseCount; i++) { // get test case const test_case &testCase = testCases[i]; int32 width = testCase.bounds.IntegerWidth() + 1; int32 height = testCase.bounds.IntegerHeight() + 1; int32 bpr = get_bytes_per_row(testCase.space, width); // create and check bitmap BBitmap bitmap(testCase.bounds, testCase.space); CHK(bitmap.InitCheck() == B_OK); CHK(bitmap.IsValid() == true); CHK(bitmap.Bits() != NULL); CHK(bitmap.Bounds() == testCase.bounds); CHK(bitmap.ColorSpace() == testCase.space); if (bitmap.BytesPerRow() != bpr) { printf("space: %x: bpr: %ld (%ld)\n", testCase.space, bitmap.BytesPerRow(), bpr); } CHK(bitmap.BytesPerRow() == bpr); CHK(bitmap.BitsLength() == bpr * height); } } Test* TBBitmapTester::Suite() { TestSuite* SuiteOfTests = new TestSuite; ADD_TEST4(BBitmap, SuiteOfTests, TBBitmapTester, BBitmap1); return SuiteOfTests; }