static void pLoadImage(LPWSTR szOpenFileName) { if (GetFileAttributesW(szOpenFileName) == 0xFFFFFFFF) { DPRINT1("File %s not found!\n", szOpenFileName); return; } GdipLoadImageFromFile(szOpenFileName, &image); if (!image) { DPRINT1("GdipLoadImageFromFile() failed\n"); } }
static void win_draw(win_t *win) { GpGraphics *gp; GpStatus st; GpImage *img; gunichar2 *unis; XClearWindow(win->dpy, win->win); GdipCreateFromXDrawable_linux (win->win, win->dpy, &gp); { GpPen *pen; GpSolidFill *brush; int a = 255; int r = 255; int g = 0; int b = 0; GdipCreatePen1 (a << 24 | r << 16 | g << 8 | b, 10, UnitPixel, &pen); GdipDrawRectangle (gp, pen, 10, 10, 60, 60); GdipDrawLine (gp, pen, 0, 0, 100, 100); GdipCreateSolidFill (a << 24 | r << 16 | g << 8 | b, &brush); printf ("%d\n",GdipFillEllipse (gp, (GpBrush*)brush, 40, 40, 50, 75)); // return; } unis = g_utf8_to_utf16 ("test.jpg", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 0, 0); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("jpg drawn \n"); unis = g_utf8_to_utf16 ("test.tif", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 100, 0); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("tif drawn \n"); unis = g_utf8_to_utf16 ("test.gif", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 200, 0); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("gif drawn \n"); unis = g_utf8_to_utf16 ("test.png", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 0, 100); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("png drawn \n"); unis = g_utf8_to_utf16 ("test.bmp", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 200, 100); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("bmp drawn \n"); }
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; }
void win_emoji_show(int x, int y, wchar * efn, int elen, ushort lattr) { GpStatus s; static GdiplusStartupInput gi = (GdiplusStartupInput){1, NULL, FALSE, FALSE}; static ULONG_PTR gis = 0; if (!gis) { s = GdiplusStartup(&gis, &gi, NULL); gpcheck("startup", s); } bool use_stream = true; IStream * fs = 0; if (use_stream) { s = GdipCreateStreamOnFile(efn, 0 /* FileMode.Open */, &fs); gpcheck("stream", s); } else s = NotImplemented; GpImage * img = 0; if (s == Ok) { s = GdipLoadImageFromStream(fs, &img); gpcheck("load stream", s); } else { // This is reported to generate a memory leak, so rather use the stream. s = GdipLoadImageFromFile(efn, &img); gpcheck("load file", s); } int col = PADDING + x * cell_width; int row = PADDING + y * cell_height; if ((lattr & LATTR_MODE) >= LATTR_BOT) row -= cell_height; int w = elen * cell_width; if ((lattr & LATTR_MODE) != LATTR_NORM) w *= 2; int h = cell_height; if ((lattr & LATTR_MODE) >= LATTR_TOP) h *= 2; if (cfg.emoji_placement) { uint iw, ih; s = GdipGetImageWidth(img, &iw); gpcheck("width", s); s = GdipGetImageHeight(img, &ih); gpcheck("height", s); // consider aspect ratio so that ih/iw == h/w; // if EMPL_FULL, always adjust w // if ih/iw > h/w, make w smaller // if iw/ih > w/h, make h smaller if (cfg.emoji_placement == EMPL_FULL && ih * w != h * iw) { w = h * iw / ih; } else if (ih * w > h * iw) { int w0 = w; w = h * iw / ih; if (cfg.emoji_placement == EMPL_MIDDLE) { // horizontally center col += (w0 - w) / 2; } } else if (iw * h > w * ih) { int h0 = h; h = w * ih / iw; // vertically center row += (h0 - h) / 2; } } GpGraphics * gr; s = GdipCreateFromHDC(GetDC(wnd), &gr); gpcheck("hdc", s); s = GdipDrawImageRectI(gr, img, col, row, w, h); gpcheck("draw", s); s = GdipFlush(gr, FlushIntentionFlush); gpcheck("flush", s); s = GdipDeleteGraphics(gr); gpcheck("delete gr", s); s = GdipDisposeImage(img); gpcheck("dispose img", s); if (fs) { // Release stream resources, close file. fs->lpVtbl->Release(fs); } }