1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#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.ico";
static WCHAR wFile[] = {'t', 'e', 'm', 'p', '_', 'a', 's', 's', 'e', 't', '.', 'i', 'c', 'o', 0};
GpImage *image;
#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); \
}
static void test_invalidHeader ()
{
BYTE noCount[] = {0, 0, 1, 0};
BYTE zeroCount[] = {0, 0, 1, 0, 0, 0};
createFile (noCount, OutOfMemory);
createFile (zeroCount, OutOfMemory);
}
static void test_invalidEntry ()
{
BYTE noEntries[] = {0, 0, 1, 0, 1, 0};
createFile (noEntries, OutOfMemory);
}
static void test_invalidImage ()
{
BYTE noBitmapHeader[] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 0, 0, 0};
BYTE invalidPalette[] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 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, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4};
BYTE noRGBEntries[] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 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 fewRGBEntries[] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 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 noXorData[] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 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, 0, 0, 0, 0};
BYTE noAndData[] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 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, 0, 0, 0, 0, 1, 2, 3, 4};
#if defined(USE_WINDOWS_GDIPLUS)
BYTE invalidData[] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 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, 128, 0, 0, 0, 0, 0, 0, 0};
#endif
createFile (noBitmapHeader, OutOfMemory);
createFile (invalidPalette, OutOfMemory);
createFile (noRGBEntries, OutOfMemory);
createFile (fewRGBEntries, OutOfMemory);
createFile (noXorData, OutOfMemory);
createFile (noAndData, OutOfMemory);
// FIXME: this returns Ok with libgdiplus.
#if defined(USE_WINDOWS_GDIPLUS)
createFile (invalidData, OutOfMemory);
#endif
}
static void test_getPixel ()
{
WCHAR *unis;
GpBitmap *bitmap;
GpStatus status;
PixelFormat pixel_format;
ARGB color;
unis = createWchar ("test3.ico");
status = GdipCreateBitmapFromFile (unis, &bitmap);
assertEqualInt (status, Ok);
freeWchar (unis);
status = GdipGetImagePixelFormat (bitmap, &pixel_format);
assertEqualInt (status, Ok);
assertEqualInt (pixel_format, PixelFormat32bppARGB);
status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
assertEqualInt (status, Ok);
assertEqualInt (color, 0x879EE532u);
GdipDisposeImage (bitmap);
}
int
main (int argc, char**argv)
{
STARTUP;
test_invalidHeader ();
test_invalidEntry ();
test_invalidImage ();
test_getPixel ();
deleteFile (file);
SHUTDOWN;
return 0;
}
|