libgdiplus/tests/testbmpcodec.c

5328 строки
249 KiB
C

#ifdef WIN32
#ifndef __cplusplus
#error Please compile with a C++ compiler.
#endif
#endif
#if defined(USE_WINDOWS_GDIPLUS)
#include <Windows.h>
#include <GdiPlus.h>
#pragma comment(lib, "gdiplus.lib")
#else
#include <GdiPlusFlat.h>
#endif
#if defined(USE_WINDOWS_GDIPLUS)
using namespace Gdiplus;
using namespace DllExports;
#endif
#include <assert.h>
#include "testhelpers.h"
static const char *file = "temp_asset.bmp";
static WCHAR wFile[] = {'t', 'e', 'm', 'p', '_', 'a', 's', 's', 'e', 't', '.', 'b', 'm', 'p', 0};
GpImage *image;
INT bmpFlags = ImageFlagsColorSpaceRGB | ImageFlagsHasRealPixelSize | ImageFlagsReadOnly;
#define createFile(buffer, expectedStatus) \
{ \
GpStatus status; \
FILE *f = fopen (file, "wb+"); \
assert (f); \
fwrite ((void *) buffer, sizeof (BYTE), sizeof (buffer), f); \
fclose (f); \
\
status = GdipLoadImageFromFile (wFile, &image); \
assertEqualInt (status, expectedStatus); \
}
#define createFileSuccessDispose(buffer, expectedFormat, width, height, expectedFlags, dispose) \
{ \
createFile (buffer, Ok); \
verifyBitmap (image, bmpRawFormat, expectedFormat, width, height, expectedFlags, 0, TRUE); \
if (dispose) \
GdipDisposeImage (image); \
}
#define createFileSuccess(buffer, expectedFormat, width, height, expectedFlags) \
createFileSuccessDispose(buffer, expectedFormat, width, height, expectedFlags, TRUE)
static void test_validImage1bppOS2Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x24, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x20, 0x00, 0x00, 0x00,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00,
/* Height */ 0x01, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x00, 0xFF, 0x0,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00
};
BYTE image24x4[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x30, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x20, 0x00, 0x00, 0x00,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x18, 0x00,
/* Height */ 0x04, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00,
0x27, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image24x4, PixelFormat1bppIndexed, 24, 4, bmpFlags, FALSE);
ARGB image24x4Pixels[] = {
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF0000FF, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF0000FF, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF00FF00, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF00FF00, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, image24x4Pixels);
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage1bppBitmapInfoHeader ()
{
BYTE image1x1ZeroColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00
};
BYTE image1x1SmallColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x3E, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x01, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00
};
BYTE image24x4LargeColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x18, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00,
0x27, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0x00
};
BYTE image1x1NegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00
};
BYTE image24x4NegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x18, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00,
0x27, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0x00
};
createFileSuccessDispose (image1x1ZeroColorsUsed, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1ZeroColorsUsedPixels[] = {0xFF00FF00};
verifyPixels (image, image1x1ZeroColorsUsedPixels);
ARGB fullPalette[] = {0xFFFF00FF, 0xFF00FF00};
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1SmallColorsUsed, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1SmallColorsUsedPixels[] = {0xFF000000};
verifyPixels (image, image1x1SmallColorsUsedPixels);
ARGB shortPalette[] = {0xFFFF00FF};
verifyPalette (image, 0, shortPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image24x4LargeColorsUsed, PixelFormat1bppIndexed, 24, 4, bmpFlags, FALSE);
ARGB image24x4LargeColorsUsedPixels[] = {
0xFFFF00FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF,
0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF,
0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00
};
verifyPixels (image, image24x4LargeColorsUsedPixels);
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1NegativeHeight, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1NegativeHeightPixels[] = {0xFF00FF00};
verifyPixels (image, image1x1NegativeHeightPixels);
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image24x4NegativeHeight, PixelFormat1bppIndexed, 24, 4, bmpFlags, FALSE);
ARGB image24x4NegativeHeightPixels[] = {
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF,
0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF,
0xFFFF00FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF
};
verifyPixels (image, image24x4NegativeHeightPixels);
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
}
static void test_validImage1bppBitmapV3Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x38, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage1bppBitmapV4Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x86, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x82, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x6C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV4CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV4Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV4GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage1bppBitmapV5Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x96, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x92, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x7C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV5CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV5Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV5GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaBlue */ 0x00, 0x00, 0x00, 0x00,
/* bV5Intent */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileData */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileSize */ 0x00, 0x00, 0x00, 0x00,
/* bV5Reserved */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage4bppOS2Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4E, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x0, 0x0, 0x0,
/* Offset */ 0x49, 0x0, 0x0, 0x0,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00,
/* Height */ 0x01, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
// -- Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
// Image Data
0x12, 0x00, 0x00, 0x00
};
BYTE image6x4[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x5A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x0, 0x0, 0x0,
/* Offset */ 0x49, 0x0, 0x0, 0x0,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00,
/* Height */ 0x04, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
// -- Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
// -- Image Data -- //
0x13, 0xFF, 0x31, 0x00,
0x13, 0xAA, 0x31, 0x00,
0x13, 0x33, 0x31, 0x00,
0x11, 0x11, 0x11, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat4bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFF00FF};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0808FF, 0xFFFF0808, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat4bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF,
0xFFFF00FF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFF00, 0xFFFF00FF,
0xFFFF00FF, 0xFFFFFF00, 0xFFFF0808, 0xFFFF0808, 0xFFFFFF00, 0xFFFF00FF,
0xFFFF00FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFF00, 0xFFFF00FF
};
verifyPixels (image, image6x4Pixels);
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage4bppBitmapInfoHeader ()
{
BYTE image1x1ZeroColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x7A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x75, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x12, 0x00, 0x00, 0x00
};
BYTE image6x4SmallColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
0x13, 0xFF, 0x31, 0x00,
0x13, 0xAA, 0x31, 0x00,
0x13, 0x33, 0x31, 0x00,
0x11, 0x11, 0x11, 0x00
};
BYTE image6x4LargeColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x82, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x14, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
// -- Image Data -- //
0x13, 0xFF, 0x31, 0x00,
0x13, 0xAA, 0x31, 0x00,
0x13, 0x33, 0x31, 0x00,
0x11, 0x11, 0x11, 0x00
};
BYTE image1x1NegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x7A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x75, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x12, 0x00, 0x00, 0x00
};
BYTE image6x4NegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x7A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
0x13, 0xFF, 0x31, 0x00,
0x13, 0xAA, 0x31, 0x00,
0x13, 0x33, 0x31, 0x00,
0x11, 0x11, 0x11, 0x00
};
createFileSuccessDispose (image1x1ZeroColorsUsed, PixelFormat4bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1ZeroColorsUsedPixels[] = {0xFF00FF00};
verifyPixels (image, image1x1ZeroColorsUsedPixels);
ARGB fullPalette[] = {0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000};
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4SmallColorsUsed, PixelFormat4bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4SmallColorsUsedPixels[] = {
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF00FF00,
0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF00FF00,
0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF00FF00
};
verifyPixels (image, image6x4SmallColorsUsedPixels);
ARGB smallPalette[] = {0xFF0000FF, 0xFF00FF00, 0xFFFF0000};
verifyPalette (image, 0, smallPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4LargeColorsUsed, PixelFormat4bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4LargeColorsUsedPixels[] = {
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, image6x4LargeColorsUsedPixels);
ARGB largePalette[] = {0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF};
verifyPalette (image, 0, largePalette);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1NegativeHeight, PixelFormat4bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1NegativeHeightPixels[] = {0xFF00FF00};
verifyPixels (image, image1x1NegativeHeightPixels);
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4NegativeHeight, PixelFormat4bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4NegativeHeightPixels[] = {
0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF00FF00,
0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF00FF00,
0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00
};
verifyPixels (image, image6x4NegativeHeightPixels);
verifyPalette (image, 0, smallPalette);
GdipDisposeImage (image);
}
static void test_validImage4bppBitmapV3Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x38, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x02, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x10, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat4bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage4bppBitmapV4Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x86, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x82, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x6C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x02, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV4CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV4Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV4GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x10, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat4bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage4bppBitmapV5Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x96, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x92, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x7C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x02, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV5CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV5Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV5GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaBlue */ 0x00, 0x00, 0x00, 0x00,
/* bV5Intent */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileData */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileSize */ 0x00, 0x00, 0x00, 0x00,
/* bV5Reserved */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x10, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat4bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage4bppRle4Compression ()
{
BYTE fullNoTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x00,
/* New Line */ 0x00, 0x00
};
BYTE fullTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x54, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|0|0|0|0|0] */ 0x06, 0x00,
/* New Line */ 0x00, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE split[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x58, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* [1|1|1|1] */ 0x04, 0x11,
/* New Line */ 0x00, 0x00,
/* [0|0|0] */ 0x03, 0x00,
/* [1|1|1] */ 0x03, 0x11,
/* New Line */ 0x00, 0x00,
/* [3|3|3|3|3]*/ 0x05, 0x33,
/* New Line */ 0x00, 0x00,
/* [0] */ 0x01, 0x00,
/* [3|3] */ 0x02, 0x33,
/* New Line */ 0x00, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE overflowNoTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x44, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|0|0...] */ 0xFF, 0x00
};
BYTE overflowTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|0|0...] */ 0xFF, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE jump[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [1, 2] */ 0x00, 0x02, 0x01, 0x02,
/* [1|1|1] */ 0x03, 0x11,
/* Terminator */ 0x00, 0x01
};
BYTE jumpMissingDx[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x44, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [?, ?] */ 0x00, 0x02
};
BYTE jumpMissingDy[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x45, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [0, ?] */ 0x00, 0x02, 0x00
};
BYTE jumpInvalidDx[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [255, 2] */ 0x00, 0x02, 0xFF, 0x02,
/* [1|1|1] */ 0x03, 0x11,
/* Terminator */ 0x00, 0x01
};
#if defined(USE_WINDOWS_GDIPLUS)
BYTE jumpInvalidDy[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [1, 255] */ 0x00, 0x02, 0x01, 0xFF,
/* [1|1|1] */ 0x03, 0x11,
/* Terminator */ 0x00, 0x01
};
#endif
BYTE absoluteModeOddPixels[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x48, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [1|3|1] */ 0x00, 0x03, 0x13, 0x01,
/* Terminator */ 0x00, 0x01
};
BYTE absoluteModeEvenPixels[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x48, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [1|3|1|0] */ 0x00, 0x04, 0x13, 0x01,
/* Terminator */ 0x00, 0x01
};
BYTE absoluteModeNoData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x44, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [?|?|?] */ 0x00, 0x03
};
BYTE absoluteModeShortData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x45, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|?] */ 0x00, 0x03, 0x01
};
BYTE absoluteModeNoPadding[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x45, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|2|0] */ 0x00, 0x05, 0x01, 0x02, 0x01
};
BYTE fullNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x54, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|0|0|0|0|0] */ 0x06, 0x00,
/* New Line */ 0x00, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE incompleteAfterLineBreak[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|1|0|1|0] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00
};
BYTE noImageData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF
};
BYTE singleByteData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x43, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
0x03
};
BYTE singleEscapeCode[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x43, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
0x00
};
BYTE earlyTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
/* [0|0] */ 0x02, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE earlyTerminatorWithTrailingBytes[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
/* [0|0] */ 0x02, 0x00,
/* Terminator */ 0x00, 0x01,
/* Trailing */ 0x06, 0x02, 0xFF, 0xFF
};
BYTE tooManyNewLines[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x50, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x04, 0x00,
/* Compression */ 0x02, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* [1|1|1|1|1|1] */ 0x06, 0x00,
/* Terminator */ 0x00, 0x01
};
// FIXME: GDI+ converts BI_RLE4 bitmaps to 32bpp.
#if defined(USE_WINDOWS_GDIPLUS)
PixelFormat expectedRle4Format = PixelFormat32bppRGB;
#else
PixelFormat expectedRle4Format = PixelFormat4bppIndexed;
#endif
createFileSuccessDispose (fullNoTerminator, expectedRle4Format, 6, 4, bmpFlags, FALSE);
ARGB fullNoTerminatorPixels[] = {
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00
};
verifyPixels (image, fullNoTerminatorPixels);
GdipDisposeImage(image);
createFileSuccessDispose (fullTerminator, expectedRle4Format, 6, 4, bmpFlags, FALSE);
ARGB fullTerminatorPixels[] = {
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00
};
verifyPixels (image, fullTerminatorPixels);
GdipDisposeImage(image);
createFileSuccessDispose (split, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB splitPixels[] = {
0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF000000, 0xFF000000
};
verifyPixels (image, splitPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (overflowNoTerminator, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB overflowNoTerminatorPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, overflowNoTerminatorPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (overflowTerminator, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB overflowTerminatorPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, overflowTerminatorPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (jump, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpPixels)
#endif
GdipDisposeImage(image);
createFileSuccessDispose (jumpMissingDx, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpMissingDxPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpMissingDxPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (jumpMissingDy, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpMissingDyPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpMissingDyPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (jumpInvalidDx, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpInvalidDxPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpInvalidDxPixels);
#endif
GdipDisposeImage(image);
// FIXME: this causes a heap buffer overflow in libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
createFileSuccessDispose (jumpInvalidDy, expectedRle4Format, 6, 4, bmpFlags, FALSE);
ARGB jumpInvalidDyPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpInvalidDyPixels);
GdipDisposeImage(image);
#endif
createFileSuccessDispose (absoluteModeOddPixels, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeOddPixelsPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF00FF00, 0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeOddPixelsPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (absoluteModeEvenPixels, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeEvenPixelsPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF00FF00, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeEvenPixelsPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (absoluteModeNoData, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeNoDataPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeNoDataPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (absoluteModeShortData, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeShortDataPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeShortDataPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (absoluteModeNoPadding, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeNoPaddingPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000, 0xFF0000FF, 0xFF000000
};
verifyPixels (image, absoluteModeNoPaddingPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (fullNegativeHeight, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// according to the docs (https://docs.microsoft.com/en-us/windows/desktop/gdi/bitmap-header-types) negative height (top-down bitmap)
// isn't supported for RLE compression but GDI+ still accepts it
#if defined(USE_WINDOWS_GDIPLUS)
ARGB fullNegativeHeightPixels[] = {
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, fullNegativeHeightPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (incompleteAfterLineBreak, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB incompleteAfterLineBreakPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00, 0xFF0000FF, 0xFF00FF00
};
verifyPixels (image, incompleteAfterLineBreakPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (noImageData, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (singleByteData, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB singleByteDataPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, singleByteDataPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (singleEscapeCode, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB singleEscapeCodePixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, singleEscapeCodePixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (earlyTerminator, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB earlyTerminatorPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, earlyTerminatorPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (earlyTerminatorWithTrailingBytes, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB earlyTerminatorWithTrailingBytesPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, earlyTerminatorWithTrailingBytesPixels);
#endif
GdipDisposeImage(image);
createFileSuccessDispose (tooManyNewLines, expectedRle4Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle4 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB tooManyNewLinesPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, tooManyNewLinesPixels);
#endif
GdipDisposeImage(image);
}
static void test_validImage8bppOS2Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x0C, 0x04, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00,
/* Height */ 0x01, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x01, 0x00, 0x00, 0x00
};
BYTE image6x4[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x3A, 0x04, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00,
/* Height */ 0x04, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x01, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x01, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x01, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat8bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFF0000};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0808FF, 0xFFFF0808, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF000000, 0xFF00FFFF, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF08FF00, 0xFF080808, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0000FF, 0xFFFFFF00, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF080808, 0xFF00FF08, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0808FF, 0xFFFF0808, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF000000, 0xFF00FFFF, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF08FF00, 0xFF080808, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0000FF, 0xFFFFFF00, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF080808, 0xFF00FF08, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0808FF, 0xFFFF0808, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF000000, 0xFF00FFFF, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF08FF00, 0xFF080808, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0000FF, 0xFFFFFF00, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF080808, 0xFF00FF08, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0808FF, 0xFFFF0808, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF000000, 0xFF00FFFF, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF08FF00, 0xFF080808, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0xFF0000FF, 0xFFFFFF00, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF00FFFF, 0xFFFF0000, 0xFF080808, 0xFF00FF08, 0xFF00FF00, 0xFFFF00FF, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFFFF, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat8bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFFFF0000, 0xFF000000, 0xFF000000,
0xFFFF0000, 0xFF0000FF, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000,
0xFF0000FF, 0xFF0000FF, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000,
0xFFFF0000, 0xFF0000FF, 0xFF0000FF, 0xFFFF0000, 0xFF0000FF, 0xFFFF0000
};
verifyPixels (image, image6x4Pixels);
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage8bppBitmapInfoHeader ()
{
BYTE image1x1ZeroColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x3A, 0x04, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x01, 0x00, 0x00, 0x00
};
BYTE image6x4SmallColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x62, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00
};
BYTE image6x4LargeColorsUsed[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x96, 0x04, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x10, 0x01, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00
};
BYTE image1x1NegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x3A, 0x04, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 8, 8, 8, 8, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x01, 0x00, 0x00, 0x00
};
BYTE image6x4NegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x62, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
// -- Image Data -- //
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00,
0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00
};
createFileSuccessDispose (image1x1ZeroColorsUsed, PixelFormat8bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1ZeroColorsUsedPixels[] = {0xFF00FF00};
verifyPixels (image, image1x1ZeroColorsUsedPixels);
ARGB fullPalette[] = {0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF080808, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFFFF, 0xFF000000, 0xFF000000};
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4SmallColorsUsed, PixelFormat8bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4SmallColorsUsedPixels[] = {
0xFF000000, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF00FF00,
0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF00FF00,
0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF00FF00
};
verifyPixels (image, image6x4SmallColorsUsedPixels);
ARGB smallPalette[] = {0xFF0000FF, 0xFF00FF00, 0xFF000000};
verifyPalette (image, 0, smallPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4LargeColorsUsed, PixelFormat8bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4LargeColorsUsedPixels[] = {
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF0000FF,
0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF0000FF, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000
};
verifyPixels (image, image6x4LargeColorsUsedPixels);
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1NegativeHeight, PixelFormat8bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1NegativeHeightPixels[] = {0xFF00FF00};
verifyPixels (image, image1x1NegativeHeightPixels);
verifyPalette (image, 0, fullPalette);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4NegativeHeight, PixelFormat8bppIndexed, 6, 4, bmpFlags, FALSE);
ARGB image6x4NegativeHeightPixels[] = {
0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF00FF00,
0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF00FF00,
0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000, 0xFF00FF00,
0xFF000000, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00
};
verifyPixels (image, image6x4NegativeHeightPixels);
verifyPalette (image, 0, smallPalette);
GdipDisposeImage (image);
}
static void test_validImage8bppBitmapV3Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x38, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x02, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x01, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat8bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage8bppBitmapV4Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x86, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x82, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x6C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x02, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV4CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV4Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV4GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x01, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat8bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage8bppBitmapV5Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x96, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x92, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x7C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x02, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0xFF, 0x00,
/* Blue Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV5CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV5Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV5GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV5HEADER --//
/* bV5Intent */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileData */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileSize */ 0x00, 0x00, 0x00, 0x00,
/* bV5Reserved */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x01, 0x00, 0x00, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat8bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFF00FF00};
verifyPixels (image, image1x1Pixels);
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_validImage8bppRle8Compression ()
{
BYTE fullNoTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x52, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x00,
/* New Line */ 0x00, 0x00
};
BYTE fullTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x54, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|0|0|0|0|0] */ 0x06, 0x00,
/* New Line */ 0x00, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE split[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x58, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* [1|1|1|1] */ 0x04, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|0|0] */ 0x03, 0x00,
/* [1|1|1] */ 0x03, 0x01,
/* New Line */ 0x00, 0x00,
/* [3|3|3|3|3]*/ 0x05, 0x03,
/* New Line */ 0x00, 0x00,
/* [0] */ 0x01, 0x00,
/* [3|3] */ 0x02, 0x03,
/* New Line */ 0x00, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE overflowNoTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x44, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|0|0...] */ 0xFF, 0x00
};
BYTE overflowTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|0|0...] */ 0xFF, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE jump[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [1, 2] */ 0x00, 0x02, 0x01, 0x02,
/* [1|1|1] */ 0x03, 0x01,
/* Terminator */ 0x00, 0x01
};
BYTE jumpMissingDx[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x44, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [?, ?] */ 0x00, 0x02
};
BYTE jumpMissingDy[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x45, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [0, ?] */ 0x00, 0x02, 0x00
};
BYTE jumpInvalidDx[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [255, 2] */ 0x00, 0x02, 0xFF, 0x02,
/* [1|1|1] */ 0x03, 0x01,
/* Terminator */ 0x00, 0x01
};
#if defined(USE_WINDOWS_GDIPLUS)
BYTE jumpInvalidDy[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* Jump to [1, 255] */ 0x00, 0x02, 0x01, 0xFF,
/* [1|1|1] */ 0x03, 0x01,
/* Terminator */ 0x00, 0x01
};
#endif
BYTE absoluteModeOddPixels[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x49, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [1|3|1] */ 0x00, 0x03, 0x01, 0x03, 0x01,
/* Terminator */ 0x00, 0x01
};
BYTE absoluteModeEvenPixels[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [1|3|1|0] */ 0x00, 0x04, 0x01, 0x03, 0x01, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE absoluteModeNoData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x44, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [?|?|?] */ 0x00, 0x03
};
BYTE absoluteModeShortData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x45, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|?|?] */ 0x00, 0x03, 0x00
};
BYTE absoluteModeNoPadding[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x47, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [1|2|1] */ 0x00, 0x03, 0x01, 0x02, 0x01
};
BYTE fullNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x54, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|1|0|1|0|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00,
/* [0|0|0|0|0|0] */ 0x06, 0x00,
/* New Line */ 0x00, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE incompleteAfterLineBreak[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
// -- Image Data -- //
/* [1|1|1|1|1|1|1] */ 0x06, 0x01,
/* New Line */ 0x00, 0x00
};
BYTE noImageData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF
};
BYTE singleByteData[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x43, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
0x03
};
BYTE singleEscapeCode[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x43, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
0x00
};
BYTE earlyTerminator[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
/* [0|0] */ 0x02, 0x00,
/* Terminator */ 0x00, 0x01
};
BYTE earlyTerminatorWithTrailingBytes[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
/* [0|0] */ 0x02, 0x00,
/* Terminator */ 0x00, 0x01,
/* Trailing */ 0x06, 0x02, 0xFF, 0xFF
};
BYTE tooManyNewLines[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x50, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// BITMAPINFOHEADER -- //
/* Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x08, 0x00,
/* Compression */ 0x01, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x03, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
/* -- Image Data -- */
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* New Line */ 0x00, 0x00,
/* [1|1|1|1|1|1] */ 0x06, 0x00,
/* Terminator */ 0x00, 0x01
};
// FIXME: GDI+ converts BI_RLE8 bitmaps to 32bpp.
#if defined(USE_WINDOWS_GDIPLUS)
PixelFormat expectedRle8Format = PixelFormat32bppRGB;
#else
PixelFormat expectedRle8Format = PixelFormat8bppIndexed;
#endif
createFileSuccessDispose (fullNoTerminator, expectedRle8Format, 6, 4, bmpFlags, FALSE);
ARGB fullNoTerminatorPixels[] = {
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00
};
verifyPixels (image, fullNoTerminatorPixels);
GdipDisposeImage (image);
createFileSuccessDispose (fullTerminator, expectedRle8Format, 6, 4, bmpFlags, FALSE);
ARGB fullTerminatorPixels[] = {
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00
};
verifyPixels (image, fullTerminatorPixels);
GdipDisposeImage (image);
createFileSuccessDispose (split, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB splitPixels[] = {
0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF000000, 0xFF000000
};
verifyPixels (image, splitPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (overflowNoTerminator, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB overflowNoTerminatorPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, overflowNoTerminatorPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (overflowTerminator, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB overflowTerminatorPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, overflowTerminatorPixels); GdipDisposeImage (image);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (jump, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (jumpMissingDx, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpMissingDxPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpMissingDxPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (jumpMissingDy, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpMissingDyPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpMissingDyPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (jumpInvalidDx, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB jumpInvalidDxPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpInvalidDxPixels);
#endif
GdipDisposeImage (image);
// FIXME: this causes a heap buffer overflow in libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
createFileSuccessDispose (jumpInvalidDy, expectedRle8Format, 6, 4, bmpFlags, FALSE);
ARGB jumpInvalidDyPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, jumpInvalidDyPixels);
GdipDisposeImage (image);
#endif
createFileSuccessDispose (absoluteModeOddPixels, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeOddPixelsPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF00FF00, 0xFF000000, 0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeOddPixelsPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (absoluteModeEvenPixels, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeEvenPixelsPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF00FF00, 0xFF000000, 0xFF00FF00, 0xFF0000FF, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeEvenPixelsPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (absoluteModeNoData, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeNoDataPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeNoDataPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (absoluteModeShortData, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeShortDataPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeShortDataPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (absoluteModeNoPadding, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB absoluteModeNoPaddingPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF00FF00, 0xFFFF0000, 0xFF00FF00, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, absoluteModeNoPaddingPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (fullNegativeHeight, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// according to the docs (https://docs.microsoft.com/en-us/windows/desktop/gdi/bitmap-header-types) negative height (top-down bitmap)
// isn't supported for RLE compression but GDI+ still accepts it
#if defined(USE_WINDOWS_GDIPLUS)
ARGB fullNegativeHeightPixels[] = {
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00,
0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF, 0xFF0000FF
};
verifyPixels (image, fullNegativeHeightPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (incompleteAfterLineBreak, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB incompleteAfterLineBreakPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00
};
verifyPixels (image, incompleteAfterLineBreakPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (noImageData, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (singleByteData, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB singleByteDataPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, singleByteDataPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (singleEscapeCode, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB singleEscapeCodePixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, singleEscapeCodePixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (earlyTerminator, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB earlyTerminatorPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, earlyTerminatorPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (earlyTerminatorWithTrailingBytes, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB earlyTerminatorWithTrailingBytesPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF0000FF, 0xFF0000FF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, earlyTerminatorWithTrailingBytesPixels);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (tooManyNewLines, expectedRle8Format, 6, 4, bmpFlags, FALSE);
// FIXME: rle8 encoding edgecases are not properly handled by libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB tooManyNewLinesPixels[] = {
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000,
0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000
};
verifyPixels (image, tooManyNewLinesPixels);
#endif
GdipDisposeImage (image);
}
static void test_validImage16bppOS2Header ()
{
BYTE image1x1[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x1E, 0x04, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x1A, 0x00, 0x00, 0x00,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00,
/* Height */ 0x01, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Cunt */ 0x10, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x04, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x1A, 0x00, 0x00, 0x00,
// -- BITMAPCOREHEADER -- //
/* Size */ 0x0C, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00,
/* Height */ 0x04, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Cunt */ 0x10, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
createFileSuccessDispose (image1x1, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFD6AD6B};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000,
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6,
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000,
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6
};
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage16bppBitmapInfoHeader ()
{
BYTE image1x1NoCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x3A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x35, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4NoCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x66, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x35, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
BYTE image1x1NoCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x3A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x35, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4NoCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x66, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x35, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
BYTE image1x1RGB555MaskBitfieldsCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0x7C, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x03, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4RGB555MaskBitfieldsCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x72, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0x7C, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x03, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
BYTE image1x1RGB565MaskBitfieldsCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0xF8, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x07, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4RGB565MaskBitfieldsCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x72, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0xF8, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x07, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
BYTE image1x1InvalidMaskBitfieldsCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x7F, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0xFF, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4InvalidMaskBitfieldsCompression[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x72, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0x04, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0xFF, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
BYTE image1x1RGB555MaskBitfieldsCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0x7C, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x03, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4RGB555MaskBitfieldsCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x72, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0x7C, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x03, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
BYTE image1x1RGB565MaskBitfieldsCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0xF8, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x07, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4RGB565MaskBitfieldsCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x72, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0x00, 0xF8, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x07, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
BYTE image1x1InvalidMaskBitfieldsCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x46, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0xFF, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0xFF, 0x00,
// -- Image Data -- //
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4InvalidMaskBitfieldsCompressionNegativeHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x72, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x42, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x06, 0x00, 0x00, 0x00,
/* Height */ 0xFC, 0xFF, 0xFF, 0xFF,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x03, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Masks -- //
/* Red Mask */ 0xFF, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x7F, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0xFF, 0x00,
// -- Image Data -- //
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
#if defined(USE_WINDOWS_GDIPLUS)
BYTE rle4Compression16bpp[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, BI_RLE4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 0
};
BYTE rle8Compression16bpp[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, BI_RLE8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 0
};
#endif
createFileSuccessDispose (image1x1NoCompression, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1NoCompressionPixels[] = {0xFFD6AD6B};
verifyPixels (image, image1x1NoCompressionPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4NoCompression, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4NoCompressionPixels[] = {
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000,
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6,
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000,
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6
};
verifyPixels (image, image6x4NoCompressionPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1NoCompressionNegativeHeight, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1NoCompressionNegativeHeightPixels[] = {0xFFD6AD6B};
verifyPixels (image, image1x1NoCompressionNegativeHeightPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4NoCompressionNegativeHeight, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4NoCompressionNegativeHeightPixels[] = {
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6,
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000,
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6,
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000
};
verifyPixels (image, image6x4NoCompressionNegativeHeightPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1RGB555MaskBitfieldsCompression, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
verifyPixels (image, image1x1NoCompressionPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4RGB555MaskBitfieldsCompression, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
verifyPixels (image, image6x4NoCompressionPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1RGB565MaskBitfieldsCompression, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1RGB565MaskBitfieldsPixels[] = {0xFF6B556B};
verifyPixels (image, image1x1RGB565MaskBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4RGB565MaskBitfieldsCompression, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4RGB565MaskBitfieldsPixels[] = {
0xFFFFDFFF, 0xFFC61CFF, 0xFF001CC6, 0xFFFFC339, 0xFF39DFC6, 0xFF000000,
0xFFC61CFF, 0xFFFFDFFF, 0xFFFFC339, 0xFF001CC6, 0xFF000000, 0xFF39DFC6,
0xFFFFDFFF, 0xFFC61CFF, 0xFF001CC6, 0xFFFFC339, 0xFF39DFC6, 0xFF000000,
0xFFC61CFF, 0xFFFFDFFF, 0xFFFFC339, 0xFF001CC6, 0xFF000000, 0xFF39DFC6
};
verifyPixels (image, image6x4RGB565MaskBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1InvalidMaskBitfieldsCompression, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
// FIXME: invalid mask images are interpreted as (and not converted to) 32bpp images by GDI+.
// https://github.com/mono/libgdiplus/issues/158
#if defined(USE_WINDOWS_GDIPLUS)
ARGB image1x1InvalidMaskBitfieldsCompressionPixels[] = {0xFFADD56B};
verifyPixels (image, image1x1InvalidMaskBitfieldsCompressionPixels);
verifyNoPalette (image, 0);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (image6x4InvalidMaskBitfieldsCompression, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
// FIXME: invalid mask images are interpreted as (and not converted to) 32bpp images by GDI+.
// https://github.com/mono/libgdiplus/issues/158
#if defined(USE_WINDOWS_GDIPLUS)
ARGB image6x4InvalidMaskBitfieldsCompressionPixels[] = {
0xFFFFFE00, 0xFFFFC000, 0xFFF80000, 0xFF07FE00, 0xFFF83E00, 0xFF000000,
0xFFFFC000, 0xFFFFFE00, 0xFF07FE00, 0xFFF80000, 0xFF000000, 0xFFF83E00,
0xFFFFFE00, 0xFFFFC000, 0xFFF80000, 0xFF07FE00, 0xFFF83E00, 0xFF000000,
0xFFFFC000, 0xFFFFFE00, 0xFF07FE00, 0xFFF80000, 0xFF000000, 0xFFF83E00
};
verifyPixels (image, image6x4InvalidMaskBitfieldsCompressionPixels);
verifyNoPalette (image, 0);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (image1x1RGB555MaskBitfieldsCompressionNegativeHeight, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
verifyPixels (image, image1x1NoCompressionNegativeHeightPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4RGB555MaskBitfieldsCompressionNegativeHeight, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
verifyPixels (image, image6x4NoCompressionNegativeHeightPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1RGB565MaskBitfieldsCompressionNegativeHeight, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1RGB565MaskNegativeHeightBitfieldsPixels[] = {0xFF6B556B};
verifyPixels (image, image1x1RGB565MaskNegativeHeightBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4RGB565MaskBitfieldsCompressionNegativeHeight, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4RGB565MaskNegativeHeightBitfieldsPixels[] = {
0xFFC61CFF, 0xFFFFDFFF, 0xFFFFC339, 0xFF001CC6, 0xFF000000, 0xFF39DFC6,
0xFFFFDFFF, 0xFFC61CFF, 0xFF001CC6, 0xFFFFC339, 0xFF39DFC6, 0xFF000000,
0xFFC61CFF, 0xFFFFDFFF, 0xFFFFC339, 0xFF001CC6, 0xFF000000, 0xFF39DFC6,
0xFFFFDFFF, 0xFFC61CFF, 0xFF001CC6, 0xFFFFC339, 0xFF39DFC6, 0xFF000000
};
verifyPixels (image, image6x4RGB565MaskNegativeHeightBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1InvalidMaskBitfieldsCompressionNegativeHeight, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
// FIXME: invalid mask images are interpreted as (and not converted to) 32bpp images by GDI+.
// https://github.com/mono/libgdiplus/issues/158
#if defined(USE_WINDOWS_GDIPLUS)
ARGB image1x1InvalidMaskNegativeHeightBitfieldsPixels[] = {0xFFAD6A00};
verifyPixels (image, image1x1InvalidMaskNegativeHeightBitfieldsPixels);
verifyNoPalette (image, 0);
#endif
GdipDisposeImage (image);
createFileSuccessDispose (image6x4InvalidMaskBitfieldsCompressionNegativeHeight, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
// FIXME: invalid mask images are interpreted as (and not converted to) 32bpp images by GDI+.
// https://github.com/mono/libgdiplus/issues/158
#if defined(USE_WINDOWS_GDIPLUS)
ARGB image6x4InvalidMaskBitfieldsNegativeHeightBitfieldsPixels[] = {
0xFFFF81FF, 0xFFFFFDFF, 0xFF07FD39, 0xFFF800C6, 0xFF000000, 0xFFF87CC6,
0xFFFFFDFF, 0xFFFF81FF, 0xFFF800C6, 0xFF07FD39, 0xFFF87CC6, 0xFF000000,
0xFFFF81FF, 0xFFFFFDFF, 0xFF07FD39, 0xFFF800C6, 0xFF000000, 0xFFF87CC6,
0xFFFFFDFF, 0xFFFF81FF, 0xFFF800C6, 0xFF07FD39, 0xFFF87CC6, 0xFF000000
};
verifyPixels (image, image6x4InvalidMaskBitfieldsNegativeHeightBitfieldsPixels);
verifyNoPalette (image, 0);
#endif
GdipDisposeImage (image);
// FIXME: this returns OutOfMemory libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
createFileSuccessDispose (rle4Compression16bpp, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (rle8Compression16bpp, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
#endif
}
static void test_validImage16bppBitmapV3Header ()
{
BYTE image1x1RGB565[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x46, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER --//
/* Header Size */ 0x38, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x00, 0xF8, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x07, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xD7, 0xFE, 0x00, 0x00
};
BYTE image1x1RGB555[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x46, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x38, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x7C, 0x00, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x03, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xD7, 0xFE, 0x00, 0x00
};
createFileSuccessDispose (image1x1RGB565, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1RGB565Pixels[] = {0xFFFFB5BD};
verifyPixels (image, image1x1RGB565Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1RGB555, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1RGB555Pixels[] = {0xFFFFB5BD};
verifyPixels (image, image1x1RGB555Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage16bppBitmapV4Header ()
{
BYTE image1x1[] = {
'B', 'M', 126, 0, 0, 0, 0, 0, 0, 0, 0x79, 0, 0, 0,
108, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0, 0x1F, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
B8(10101101), B8(01101010), 0, 0
};
BYTE image6x4[] = {
'B', 'M', 126, 0, 0, 0, 0, 0, 0, 0, 0x79, 0, 0, 0,
108, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0, 0x1F, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000),
B8(11111111), B8(11000000), B8(11111111), B8(11111110), B8(00000111), B8(11111110), B8(11111000), B8(00000000), B8(00000000), B8(00000000), B8(11111000), B8(00111110),
B8(11111111), B8(11111110), B8(11111111), B8(11000000), B8(11111000), B8(00000000), B8(00000111), B8(11111110), B8(11111000), B8(00111110), B8(00000000), B8(00000000)
};
createFileSuccessDispose (image1x1, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFD6AD6B};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000,
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6,
0xFFFFBDFF, 0xFF8439FF, 0xFF0039C6, 0xFFFF8439, 0xFF7BBDC6, 0xFF000000,
0xFF8439FF, 0xFFFFBDFF, 0xFFFF8439, 0xFF0039C6, 0xFF000000, 0xFF7BBDC6
};
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage16bppBitmapV5Header ()
{
BYTE image1x1RGB565[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x8E, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x8A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x7C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0x00, 0xF8, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x07, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV5CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV5Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV5GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV5HEADER --//
/* bV5Intent */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileData */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileSize */ 0x00, 0x00, 0x00, 0x00,
/* bV5Reserved */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xD7, 0xFE, 0x00, 0x00
};
BYTE image1x1RGB555[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x8E, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x8A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x7C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x10, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3HEADER -- //
/* Red Mask */ 0x7C, 0x00, 0x00, 0x00,
/* Green Mask */ 0xE0, 0x03, 0x00, 0x00,
/* Blue Mask */ 0x1F, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV5CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV5Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV5GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV5GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV5HEADER --//
/* bV5Intent */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileData */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileSize */ 0x00, 0x00, 0x00, 0x00,
/* bV5Reserved */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xD7, 0xFE, 0x00, 0x00
};
createFileSuccessDispose (image1x1RGB565, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1RGB565Pixels[] = {0xFFFFB5BD};
verifyPixels (image, image1x1RGB565Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1RGB555, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1RGB555Pixels[] = {0xFFFFB5BD};
verifyPixels (image, image1x1RGB555Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage24bppOS2Header ()
{
BYTE image1x1[] = {
'B', 'M', 29, 0, 0, 0, 0, 0, 0, 0, 0x1A, 0, 0, 0,
12, 0, 0, 0, 1, 0, 1, 0, 1, 0, 24, 0,
0, 0, 255, 0
};
BYTE image6x4[] = {
'B', 'M', 106, 0, 0, 0, 0, 0, 0, 0, 0x1A, 0, 0, 0,
12, 0, 0, 0, 6, 0, 4, 0, 1, 0, 24, 0,
0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 0, 0,
0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 0, 0
};
createFileSuccessDispose (image1x1, PixelFormat24bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFF0000};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat24bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFFFFFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF,
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFFFFFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF
};
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage24bppBitmapInfoHeader ()
{
BYTE image1x1[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 0
};
BYTE image6x4[] = {
'B', 'M', 126, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 0, 0,
0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 0, 0
};
BYTE image1x1NegativeHeight[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 255, 255, 255, 255, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 0
};
BYTE image6x4NegativeHeight[] = {
'B', 'M', 126, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 6, 0, 0, 0, 252, 255, 255, 255, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 255, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 0, 0,
0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 0, 0,
0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 255, 255, 0, 255, 255, 255, 255, 0, 0
};
BYTE rle4Compression24bpp[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 24, 0, BI_RLE4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 0
};
BYTE rle8Compression24bpp[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 24, 0, BI_RLE8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 0
};
createFileSuccessDispose (image1x1, PixelFormat24bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFF0000};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat24bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFFFFFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF,
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFFFFFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF
};
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image1x1NegativeHeight, PixelFormat24bppRGB, 1, 1, bmpFlags, FALSE);
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4NegativeHeight, PixelFormat24bppRGB, 6, 4, bmpFlags, FALSE);
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
// FIXME: GDI+ converts RLE compressed 24bpp images to 32bppRGB.
#if defined(USE_WINDOWS_GDIPLUS)
PixelFormat expectedRleFormat = PixelFormat32bppRGB;
#else
PixelFormat expectedRleFormat = PixelFormat24bppRGB;
#endif
createFileSuccessDispose (rle4Compression24bpp, expectedRleFormat, 1, 1, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (rle8Compression24bpp, expectedRleFormat, 1, 1, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
}
static void test_validImage24bppBitmapV3Header ()
{
BYTE image1x1[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x46, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x38, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x18, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x00, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xB9, 0xDA, 0xFF, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat24bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFFDAB9};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage24bppBitmapV4Header ()
{
BYTE image1x1[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x7E, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x7A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x6C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x18, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x00, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV4CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV4Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV4GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xB9, 0xDA, 0xFF, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat24bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFFDAB9};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage24bppBitmapV5Header ()
{
BYTE image1x1[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x8A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x8A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x6C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x18, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x00, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV4CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV4Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV4GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV5HEADER --//
/* bV5Intent */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileData */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileSize */ 0x00, 0x00, 0x00, 0x00,
/* bV5Reserved */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xB9, 0xDA, 0xFF, 0x00
};
createFileSuccessDispose (image1x1, PixelFormat24bppRGB, 1, 1, bmpFlags, FALSE);
// FIXME: match GDI+ behaviour.
#if defined(USE_WINDOWS_GDIPLUS)
ARGB image1x1Pixels[] = {0xFFFFDAB9};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
#endif
GdipDisposeImage (image);
}
static void test_validImage32bppOS2Header ()
{
BYTE image1x1[] = {
'B', 'M', 30, 0, 0, 0, 0, 0, 0, 0, 0x1A, 0, 0, 0,
12, 0, 0, 0, 1, 0, 1, 0, 1, 0, 32, 0,
0, 0, 255, 255
};
BYTE image6x4[] = {
'B', 'M', 122, 0, 0, 0, 0, 0, 0, 0, 0x1A, 0, 0, 0,
12, 0, 0, 0, 6, 0, 4, 0, 1, 0, 32, 0,
0, 0, 255, 255, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 127,
0, 0, 255, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 255, 255, 255, 255, 255, 127, 255, 0, 255, 0, 255,
0, 0, 255, 255, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 127,
0, 0, 255, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 255, 255, 255, 255, 255, 127, 255, 0, 255, 0, 255
};
createFileSuccessDispose (image1x1, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFF0000};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFF7FFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF,
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFF7FFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF
};
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage32bppBitmapInfoHeader ()
{
BYTE image1x1[] = {
'B', 'M', 59, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 255
};
BYTE image6x4[] = {
'B', 'M', 150, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 255, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 127,
0, 0, 255, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 255, 255, 255, 255, 255, 127, 255, 0, 255, 0, 255,
0, 0, 255, 255, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 127,
0, 0, 255, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 255, 255, 255, 255, 255, 127, 255, 0, 255, 0, 255
};
BYTE image6x4NegativeHeight[] = {
'B', 'M', 150, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 6, 0, 0, 0, 252, 255, 255, 255, 1, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 255, 255, 255, 255, 255, 127, 255, 0, 255, 0, 255,
0, 0, 255, 255, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 127,
0, 0, 255, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 255, 255, 255, 255, 255, 127, 255, 0, 255, 0, 255,
0, 0, 255, 255, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 127
};
BYTE planesNotZero[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 255
};
BYTE rle4Compression32bpp[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 32, 0, BI_RLE4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 0
};
BYTE rle8Compression32bpp[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x36, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 32, 0, BI_RLE8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 0
};
createFileSuccessDispose (image1x1, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFF0000};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
ARGB image6x4Pixels[] = {
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFF7FFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF,
0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00, 0xFF7FFFFF, 0xFF00FF00,
0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFFFF00FF, 0xFFFFFFFF
};
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (image6x4NegativeHeight, PixelFormat32bppRGB, 6, 4, bmpFlags, FALSE);
verifyPixels (image, image6x4Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (planesNotZero, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (rle4Compression32bpp, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (rle8Compression32bpp, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
}
static void test_validImage32bppBitmapV3Header ()
{
BYTE image1x1[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x46, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x38, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x20, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x00, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xB9, 0xDA, 0xFF, 0X7F
};
createFileSuccessDispose (image1x1, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFFDAB9};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage32bppBitmapV4Header ()
{
BYTE image1x1[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x7E, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x7A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x6C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x20, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x00, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV4CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV4Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV4GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xB9, 0xDA, 0xFF, 0X7F
};
createFileSuccessDispose (image1x1, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFFDAB9};
verifyPixels (image, image1x1Pixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
}
static void test_validImage32bppBitmapV5Header ()
{
BYTE image1x1[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x8A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x8A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x7C, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x20, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3INFOHEADER -- //
/* Red Mask */ 0x00, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0x00, 0x00,
/* Alpha Mask */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4HEADER --//
/* bV4CSType */ 0x00, 0x00, 0x00, 0x00,
/* bV4Endpoints */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* bV4GammaRed */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaGreen */ 0x00, 0x00, 0x00, 0x00,
/* bV4GammaBlue */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV5HEADER --//
/* bV5Intent */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileData */ 0x00, 0x00, 0x00, 0x00,
/* bV5ProfileSize */ 0x00, 0x00, 0x00, 0x00,
/* bV5Reserved */ 0x00, 0x00, 0x00, 0x00,
// -- Image Data --/
0xB9, 0xDA, 0xFF, 0X7F
};
createFileSuccessDispose (image1x1, PixelFormat32bppRGB, 1, 1, bmpFlags, FALSE);
ARGB image1x1Pixels[] = {0xFFFFDAB9};
verifyPixels (image, image1x1Pixels);
GdipDisposeImage (image);
}
static void test_validImage32bppBitfields ()
{
#if defined(USE_WINDOWS_GDIPLUS)
// Order: B, G, R
BYTE bitmapInfoHeaderBitfieldsDefault[] = {
'B', 'M', 98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x00,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
// Order: R, B, G
BYTE bitmapInfoHeaderBitfieldsCustom[] = {
'B', 'M', 98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
// Order: R, B, G
BYTE bitmapV3HeaderBitfieldsZeroAlphaMask[] = {
'B', 'M', 98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
56, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00,
// -- BITMAPV3 -- //
0x00, 0x00, 0x00, 0x00,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
// Order: R, B, G
BYTE bitmapV3HeaderBitfieldsNonZeroAlphaMask[] = {
'B', 'M', 98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
56, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00,
// -- BITMAPV3 -- //
0x00, 0x00, 0x00, 0xFF,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
// Order: R, B, G
BYTE bitmapV4HeaderBitfields[] = {
'B', 'M', 154, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00,
108, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00,
// -- BITMAPV3 -- //
0x00, 0x00, 0x00, 0xFF,
// -- BITMAPV4 -- //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
// Order: R, B, G
BYTE bitmapV5HeaderBitfields[] = {
'B', 'M', 154, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00,
124, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00,
// -- BITMAPV3 -- //
0x00, 0x00, 0x00, 0xFF,
// -- BITMAPV4 -- //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BitmapV5 -- //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
BYTE bitmapInfoHeaderAllMasksZero[] = {
'B', 'M', 98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
BYTE bitmapV3HeaderAllMasksZero[] = {
'B', 'M', 98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
56, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3 -- //
0x00, 0x00, 0x00, 0x00,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
BYTE bitmapV4HeaderAllMasksZero[] = {
'B', 'M', 154, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00,
108, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3 -- //
0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4 -- //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
BYTE bitmapV5HeaderAllMasksZero[] = {
'B', 'M', 154, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00,
124, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BITMAPV2 -- //
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
// -- BITMAPV3 -- //
0x00, 0x00, 0x00, 0x00,
// -- BITMAPV4 -- //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// -- BitmapV5 -- //
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// ---- Bitmap Data ---- //
0xFF, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
#endif
// FIXME: libgdiplus can't decode these images.
#if defined(USE_WINDOWS_GDIPLUS)
createFileSuccessDispose (bitmapInfoHeaderBitfieldsDefault, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
ARGB bitmapInfoHeaderBitfieldsDefaultPixels[] = {
0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFFFFFFFF,
0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFFFFFFFF
};
verifyPixels (image, bitmapInfoHeaderBitfieldsDefaultPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (bitmapInfoHeaderBitfieldsCustom, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
ARGB customBitfieldsPixels[] = {
0xFFFF0000, 0xFF0000FF, 0xFF00FF00, 0xFFFFFFFF,
0xFFFF0000, 0xFF0000FF, 0xFF00FF00, 0xFFFFFFFF
};
verifyPixels (image, customBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (bitmapV3HeaderBitfieldsNonZeroAlphaMask, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
verifyPixels (image, customBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (bitmapV4HeaderBitfields, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
verifyPixels (image, customBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (bitmapV5HeaderBitfields, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
verifyPixels (image, customBitfieldsPixels);
verifyNoPalette (image, 0);
GdipDisposeImage (image);
createFileSuccessDispose (bitmapInfoHeaderAllMasksZero, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (bitmapV3HeaderAllMasksZero, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (bitmapV4HeaderAllMasksZero, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
createFileSuccessDispose (bitmapV5HeaderAllMasksZero, PixelFormat32bppRGB, 4, 2, bmpFlags, FALSE);
// Don't verify the pixels, as the pixel data changes every time the program is run
// due to a bug in GDI+.
GdipDisposeImage (image);
#endif
}
static void test_valid ()
{
BYTE nonZeroHorizontal[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x01, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
BYTE nonZeroVertical[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x01, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
BYTE nonZeroHorizontalNonZeroVertical[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x01, 0x00, 0x00, 0x00,
/* Vertical */ 0x01, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0xFF,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
createFileSuccessDispose (nonZeroHorizontal, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
ARGB nonZeroHorizontalPixels[] = {0xFF00FF00};
ARGB expectedPalette[] = {0xFF0000FF, 0xFF00FF00};
verifyPalette (image, 0, expectedPalette);
verifyPixels (image, nonZeroHorizontalPixels);
GdipDisposeImage (image);
createFileSuccessDispose (nonZeroVertical, PixelFormat1bppIndexed, 1, 1, bmpFlags, FALSE);
verifyPixels (image, nonZeroHorizontalPixels);
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
createFileSuccessDispose (nonZeroHorizontalNonZeroVertical, PixelFormat1bppIndexed, 1, 1, bmpFlags | ImageFlagsHasRealDPI, FALSE);
verifyPixels (image, nonZeroHorizontalPixels);
verifyPalette (image, 0, expectedPalette);
GdipDisposeImage (image);
}
static void test_invalidFileHeader ()
{
BYTE shortSignature[] = {'B'};
BYTE noImageSize[] = {'B', 'M'};
BYTE shortImageSize[] = {'B', 'M', 5, 0, 0};
BYTE noReserved1[] = {'B', 'M', 6, 0, 0, 0};
BYTE shortReserved1[] = {'B', 'M', 7, 0, 0, 0, 0};
BYTE noReserved2[] = {'B', 'M', 8, 0, 0, 0, 0, 0};
BYTE shortReserved2[] = {'B', 'M', 9, 0, 0, 0, 0, 0, 0};
BYTE noOffset[] = {'B', 'M', 10, 0, 0, 0, 0, 0, 0, 0};
BYTE shortOffset[] = {'B', 'M', 13, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0};
createFile (shortSignature, OutOfMemory);
createFile (noImageSize, OutOfMemory);
createFile (shortImageSize, OutOfMemory);
createFile (noReserved1, OutOfMemory);
createFile (shortReserved1, OutOfMemory);
createFile (noReserved2, OutOfMemory);
createFile (shortReserved2, OutOfMemory);
createFile (noOffset, OutOfMemory);
createFile (shortOffset, OutOfMemory);
}
static void test_invalidHeader ()
{
BYTE noHeader[] = {'B', 'M', 14, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0};
BYTE zeroHeaderSize[] = {'B', 'M', 18, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 0, 0, 0, 0, 0};
BYTE newFormatNoWidth[] = {'B', 'M', 18, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0};
BYTE newFormatNoHeight[] = {'B', 'M', 22, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0};
BYTE os2FormatNoWidthHeight[] = {'B', 'M', 18, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 12, 0, 0, 0};
BYTE noColorPlanes[] = {'B', 'M', 26, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0};
BYTE noBitsPerPixel[] = {'B', 'M', 28, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0};
BYTE noCompression[] = {'B', 'M', 30, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0};
BYTE noSize[] = {'B', 'M', 34, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0};
BYTE noHorizontalResolution[] = {'B', 'M', 38, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0};
BYTE noVerticalResolution[] = {'B', 'M', 42, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0};
BYTE noColors[] = {'B', 'M', 46, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
BYTE noImportantColors[] = {'B', 'M', 50, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
BYTE image2bpp[] = {
'B', 'M', 66, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255, 255, 255, 255,
B8(00000000), 0, 0, 0
};
BYTE image16bppNoRedMask[] = {
'B', 'M', 54, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
BYTE image16bppShortRedMask[] = {
'B', 'M', 57, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0
};
BYTE image16bppNoGreenMask[] = {
'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0
};
BYTE image16bppShortGreenMask[] = {
'B', 'M', 61, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0
};
BYTE image16bppNoBlueMask[] = {
'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0
};
BYTE image16bppShortBlueMask[] = {
'B', 'M', 65, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0, 3, 0, 0
};
BYTE image16bppNoData[] = {
'B', 'M', 66, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0, 0x1F, 0, 0, 0
};
BYTE bitfields32bppNoRedMask[] = {
'B', 'M', 54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
BYTE bitfields32bppShortRedMask[] = {
'B', 'M', 57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0
};
BYTE bitfields32bppNoBlueMask[] = {
'B', 'M', 58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0
};
BYTE bitfields32bppShortBlueMask[] = {
'B', 'M', 61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0
};
BYTE bitfields32bppNoGreenMask[] = {
'B', 'M', 62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0
};
BYTE bitfields32bppShortGreenMask[] = {
'B', 'M', 65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0, 0, 3, 0, 0
};
BYTE bitfields32bppNoImageData[] = {
'B', 'M', 66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
40, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 32, 0, BI_BITFIELDS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 124, 0, 0, 224, 3, 0, 0, 0, 3, 0, 0, 0
};
createFile (noHeader, OutOfMemory);
createFile (zeroHeaderSize, OutOfMemory);
createFile (newFormatNoWidth, OutOfMemory);
createFile (newFormatNoHeight, OutOfMemory);
createFile (os2FormatNoWidthHeight, OutOfMemory);
createFile (noColorPlanes, OutOfMemory);
createFile (noBitsPerPixel, OutOfMemory);
createFile (noCompression, OutOfMemory);
createFile (noSize, OutOfMemory);
createFile (noHorizontalResolution, OutOfMemory);
createFile (noVerticalResolution, OutOfMemory);
createFile (noColors, OutOfMemory);
createFile (noImportantColors, OutOfMemory);
createFile (image2bpp, OutOfMemory);
createFile (image16bppNoRedMask, OutOfMemory);
createFile (image16bppShortRedMask, OutOfMemory);
createFile (image16bppNoGreenMask, OutOfMemory);
createFile (image16bppShortGreenMask, OutOfMemory);
createFile (image16bppNoBlueMask, OutOfMemory);
createFile (image16bppShortBlueMask, OutOfMemory);
createFile (image16bppNoData, OutOfMemory);
createFile (bitfields32bppNoRedMask, OutOfMemory);
createFile (bitfields32bppShortRedMask, OutOfMemory);
createFile (bitfields32bppNoBlueMask, OutOfMemory);
createFile (bitfields32bppShortBlueMask, OutOfMemory);
createFile (bitfields32bppNoGreenMask, OutOfMemory);
createFile (bitfields32bppShortGreenMask, OutOfMemory);
createFile (bitfields32bppNoImageData, OutOfMemory);
}
static void test_invalidDataSize ()
{
static int bitCounts[] = { 1, 4, 8, 24, 32 };
for (int i = 0; i < sizeof (bitCounts) / sizeof(int); i++)
{
BYTE largeImageWidth[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Height */ 0x02, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x02, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00
};
BYTE largeImageHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0x02, 0x00, 0x00, 0x00,
/* Height */ 0xFF, 0xFF, 0xFF, 0x7F,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00
};
BYTE largeImageWidthAndHeight[] = {
// -- BITMAPFILEHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER -- //
/* Header Size */ 0x28, 0x00, 0x00, 0x00,
/* Width */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Height */ 0xFF, 0xFF, 0xFF, 0x7F,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
// -- Image Data -- //
0x80, 0x00, 0x00, 0x00
};
createFile (largeImageWidth, OutOfMemory);
createFile (largeImageHeight, OutOfMemory);
createFile (largeImageWidthAndHeight, OutOfMemory);
}
}
static void test_invalidHeaderSize ()
{
BYTE zeroHeaderSize[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x00, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
BYTE largeHeaderSize[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x42, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x3E, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0xFF, 0xFF, 0xFF, 0xFF,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
BYTE os22xHeader[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x5A, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x56, 0x00, 0x00, 0x00,
// -- Os22xBitmapHeader
/* Header Size */ 0x40, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
/* Units */ 0x00, 0x00,
/* Reserved */ 0x00, 0x00,
/* Recording */ 0x00, 0x00,
/* Rendering */ 0x00, 0x00,
/* Size1 */ 0x00, 0x00, 0x00, 0x00,
/* Size2 */ 0x00, 0x00, 0x00, 0x00,
/* ColorEncoding */ 0x00, 0x00, 0x00, 0x00,
/* Identifier */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
BYTE v2Header[] = {
// -- BITMAPCOREHEADER -- //
/* Signature */ 0x42, 0x4D,
/* File Size */ 0x4E, 0x00, 0x00, 0x00,
/* Reserved */ 0x00, 0x00, 0x00, 0x00,
/* Offset */ 0x4A, 0x00, 0x00, 0x00,
// -- BITMAPINFOHEADER
/* Header Size */ 0x34, 0x00, 0x00, 0x00,
/* Width */ 0x01, 0x00, 0x00, 0x00,
/* Height */ 0x01, 0x00, 0x00, 0x00,
/* Planes */ 0x01, 0x00,
/* Bit Count */ 0x01, 0x00,
/* Compression */ 0x00, 0x00, 0x00, 0x00,
/* Image Size */ 0x00, 0x00, 0x00, 0x00,
/* Horizontal */ 0x00, 0x00, 0x00, 0x00,
/* Vertical */ 0x00, 0x00, 0x00, 0x00,
/* Colors Used */ 0x00, 0x00, 0x00, 0x00,
/* Important Colors */ 0x00, 0x00, 0x00, 0x00,
// -- BITMAPV2INFOHEADER -- //
/* Red Mask */ 0x00, 0x00, 0x00, 0x00,
/* Green Mask */ 0x00, 0x00, 0x00, 0x00,
/* Blue Mask */ 0x00, 0x00, 0x00, 0x00,
// -- Color Palette -- //
0xFF, 0x00, 0x00, 0x7F,
0x00, 0xFF, 0x00, 0xFF,
// -- Image Data --/
0x80, 0x00, 0x00, 0x00
};
createFile (zeroHeaderSize, OutOfMemory);
createFile (largeHeaderSize, OutOfMemory);
createFile (os22xHeader, OutOfMemory);
createFile (v2Header, OutOfMemory);
}
static void test_invalidImageData ()
{
BYTE noColorEntries[] = {'B', 'M', 54, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
BYTE notEnoughColorEntries[] = {'B', 'M', 58, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
BYTE noImageData[] = {'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0};
BYTE noImageDataBigSize[] = {'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0};
BYTE hasImageData4bpp[] = {'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 128, 0, 0, 0};
BYTE hasImageData8bpp[] = {'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 128, 0, 0, 0};
BYTE invalidBitsPerPixel[] = {'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 128, 0, 0, 0};
BYTE bitfieldsNon16Bpp[] = {'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 32, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 128, 0, 0, 0};
BYTE bitfields16Bpp[] = {'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 128, 0, 0, 0};
BYTE notPaddedTo4Bytes[] = {
'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 255, 255, 255, 0,
B8(10000000)
};
BYTE missingNonFinalFinalLine[] = {
'B', 'M', 62, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 255, 255, 255, 0,
0x00, 0x00, 0x00, 0x00
};
BYTE missingFinalLine[] = {
'B', 'M', 66, 0, 0, 0, 0, 0, 0, 0, 0x3E, 0, 0, 0,
40, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 255, 255, 255, 0,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
createFile (noColorEntries, OutOfMemory);
createFile (notEnoughColorEntries, OutOfMemory);
createFile (noImageData, OutOfMemory);
createFile (noImageDataBigSize, OutOfMemory);
createFile (hasImageData4bpp, OutOfMemory);
createFile (hasImageData8bpp, OutOfMemory);
createFile (invalidBitsPerPixel, OutOfMemory);
createFile (bitfieldsNon16Bpp, OutOfMemory);
createFile (bitfields16Bpp, OutOfMemory);
createFile (notPaddedTo4Bytes, OutOfMemory);
createFile (missingNonFinalFinalLine, OutOfMemory);
createFile (missingFinalLine, OutOfMemory);
}
int
main (int argc, char**argv)
{
STARTUP;
test_validImage1bppOS2Header ();
test_validImage1bppBitmapInfoHeader ();
test_validImage1bppBitmapV3Header ();
test_validImage1bppBitmapV4Header ();
test_validImage1bppBitmapV5Header ();
test_validImage4bppOS2Header ();
test_validImage4bppBitmapInfoHeader ();
test_validImage4bppBitmapV3Header ();
test_validImage4bppBitmapV4Header ();
test_validImage4bppBitmapV5Header ();
test_validImage4bppRle4Compression ();
test_validImage8bppOS2Header ();
test_validImage8bppBitmapInfoHeader ();
test_validImage8bppBitmapV3Header ();
test_validImage8bppBitmapV4Header ();
test_validImage8bppBitmapV5Header ();
test_validImage8bppRle8Compression ();
test_validImage16bppOS2Header ();
test_validImage16bppBitmapInfoHeader ();
test_validImage16bppBitmapV3Header ();
test_validImage16bppBitmapV4Header ();
test_validImage16bppBitmapV5Header ();
test_validImage24bppOS2Header ();
test_validImage24bppBitmapInfoHeader ();
test_validImage24bppBitmapV3Header ();
test_validImage24bppBitmapV4Header ();
test_validImage24bppBitmapV5Header ();
test_validImage32bppOS2Header ();
test_validImage32bppBitmapInfoHeader ();
test_validImage32bppBitmapV3Header ();
test_validImage32bppBitmapV4Header ();
test_validImage32bppBitmapV5Header ();
test_validImage32bppBitfields ();
test_invalidFileHeader ();
test_invalidHeader ();
test_invalidDataSize ();
test_invalidHeaderSize ();
test_invalidImageData ();
test_valid ();
deleteFile (file);
SHUTDOWN;
return 0;
}