Provided detailed information when two bitmaps are different.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27324 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
* Michael Pfeiffer
|
* Michael Pfeiffer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <GraphicsDefs.h>
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
|
|
||||||
@@ -202,8 +203,19 @@ PictureTest::Test(draw_func* func, BRect frame)
|
|||||||
fBitmapFromRestoredPicture = CreateBitmap(archivedPicture, frame);
|
fBitmapFromRestoredPicture = CreateBitmap(archivedPicture, frame);
|
||||||
TEST_AND_RETURN(fBitmapFromRestoredPicture == NULL, "Could not create bitmap from archived picture!", false);
|
TEST_AND_RETURN(fBitmapFromRestoredPicture == NULL, "Could not create bitmap from archived picture!", false);
|
||||||
|
|
||||||
TEST_AND_RETURN(!IsSame(fDirectBitmap, fBitmapFromPicture), "Bitmap from picture differs from direct drawing bitmap", false);
|
BString reason;
|
||||||
TEST_AND_RETURN(!IsSame(fDirectBitmap, fBitmapFromRestoredPicture), "Bitmap from picture differs from direct drawing bitmap", false);
|
if (!IsSame(fDirectBitmap, fBitmapFromPicture, reason)) {
|
||||||
|
BString message("Bitmap from picture differs from direct drawing bitmap: ");
|
||||||
|
message += reason;
|
||||||
|
SetErrorMessage(message.String());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!IsSame(fDirectBitmap, fBitmapFromRestoredPicture, reason)) {
|
||||||
|
BString message("Bitmap from restored picture differs from direct drawing bitmap: ");
|
||||||
|
message += reason;
|
||||||
|
SetErrorMessage(message.String());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,16 +259,69 @@ PictureTest::CreateBitmap(BPicture *picture, BRect frame)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
static void setMismatchReason(int32 x, int32 y, uint8 *pixel1, uint8 *pixel2,
|
||||||
PictureTest::IsSame(BBitmap *bitmap1, BBitmap *bitmap2)
|
int32 bpp, BString &reason)
|
||||||
{
|
{
|
||||||
if (bitmap1->ColorSpace() != bitmap2->ColorSpace())
|
char buffer1[32];
|
||||||
return false;
|
char buffer2[32];
|
||||||
|
uint32 color1 = 0;
|
||||||
|
uint32 color2 = 0;
|
||||||
|
memcpy(&color1, pixel1, bpp);
|
||||||
|
memcpy(&color2, pixel2, bpp);
|
||||||
|
sprintf(buffer1, "0x%8.8x", (int)color1);
|
||||||
|
sprintf(buffer2, "0x%8.8x", (int)color2);
|
||||||
|
|
||||||
if (bitmap1->BitsLength() != bitmap2->BitsLength())
|
reason = "Pixel at ";
|
||||||
|
reason << x << ", " << y << " differs: " << buffer1 << " != " << buffer2;
|
||||||
|
// TODO remove when scrolling horizontally works in result list
|
||||||
|
fprintf(stderr, "%s\n", reason.String());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PictureTest::IsSame(BBitmap *bitmap1, BBitmap *bitmap2, BString &reason)
|
||||||
|
{
|
||||||
|
if (bitmap1->ColorSpace() != bitmap2->ColorSpace()) {
|
||||||
|
reason = "ColorSpace() differs";
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return memcmp(bitmap1->Bits(), bitmap2->Bits(), bitmap1->BitsLength()) == 0;
|
if (bitmap1->BitsLength() != bitmap2->BitsLength()) {
|
||||||
|
reason = "BitsLength() differs";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t rowAlignment;
|
||||||
|
size_t pixelChunk;
|
||||||
|
size_t pixelsPerChunk;
|
||||||
|
if (get_pixel_size_for(bitmap1->ColorSpace(), &rowAlignment, &pixelChunk,
|
||||||
|
&pixelsPerChunk) != B_OK) {
|
||||||
|
reason = "get_pixel_size_for() not supported for this color space";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pixelsPerChunk != 1) {
|
||||||
|
reason = "Unsupported color_space; IsSame(...) supports 1 pixels per chunk only";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int32 bpp = (int32)pixelChunk;
|
||||||
|
uint8* row1 = (uint8*)bitmap1->Bits();
|
||||||
|
uint8* row2 = (uint8*)bitmap2->Bits();
|
||||||
|
int32 bpr = bitmap1->BytesPerRow();
|
||||||
|
int32 width = bitmap1->Bounds().IntegerWidth() + 1;
|
||||||
|
int32 height = bitmap1->Bounds().IntegerHeight() + 1;
|
||||||
|
for (int y = 0; y < height; y ++, row1 += bpr, row2 += bpr) {
|
||||||
|
uint8* pixel1 = row1;
|
||||||
|
uint8* pixel2 = row2;
|
||||||
|
for (int x = 0; x < width; x ++, pixel1 += bpp, pixel2 += bpp) {
|
||||||
|
if (memcmp(pixel1, pixel2, bpp) != 0) {
|
||||||
|
setMismatchReason(x, y, pixel1, pixel2, bpp, reason);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reason = "";
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ private:
|
|||||||
BBitmap *CreateBitmap(draw_func* func, BRect frame);
|
BBitmap *CreateBitmap(draw_func* func, BRect frame);
|
||||||
BBitmap *CreateBitmap(BPicture *picture, BRect frame);
|
BBitmap *CreateBitmap(BPicture *picture, BRect frame);
|
||||||
|
|
||||||
bool IsSame(BBitmap *bitmap1, BBitmap *bitmap2);
|
bool IsSame(BBitmap *bitmap1, BBitmap *bitmap2, BString &reason);
|
||||||
|
|
||||||
color_space fColorSpace;
|
color_space fColorSpace;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user