int main (int argc, char **argv) { GpImage *img; gunichar2 *unis; GpBitmap *bitmap; GpStatus status; int original_palette_size; int reloaded_palette_size; ColorPalette *original_palette; ColorPalette *reloaded_palette; GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; PixelFormat pixel_format; ARGB color; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // PNG resave should preserve the palette transparency. Let's test it // by loading a PNG file and its palette, then resaving it and loading // it again for comparison. unis = g_utf8_to_utf16 ("test-trns.png", -1, NULL, NULL, NULL); status = GdipLoadImageFromFile (unis, &img); CHECK_STATUS(1); g_free (unis); status = GdipGetImagePaletteSize (img, &original_palette_size); CHECK_STATUS(1); CHECK_ASSERT(original_palette_size > 0); original_palette = malloc (original_palette_size); GdipGetImagePalette (img, original_palette, original_palette_size); CHECK_STATUS(1); unis = g_utf8_to_utf16 ("test-trns-resave.png", -1, NULL, NULL, NULL); status = GdipSaveImageToFile (img, unis, &png_clsid, NULL); CHECK_STATUS(1); GdipDisposeImage (img); status = GdipLoadImageFromFile (unis, &img); CHECK_STATUS(1); g_free (unis); status = GdipGetImagePaletteSize (img, &reloaded_palette_size); CHECK_STATUS(1); CHECK_ASSERT(reloaded_palette_size > 0); CHECK_ASSERT(reloaded_palette_size == original_palette_size); reloaded_palette = malloc (reloaded_palette_size); GdipGetImagePalette (img, reloaded_palette, reloaded_palette_size); CHECK_STATUS(1); CHECK_ASSERT(memcmp (original_palette, reloaded_palette, original_palette_size) == 0); GdipDisposeImage (img); img = NULL; unlink ("test-trns-resave.png"); free (original_palette); free (reloaded_palette); // Test grayscale image with alpha channel. The image should be converted // into 32-bit ARGB format and the alpha channel should be preserved. unis = g_utf8_to_utf16 ("test-gsa.png", -1, NULL, NULL, NULL); status = GdipCreateBitmapFromFile (unis, &bitmap); CHECK_STATUS(1); g_free (unis); status = GdipGetImagePixelFormat (bitmap, &pixel_format); CHECK_STATUS(1); CHECK_ASSERT(pixel_format == PixelFormat32bppARGB); status = GdipBitmapGetPixel (bitmap, 0, 0, &color); CHECK_STATUS(1); CHECK_ASSERT(color == 0xffffff); status = GdipBitmapGetPixel (bitmap, 1, 7, &color); CHECK_STATUS(1); CHECK_ASSERT(color == 0xe8b3b3b3); GdipDisposeImage (bitmap); return 0; }
static void test_emfonly(void) { GpStatus stat; GpMetafile *metafile; GpGraphics *graphics; HDC hdc, metafile_dc; HENHMETAFILE hemf; BOOL ret; static const GpRectF frame = {0.0, 0.0, 100.0, 100.0}; static const GpPointF dst_points[3] = {{0.0,0.0},{100.0,0.0},{0.0,100.0}}; static const WCHAR description[] = {'w','i','n','e','t','e','s','t',0}; HBRUSH hbrush, holdbrush; GpBitmap *bitmap; ARGB color; hdc = CreateCompatibleDC(0); stat = GdipRecordMetafile(hdc, EmfTypeEmfOnly, &frame, MetafileFrameUnitPixel, description, &metafile); expect(Ok, stat); DeleteDC(hdc); if (stat != Ok) return; stat = GdipGetHemfFromMetafile(metafile, &hemf); expect(InvalidParameter, stat); stat = GdipGetImageGraphicsContext((GpImage*)metafile, &graphics); expect(Ok, stat); stat = GdipGetDC(graphics, &metafile_dc); expect(Ok, stat); if (stat != Ok) { GdipDeleteGraphics(graphics); GdipDisposeImage((GpImage*)metafile); return; } hbrush = CreateSolidBrush(0xff0000); holdbrush = SelectObject(metafile_dc, hbrush); Rectangle(metafile_dc, 25, 25, 75, 75); SelectObject(metafile_dc, holdbrush); DeleteObject(hbrush); stat = GdipReleaseDC(graphics, metafile_dc); expect(Ok, stat); stat = GdipDeleteGraphics(graphics); expect(Ok, stat); check_metafile(metafile, emfonly_records, "emfonly metafile", dst_points, &frame, UnitPixel); stat = GdipCreateBitmapFromScan0(100, 100, 0, PixelFormat32bppARGB, NULL, &bitmap); expect(Ok, stat); stat = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics); expect(Ok, stat); play_metafile(metafile, graphics, emfonly_records, "emfonly playback", dst_points, &frame, UnitPixel); stat = GdipBitmapGetPixel(bitmap, 15, 15, &color); expect(Ok, stat); expect(0, color); stat = GdipBitmapGetPixel(bitmap, 50, 50, &color); expect(Ok, stat); expect(0xff0000ff, color); stat = GdipDeleteGraphics(graphics); expect(Ok, stat); stat = GdipDisposeImage((GpImage*)bitmap); expect(Ok, stat); stat = GdipGetHemfFromMetafile(metafile, &hemf); expect(Ok, stat); stat = GdipDisposeImage((GpImage*)metafile); expect(Ok, stat); check_emfplus(hemf, emfonly_records, "emfonly emf"); ret = DeleteEnhMetaFile(hemf); ok(ret != 0, "Failed to delete enhmetafile %p\n", hemf); }