#include <stdio.h>
#include <Message.h>
#include <OS.h>
#include <Application.h>
#include <Bitmap.h>
#include <String.h>
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
#include "BBitmapTester.h"
static inline
int32
get_bytes_per_row(color_space colorSpace, int32 width)
{
int32 bpr = 0;
switch (colorSpace) {
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;
case B_NO_COLOR_SPACE:
case B_YUV9: case B_YUV12:
break;
}
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 },
#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++) {
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);
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;
}