| Index: core/src/fxge/win32/fx_win32_gdipext.cpp
|
| diff --git a/core/src/fxge/win32/fx_win32_gdipext.cpp b/core/src/fxge/win32/fx_win32_gdipext.cpp
|
| index d90215a4ead6343dc5f2d38a2c85abf4033cb5cc..ce65a26301b2dc8c781edc473fcc3cd447d3bc82 100644
|
| --- a/core/src/fxge/win32/fx_win32_gdipext.cpp
|
| +++ b/core/src/fxge/win32/fx_win32_gdipext.cpp
|
| @@ -9,102 +9,102 @@
|
| #include <windows.h>
|
| #include <algorithm>
|
| namespace Gdiplus {
|
| - using std::min;
|
| - using std::max;
|
| +using std::min;
|
| +using std::max;
|
| } // namespace Gdiplus
|
| #include <gdiplus.h>
|
| #include "../../../include/fxge/fx_ge_win32.h"
|
| #include "win32_int.h"
|
| using namespace Gdiplus;
|
| using namespace Gdiplus::DllExports;
|
| -#define GdiFillType2Gdip(fill_type) (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)
|
| -static CombineMode GdiCombineMode2Gdip(int mode)
|
| -{
|
| - switch (mode) {
|
| - case RGN_AND:
|
| - return CombineModeIntersect;
|
| - }
|
| - return CombineModeIntersect;
|
| +#define GdiFillType2Gdip(fill_type) \
|
| + (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)
|
| +static CombineMode GdiCombineMode2Gdip(int mode) {
|
| + switch (mode) {
|
| + case RGN_AND:
|
| + return CombineModeIntersect;
|
| + }
|
| + return CombineModeIntersect;
|
| }
|
| enum {
|
| - FuncId_GdipCreatePath2,
|
| - FuncId_GdipSetPenDashStyle,
|
| - FuncId_GdipSetPenDashArray,
|
| - FuncId_GdipSetPenDashCap197819,
|
| - FuncId_GdipSetPenLineJoin,
|
| - FuncId_GdipSetPenWidth,
|
| - FuncId_GdipCreateFromHDC,
|
| - FuncId_GdipSetPageUnit,
|
| - FuncId_GdipSetSmoothingMode,
|
| - FuncId_GdipCreateSolidFill,
|
| - FuncId_GdipFillPath,
|
| - FuncId_GdipDeleteBrush,
|
| - FuncId_GdipCreatePen1,
|
| - FuncId_GdipSetPenMiterLimit,
|
| - FuncId_GdipDrawPath,
|
| - FuncId_GdipDeletePen,
|
| - FuncId_GdipDeletePath,
|
| - FuncId_GdipDeleteGraphics,
|
| - FuncId_GdipCreateBitmapFromFileICM,
|
| - FuncId_GdipCreateBitmapFromStreamICM,
|
| - FuncId_GdipGetImageHeight,
|
| - FuncId_GdipGetImageWidth,
|
| - FuncId_GdipGetImagePixelFormat,
|
| - FuncId_GdipBitmapLockBits,
|
| - FuncId_GdipGetImagePaletteSize,
|
| - FuncId_GdipGetImagePalette,
|
| - FuncId_GdipBitmapUnlockBits,
|
| - FuncId_GdipDisposeImage,
|
| - FuncId_GdipFillRectangle,
|
| - FuncId_GdipCreateBitmapFromScan0,
|
| - FuncId_GdipSetImagePalette,
|
| - FuncId_GdipSetInterpolationMode,
|
| - FuncId_GdipDrawImagePointsI,
|
| - FuncId_GdipCreateBitmapFromGdiDib,
|
| - FuncId_GdiplusStartup,
|
| - FuncId_GdipDrawLineI,
|
| - FuncId_GdipResetClip,
|
| - FuncId_GdipCreatePath,
|
| - FuncId_GdipAddPathPath,
|
| - FuncId_GdipSetPathFillMode,
|
| - FuncId_GdipSetClipPath,
|
| - FuncId_GdipGetClip,
|
| - FuncId_GdipCreateRegion,
|
| - FuncId_GdipGetClipBoundsI,
|
| - FuncId_GdipSetClipRegion,
|
| - FuncId_GdipWidenPath,
|
| - FuncId_GdipAddPathLine,
|
| - FuncId_GdipAddPathRectangle,
|
| - FuncId_GdipDeleteRegion,
|
| - FuncId_GdipGetDC,
|
| - FuncId_GdipReleaseDC,
|
| - FuncId_GdipSetPenLineCap197819,
|
| - FuncId_GdipSetPenDashOffset,
|
| - FuncId_GdipResetPath,
|
| - FuncId_GdipCreateRegionPath,
|
| - FuncId_GdipCreateFont,
|
| - FuncId_GdipGetFontSize,
|
| - FuncId_GdipCreateFontFamilyFromName,
|
| - FuncId_GdipSetTextRenderingHint,
|
| - FuncId_GdipDrawDriverString,
|
| - FuncId_GdipCreateMatrix2,
|
| - FuncId_GdipDeleteMatrix,
|
| - FuncId_GdipSetWorldTransform,
|
| - FuncId_GdipResetWorldTransform,
|
| - FuncId_GdipDeleteFontFamily,
|
| - FuncId_GdipDeleteFont,
|
| - FuncId_GdipNewPrivateFontCollection,
|
| - FuncId_GdipDeletePrivateFontCollection,
|
| - FuncId_GdipPrivateAddMemoryFont,
|
| - FuncId_GdipGetFontCollectionFamilyList,
|
| - FuncId_GdipGetFontCollectionFamilyCount,
|
| - FuncId_GdipSetTextContrast,
|
| - FuncId_GdipSetPixelOffsetMode,
|
| - FuncId_GdipGetImageGraphicsContext,
|
| - FuncId_GdipDrawImageI,
|
| - FuncId_GdipDrawImageRectI,
|
| - FuncId_GdipDrawString,
|
| - FuncId_GdipSetPenTransform,
|
| + FuncId_GdipCreatePath2,
|
| + FuncId_GdipSetPenDashStyle,
|
| + FuncId_GdipSetPenDashArray,
|
| + FuncId_GdipSetPenDashCap197819,
|
| + FuncId_GdipSetPenLineJoin,
|
| + FuncId_GdipSetPenWidth,
|
| + FuncId_GdipCreateFromHDC,
|
| + FuncId_GdipSetPageUnit,
|
| + FuncId_GdipSetSmoothingMode,
|
| + FuncId_GdipCreateSolidFill,
|
| + FuncId_GdipFillPath,
|
| + FuncId_GdipDeleteBrush,
|
| + FuncId_GdipCreatePen1,
|
| + FuncId_GdipSetPenMiterLimit,
|
| + FuncId_GdipDrawPath,
|
| + FuncId_GdipDeletePen,
|
| + FuncId_GdipDeletePath,
|
| + FuncId_GdipDeleteGraphics,
|
| + FuncId_GdipCreateBitmapFromFileICM,
|
| + FuncId_GdipCreateBitmapFromStreamICM,
|
| + FuncId_GdipGetImageHeight,
|
| + FuncId_GdipGetImageWidth,
|
| + FuncId_GdipGetImagePixelFormat,
|
| + FuncId_GdipBitmapLockBits,
|
| + FuncId_GdipGetImagePaletteSize,
|
| + FuncId_GdipGetImagePalette,
|
| + FuncId_GdipBitmapUnlockBits,
|
| + FuncId_GdipDisposeImage,
|
| + FuncId_GdipFillRectangle,
|
| + FuncId_GdipCreateBitmapFromScan0,
|
| + FuncId_GdipSetImagePalette,
|
| + FuncId_GdipSetInterpolationMode,
|
| + FuncId_GdipDrawImagePointsI,
|
| + FuncId_GdipCreateBitmapFromGdiDib,
|
| + FuncId_GdiplusStartup,
|
| + FuncId_GdipDrawLineI,
|
| + FuncId_GdipResetClip,
|
| + FuncId_GdipCreatePath,
|
| + FuncId_GdipAddPathPath,
|
| + FuncId_GdipSetPathFillMode,
|
| + FuncId_GdipSetClipPath,
|
| + FuncId_GdipGetClip,
|
| + FuncId_GdipCreateRegion,
|
| + FuncId_GdipGetClipBoundsI,
|
| + FuncId_GdipSetClipRegion,
|
| + FuncId_GdipWidenPath,
|
| + FuncId_GdipAddPathLine,
|
| + FuncId_GdipAddPathRectangle,
|
| + FuncId_GdipDeleteRegion,
|
| + FuncId_GdipGetDC,
|
| + FuncId_GdipReleaseDC,
|
| + FuncId_GdipSetPenLineCap197819,
|
| + FuncId_GdipSetPenDashOffset,
|
| + FuncId_GdipResetPath,
|
| + FuncId_GdipCreateRegionPath,
|
| + FuncId_GdipCreateFont,
|
| + FuncId_GdipGetFontSize,
|
| + FuncId_GdipCreateFontFamilyFromName,
|
| + FuncId_GdipSetTextRenderingHint,
|
| + FuncId_GdipDrawDriverString,
|
| + FuncId_GdipCreateMatrix2,
|
| + FuncId_GdipDeleteMatrix,
|
| + FuncId_GdipSetWorldTransform,
|
| + FuncId_GdipResetWorldTransform,
|
| + FuncId_GdipDeleteFontFamily,
|
| + FuncId_GdipDeleteFont,
|
| + FuncId_GdipNewPrivateFontCollection,
|
| + FuncId_GdipDeletePrivateFontCollection,
|
| + FuncId_GdipPrivateAddMemoryFont,
|
| + FuncId_GdipGetFontCollectionFamilyList,
|
| + FuncId_GdipGetFontCollectionFamilyCount,
|
| + FuncId_GdipSetTextContrast,
|
| + FuncId_GdipSetPixelOffsetMode,
|
| + FuncId_GdipGetImageGraphicsContext,
|
| + FuncId_GdipDrawImageI,
|
| + FuncId_GdipDrawImageRectI,
|
| + FuncId_GdipDrawString,
|
| + FuncId_GdipSetPenTransform,
|
| };
|
| static LPCSTR g_GdipFuncNames[] = {
|
| "GdipCreatePath2",
|
| @@ -186,1070 +186,1335 @@ static LPCSTR g_GdipFuncNames[] = {
|
| "GdipDrawString",
|
| "GdipSetPenTransform",
|
| };
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode, GpPath **path);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashStyle)(GpPen *pen, GpDashStyle dashstyle);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashArray)(GpPen *pen, GDIPCONST REAL *dash, INT count);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashCap197819)(GpPen *pen, GpDashCap dashCap);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineJoin)(GpPen *pen, GpLineJoin lineJoin);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenWidth)(GpPen *pen, REAL width);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFromHDC)(HDC hdc, GpGraphics **graphics);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPageUnit)(GpGraphics *graphics, GpUnit unit);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetSmoothingMode)(GpGraphics *graphics, SmoothingMode smoothingMode);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateSolidFill)(ARGB color, GpSolidFill **brush);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipFillPath)(GpGraphics *graphics, GpBrush *brush, GpPath *path);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteBrush)(GpBrush *brush);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePen1)(ARGB color, REAL width, GpUnit unit, GpPen **pen);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenMiterLimit)(GpPen *pen, REAL miterLimit);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawPath)(GpGraphics *graphics, GpPen *pen, GpPath *path);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePen)(GpPen *pen);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePath)(GpPath* path);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteGraphics)(GpGraphics *graphics);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromFileICM)(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromStreamICM)(IStream* stream, GpBitmap **bitmap);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageWidth)(GpImage *image, UINT *width);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageHeight)(GpImage *image, UINT *height);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePixelFormat)(GpImage *image, PixelFormat *format);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapLockBits)(GpBitmap* bitmap, GDIPCONST GpRect* rect, UINT flags, PixelFormat format, BitmapData* lockedBitmapData);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePalette)(GpImage *image, ColorPalette *palette, INT size);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePaletteSize)(GpImage *image, INT *size);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapUnlockBits)(GpBitmap* bitmap, BitmapData* lockedBitmapData);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDisposeImage)(GpImage *image);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipFillRectangle)(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromScan0)(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetImagePalette)(GpImage *image, GDIPCONST ColorPalette *palette);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetInterpolationMode)(GpGraphics *graphics, InterpolationMode interpolationMode);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImagePointsI)(GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstpoints, INT count);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromGdiDib)(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap);
|
| -typedef Status (WINAPI *FuncType_GdiplusStartup)(OUT uintptr_t *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawLineI)(GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipResetClip)(GpGraphics *graphics);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath)(GpFillMode brushMode, GpPath **path);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathPath)(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPathFillMode)(GpPath *path, GpFillMode fillmode);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipPath)(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClip)(GpGraphics *graphics, GpRegion *region);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegion)(GpRegion **region);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClipBoundsI)(GpGraphics *graphics, GpRect *rect);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipRegion)(GpGraphics *graphics, GpRegion *region, CombineMode combineMode);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipWidenPath)(GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathLine)(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathRectangle)(GpPath *path, REAL x, REAL y, REAL width, REAL height);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteRegion)(GpRegion *region);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetDC)(GpGraphics* graphics, HDC * hdc);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipReleaseDC)(GpGraphics* graphics, HDC hdc);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineCap197819)(GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashOffset)(GpPen *pen, REAL offset);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipResetPath)(GpPath *path);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegionPath)(GpPath *path, GpRegion **region);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFont)(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontSize)(GpFont *font, REAL *size);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFontFamilyFromName)(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextRenderingHint)(GpGraphics *graphics, TextRenderingHint mode);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawDriverString)(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateMatrix2)(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteMatrix)(GpMatrix *matrix);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetWorldTransform)(GpGraphics *graphics, GpMatrix *matrix);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipResetWorldTransform)(GpGraphics *graphics);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFontFamily)(GpFontFamily *FontFamily);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFont)(GpFont* font);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipNewPrivateFontCollection)(GpFontCollection** fontCollection);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePrivateFontCollection)(GpFontCollection** fontCollection);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipPrivateAddMemoryFont)(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyList)(GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyCount)(GpFontCollection* fontCollection, INT* numFound);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextContrast)(GpGraphics *graphics, UINT contrast);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPixelOffsetMode)(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageGraphicsContext)(GpImage *image, GpGraphics **graphics);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageI)(GpGraphics *graphics, GpImage *image, INT x, INT y);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageRectI)(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawString)(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush);
|
| -typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenTransform)(GpPen *pen, GpMatrix *matrix);
|
| -#define CallFunc(funcname) ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])
|
| -typedef HANDLE (__stdcall *FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts);
|
| -typedef BOOL (__stdcall *FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);
|
| -void* CGdiplusExt::GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face)
|
| -{
|
| - if (m_pGdiAddFontMemResourceEx) {
|
| - return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);
|
| - }
|
| - return NULL;
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreatePath2)(GDIPCONST GpPointF*,
|
| + GDIPCONST BYTE*,
|
| + INT,
|
| + GpFillMode,
|
| + GpPath** path);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashStyle)(
|
| + GpPen* pen,
|
| + GpDashStyle dashstyle);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashArray)(GpPen* pen,
|
| + GDIPCONST REAL* dash,
|
| + INT count);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashCap197819)(
|
| + GpPen* pen,
|
| + GpDashCap dashCap);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenLineJoin)(GpPen* pen,
|
| + GpLineJoin lineJoin);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenWidth)(GpPen* pen, REAL width);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateFromHDC)(HDC hdc,
|
| + GpGraphics** graphics);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPageUnit)(GpGraphics* graphics,
|
| + GpUnit unit);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetSmoothingMode)(
|
| + GpGraphics* graphics,
|
| + SmoothingMode smoothingMode);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateSolidFill)(ARGB color,
|
| + GpSolidFill** brush);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipFillPath)(GpGraphics* graphics,
|
| + GpBrush* brush,
|
| + GpPath* path);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteBrush)(GpBrush* brush);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreatePen1)(ARGB color,
|
| + REAL width,
|
| + GpUnit unit,
|
| + GpPen** pen);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenMiterLimit)(GpPen* pen,
|
| + REAL miterLimit);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawPath)(GpGraphics* graphics,
|
| + GpPen* pen,
|
| + GpPath* path);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeletePen)(GpPen* pen);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeletePath)(GpPath* path);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteGraphics)(GpGraphics* graphics);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromFileICM)(
|
| + GDIPCONST WCHAR* filename,
|
| + GpBitmap** bitmap);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromStreamICM)(
|
| + IStream* stream,
|
| + GpBitmap** bitmap);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImageWidth)(GpImage* image,
|
| + UINT* width);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImageHeight)(GpImage* image,
|
| + UINT* height);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImagePixelFormat)(
|
| + GpImage* image,
|
| + PixelFormat* format);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipBitmapLockBits)(
|
| + GpBitmap* bitmap,
|
| + GDIPCONST GpRect* rect,
|
| + UINT flags,
|
| + PixelFormat format,
|
| + BitmapData* lockedBitmapData);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImagePalette)(
|
| + GpImage* image,
|
| + ColorPalette* palette,
|
| + INT size);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImagePaletteSize)(GpImage* image,
|
| + INT* size);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipBitmapUnlockBits)(
|
| + GpBitmap* bitmap,
|
| + BitmapData* lockedBitmapData);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDisposeImage)(GpImage* image);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipFillRectangle)(GpGraphics* graphics,
|
| + GpBrush* brush,
|
| + REAL x,
|
| + REAL y,
|
| + REAL width,
|
| + REAL height);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromScan0)(
|
| + INT width,
|
| + INT height,
|
| + INT stride,
|
| + PixelFormat format,
|
| + BYTE* scan0,
|
| + GpBitmap** bitmap);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetImagePalette)(
|
| + GpImage* image,
|
| + GDIPCONST ColorPalette* palette);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetInterpolationMode)(
|
| + GpGraphics* graphics,
|
| + InterpolationMode interpolationMode);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawImagePointsI)(
|
| + GpGraphics* graphics,
|
| + GpImage* image,
|
| + GDIPCONST GpPoint* dstpoints,
|
| + INT count);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromGdiDib)(
|
| + GDIPCONST BITMAPINFO* gdiBitmapInfo,
|
| + VOID* gdiBitmapData,
|
| + GpBitmap** bitmap);
|
| +typedef Status(WINAPI* FuncType_GdiplusStartup)(
|
| + OUT uintptr_t* token,
|
| + const GdiplusStartupInput* input,
|
| + OUT GdiplusStartupOutput* output);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawLineI)(GpGraphics* graphics,
|
| + GpPen* pen,
|
| + int x1,
|
| + int y1,
|
| + int x2,
|
| + int y2);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipResetClip)(GpGraphics* graphics);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreatePath)(GpFillMode brushMode,
|
| + GpPath** path);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipAddPathPath)(
|
| + GpPath* path,
|
| + GDIPCONST GpPath* addingPath,
|
| + BOOL connect);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPathFillMode)(GpPath* path,
|
| + GpFillMode fillmode);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetClipPath)(GpGraphics* graphics,
|
| + GpPath* path,
|
| + CombineMode combineMode);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetClip)(GpGraphics* graphics,
|
| + GpRegion* region);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateRegion)(GpRegion** region);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetClipBoundsI)(GpGraphics* graphics,
|
| + GpRect* rect);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetClipRegion)(
|
| + GpGraphics* graphics,
|
| + GpRegion* region,
|
| + CombineMode combineMode);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipWidenPath)(GpPath* nativePath,
|
| + GpPen* pen,
|
| + GpMatrix* matrix,
|
| + REAL flatness);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipAddPathLine)(GpPath* path,
|
| + REAL x1,
|
| + REAL y1,
|
| + REAL x2,
|
| + REAL y2);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipAddPathRectangle)(GpPath* path,
|
| + REAL x,
|
| + REAL y,
|
| + REAL width,
|
| + REAL height);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteRegion)(GpRegion* region);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetDC)(GpGraphics* graphics,
|
| + HDC* hdc);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipReleaseDC)(GpGraphics* graphics,
|
| + HDC hdc);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenLineCap197819)(
|
| + GpPen* pen,
|
| + GpLineCap startCap,
|
| + GpLineCap endCap,
|
| + GpDashCap dashCap);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashOffset)(GpPen* pen,
|
| + REAL offset);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipResetPath)(GpPath* path);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateRegionPath)(GpPath* path,
|
| + GpRegion** region);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateFont)(
|
| + GDIPCONST GpFontFamily* fontFamily,
|
| + REAL emSize,
|
| + INT style,
|
| + Unit unit,
|
| + GpFont** font);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetFontSize)(GpFont* font,
|
| + REAL* size);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateFontFamilyFromName)(
|
| + GDIPCONST WCHAR* name,
|
| + GpFontCollection* fontCollection,
|
| + GpFontFamily** FontFamily);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetTextRenderingHint)(
|
| + GpGraphics* graphics,
|
| + TextRenderingHint mode);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawDriverString)(
|
| + GpGraphics* graphics,
|
| + GDIPCONST UINT16* text,
|
| + INT length,
|
| + GDIPCONST GpFont* font,
|
| + GDIPCONST GpBrush* brush,
|
| + GDIPCONST PointF* positions,
|
| + INT flags,
|
| + GDIPCONST GpMatrix* matrix);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateMatrix2)(REAL m11,
|
| + REAL m12,
|
| + REAL m21,
|
| + REAL m22,
|
| + REAL dx,
|
| + REAL dy,
|
| + GpMatrix** matrix);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteMatrix)(GpMatrix* matrix);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetWorldTransform)(
|
| + GpGraphics* graphics,
|
| + GpMatrix* matrix);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipResetWorldTransform)(
|
| + GpGraphics* graphics);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteFontFamily)(
|
| + GpFontFamily* FontFamily);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteFont)(GpFont* font);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipNewPrivateFontCollection)(
|
| + GpFontCollection** fontCollection);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeletePrivateFontCollection)(
|
| + GpFontCollection** fontCollection);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipPrivateAddMemoryFont)(
|
| + GpFontCollection* fontCollection,
|
| + GDIPCONST void* memory,
|
| + INT length);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetFontCollectionFamilyList)(
|
| + GpFontCollection* fontCollection,
|
| + INT numSought,
|
| + GpFontFamily* gpfamilies[],
|
| + INT* numFound);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetFontCollectionFamilyCount)(
|
| + GpFontCollection* fontCollection,
|
| + INT* numFound);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetTextContrast)(GpGraphics* graphics,
|
| + UINT contrast);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPixelOffsetMode)(
|
| + GpGraphics* graphics,
|
| + PixelOffsetMode pixelOffsetMode);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImageGraphicsContext)(
|
| + GpImage* image,
|
| + GpGraphics** graphics);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawImageI)(GpGraphics* graphics,
|
| + GpImage* image,
|
| + INT x,
|
| + INT y);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawImageRectI)(GpGraphics* graphics,
|
| + GpImage* image,
|
| + INT x,
|
| + INT y,
|
| + INT width,
|
| + INT height);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawString)(
|
| + GpGraphics* graphics,
|
| + GDIPCONST WCHAR* string,
|
| + INT length,
|
| + GDIPCONST GpFont* font,
|
| + GDIPCONST RectF* layoutRect,
|
| + GDIPCONST GpStringFormat* stringFormat,
|
| + GDIPCONST GpBrush* brush);
|
| +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenTransform)(GpPen* pen,
|
| + GpMatrix* matrix);
|
| +#define CallFunc(funcname) \
|
| + ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])
|
| +typedef HANDLE(__stdcall* FuncType_GdiAddFontMemResourceEx)(PVOID pbFont,
|
| + DWORD cbFont,
|
| + PVOID pdv,
|
| + DWORD* pcFonts);
|
| +typedef BOOL(__stdcall* FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);
|
| +void* CGdiplusExt::GdiAddFontMemResourceEx(void* pFontdata,
|
| + FX_DWORD size,
|
| + void* pdv,
|
| + FX_DWORD* num_face) {
|
| + if (m_pGdiAddFontMemResourceEx) {
|
| + return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)(
|
| + (PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);
|
| + }
|
| + return NULL;
|
| }
|
| -FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle)
|
| -{
|
| - if (m_pGdiRemoveFontMemResourseEx) {
|
| - return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)((HANDLE)handle);
|
| - }
|
| - return FALSE;
|
| +FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle) {
|
| + if (m_pGdiRemoveFontMemResourseEx) {
|
| + return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)(
|
| + (HANDLE)handle);
|
| + }
|
| + return FALSE;
|
| }
|
| -static GpBrush* _GdipCreateBrush(DWORD argb)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - GpSolidFill* solidBrush = NULL;
|
| - CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
|
| - return solidBrush;
|
| +static GpBrush* _GdipCreateBrush(DWORD argb) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + GpSolidFill* solidBrush = NULL;
|
| + CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
|
| + return solidBrush;
|
| }
|
| -static CFX_DIBitmap* _StretchMonoToGray(int dest_width, int dest_height,
|
| - const CFX_DIBitmap* pSource, FX_RECT* pClipRect)
|
| -{
|
| - FX_BOOL bFlipX = dest_width < 0;
|
| - if (bFlipX) {
|
| - dest_width = -dest_width;
|
| - }
|
| - FX_BOOL bFlipY = dest_height < 0;
|
| - if (bFlipY) {
|
| - dest_height = -dest_height;
|
| - }
|
| - int result_width = pClipRect->Width();
|
| - int result_height = pClipRect->Height();
|
| - int result_pitch = (result_width + 3) / 4 * 4;
|
| - CFX_DIBitmap* pStretched = new CFX_DIBitmap;
|
| - if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {
|
| - delete pStretched;
|
| - return NULL;
|
| - }
|
| - LPBYTE dest_buf = pStretched->GetBuffer();
|
| - int src_width = pSource->GetWidth();
|
| - int src_height = pSource->GetHeight();
|
| - int src_count = src_width * src_height;
|
| - int dest_count = dest_width * dest_height;
|
| - int ratio = 255 * dest_count / src_count;
|
| - int y_unit = src_height / dest_height;
|
| - int x_unit = src_width / dest_width;
|
| - int area_unit = y_unit * x_unit;
|
| - LPBYTE src_buf = pSource->GetBuffer();
|
| - int src_pitch = pSource->GetPitch();
|
| - for (int dest_y = 0; dest_y < result_height; dest_y ++) {
|
| - LPBYTE dest_scan = dest_buf + dest_y * result_pitch;
|
| - int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) : (dest_y + pClipRect->top);
|
| - src_y_start = src_y_start * src_height / dest_height;
|
| - LPBYTE src_scan = src_buf + src_y_start * src_pitch;
|
| - for (int dest_x = 0; dest_x < result_width; dest_x ++) {
|
| - int sum = 0;
|
| - int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) : (dest_x + pClipRect->left);
|
| - src_x_start = src_x_start * src_width / dest_width;
|
| - int src_x_end = src_x_start + x_unit;
|
| - LPBYTE src_line = src_scan;
|
| - for (int src_y = 0; src_y < y_unit; src_y ++) {
|
| - for (int src_x = src_x_start; src_x < src_x_end; src_x ++) {
|
| - if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {
|
| - sum += 255;
|
| - }
|
| - }
|
| - src_line += src_pitch;
|
| - }
|
| - dest_scan[dest_x] = 255 - sum / area_unit;
|
| +static CFX_DIBitmap* _StretchMonoToGray(int dest_width,
|
| + int dest_height,
|
| + const CFX_DIBitmap* pSource,
|
| + FX_RECT* pClipRect) {
|
| + FX_BOOL bFlipX = dest_width < 0;
|
| + if (bFlipX) {
|
| + dest_width = -dest_width;
|
| + }
|
| + FX_BOOL bFlipY = dest_height < 0;
|
| + if (bFlipY) {
|
| + dest_height = -dest_height;
|
| + }
|
| + int result_width = pClipRect->Width();
|
| + int result_height = pClipRect->Height();
|
| + int result_pitch = (result_width + 3) / 4 * 4;
|
| + CFX_DIBitmap* pStretched = new CFX_DIBitmap;
|
| + if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {
|
| + delete pStretched;
|
| + return NULL;
|
| + }
|
| + LPBYTE dest_buf = pStretched->GetBuffer();
|
| + int src_width = pSource->GetWidth();
|
| + int src_height = pSource->GetHeight();
|
| + int src_count = src_width * src_height;
|
| + int dest_count = dest_width * dest_height;
|
| + int ratio = 255 * dest_count / src_count;
|
| + int y_unit = src_height / dest_height;
|
| + int x_unit = src_width / dest_width;
|
| + int area_unit = y_unit * x_unit;
|
| + LPBYTE src_buf = pSource->GetBuffer();
|
| + int src_pitch = pSource->GetPitch();
|
| + for (int dest_y = 0; dest_y < result_height; dest_y++) {
|
| + LPBYTE dest_scan = dest_buf + dest_y * result_pitch;
|
| + int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top)
|
| + : (dest_y + pClipRect->top);
|
| + src_y_start = src_y_start * src_height / dest_height;
|
| + LPBYTE src_scan = src_buf + src_y_start * src_pitch;
|
| + for (int dest_x = 0; dest_x < result_width; dest_x++) {
|
| + int sum = 0;
|
| + int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left)
|
| + : (dest_x + pClipRect->left);
|
| + src_x_start = src_x_start * src_width / dest_width;
|
| + int src_x_end = src_x_start + x_unit;
|
| + LPBYTE src_line = src_scan;
|
| + for (int src_y = 0; src_y < y_unit; src_y++) {
|
| + for (int src_x = src_x_start; src_x < src_x_end; src_x++) {
|
| + if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {
|
| + sum += 255;
|
| + }
|
| }
|
| + src_line += src_pitch;
|
| + }
|
| + dest_scan[dest_x] = 255 - sum / area_unit;
|
| }
|
| - return pStretched;
|
| + }
|
| + return pStretched;
|
| }
|
| -static void OutputImageMask(GpGraphics* pGraphics, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
|
| - int dest_width, int dest_height, FX_ARGB argb, const FX_RECT* pClipRect)
|
| -{
|
| - ASSERT(pBitmap->GetBPP() == 1);
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();
|
| - int src_pitch = pBitmap->GetPitch();
|
| - uint8_t* scan0 = pBitmap->GetBuffer();
|
| - if (src_width == 1 && src_height == 1) {
|
| - if ((scan0[0] & 0x80) == 0) {
|
| - return;
|
| - }
|
| - GpSolidFill* solidBrush;
|
| - CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
|
| - if (dest_width < 0) {
|
| - dest_width = -dest_width;
|
| - dest_left -= dest_width;
|
| - }
|
| - if (dest_height < 0) {
|
| - dest_height = -dest_height;
|
| - dest_top -= dest_height;
|
| - }
|
| - CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, (float)dest_top,
|
| - (float)dest_width, (float)dest_height);
|
| - CallFunc(GdipDeleteBrush)(solidBrush);
|
| - return;
|
| - }
|
| - if (!bMonoDevice && abs(dest_width) < src_width && abs(dest_height) < src_height) {
|
| - FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
|
| - image_rect.Normalize();
|
| - FX_RECT image_clip = image_rect;
|
| - image_clip.Intersect(*pClipRect);
|
| - if (image_clip.IsEmpty()) {
|
| - return;
|
| - }
|
| - image_clip.Offset(-image_rect.left, -image_rect.top);
|
| - CFX_DIBitmap* pStretched = NULL;
|
| - if (src_width * src_height > 10000) {
|
| - pStretched = _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);
|
| - } else {
|
| - pStretched = pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);
|
| - }
|
| - GpBitmap* bitmap;
|
| - CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),
|
| - (image_clip.Width() + 3) / 4 * 4, PixelFormat8bppIndexed, pStretched->GetBuffer(), &bitmap);
|
| - int a, r, g, b;
|
| - ArgbDecode(argb, a, r, g, b);
|
| - UINT pal[258];
|
| - pal[0] = 0;
|
| - pal[1] = 256;
|
| - for (int i = 0; i < 256; i ++) {
|
| - pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);
|
| - }
|
| - CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
|
| - CallFunc(GdipDrawImageI)(pGraphics, bitmap, image_rect.left + image_clip.left,
|
| - image_rect.top + image_clip.top);
|
| - CallFunc(GdipDisposeImage)(bitmap);
|
| - delete pStretched;
|
| - return;
|
| - }
|
| - GpBitmap* bitmap;
|
| - CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, PixelFormat1bppIndexed, scan0, &bitmap);
|
| - UINT palette[4] = { PaletteFlagsHasAlpha, 2, 0, argb };
|
| - CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);
|
| - Point destinationPoints[] = {
|
| - Point(dest_left, dest_top),
|
| - Point(dest_left + dest_width, dest_top),
|
| - Point(dest_left, dest_top + dest_height)
|
| - };
|
| - CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
|
| - CallFunc(GdipDisposeImage)(bitmap);
|
| -}
|
| -static void OutputImage(GpGraphics* pGraphics, const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect,
|
| - int dest_left, int dest_top, int dest_width, int dest_height)
|
| -{
|
| - int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {
|
| - FX_RECT new_rect(0, 0, src_width, src_height);
|
| - CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);
|
| - if (!pCloned) {
|
| - return;
|
| - }
|
| - OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width, dest_height);
|
| - delete pCloned;
|
| - return;
|
| - }
|
| - int src_pitch = pBitmap->GetPitch();
|
| - uint8_t* scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + pBitmap->GetBPP() * pSrcRect->left / 8;
|
| - GpBitmap* bitmap = NULL;
|
| - switch (pBitmap->GetFormat()) {
|
| - case FXDIB_Argb:
|
| - CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| - PixelFormat32bppARGB, scan0, &bitmap);
|
| - break;
|
| - case FXDIB_Rgb32:
|
| - CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| - PixelFormat32bppRGB, scan0, &bitmap);
|
| - break;
|
| - case FXDIB_Rgb:
|
| - CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| - PixelFormat24bppRGB, scan0, &bitmap);
|
| - break;
|
| - case FXDIB_8bppRgb: {
|
| - CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| - PixelFormat8bppIndexed, scan0, &bitmap);
|
| - UINT pal[258];
|
| - pal[0] = 0;
|
| - pal[1] = 256;
|
| - for (int i = 0; i < 256; i ++) {
|
| - pal[i + 2] = pBitmap->GetPaletteEntry(i);
|
| - }
|
| - CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
|
| - break;
|
| - }
|
| - case FXDIB_1bppRgb: {
|
| - CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| - PixelFormat1bppIndexed, scan0, &bitmap);
|
| - break;
|
| - }
|
| +static void OutputImageMask(GpGraphics* pGraphics,
|
| + BOOL bMonoDevice,
|
| + const CFX_DIBitmap* pBitmap,
|
| + int dest_left,
|
| + int dest_top,
|
| + int dest_width,
|
| + int dest_height,
|
| + FX_ARGB argb,
|
| + const FX_RECT* pClipRect) {
|
| + ASSERT(pBitmap->GetBPP() == 1);
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();
|
| + int src_pitch = pBitmap->GetPitch();
|
| + uint8_t* scan0 = pBitmap->GetBuffer();
|
| + if (src_width == 1 && src_height == 1) {
|
| + if ((scan0[0] & 0x80) == 0) {
|
| + return;
|
| + }
|
| + GpSolidFill* solidBrush;
|
| + CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
|
| + if (dest_width < 0) {
|
| + dest_width = -dest_width;
|
| + dest_left -= dest_width;
|
| }
|
| if (dest_height < 0) {
|
| - dest_height --;
|
| - }
|
| - if (dest_width < 0) {
|
| - dest_width --;
|
| + dest_height = -dest_height;
|
| + dest_top -= dest_height;
|
| + }
|
| + CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left,
|
| + (float)dest_top, (float)dest_width,
|
| + (float)dest_height);
|
| + CallFunc(GdipDeleteBrush)(solidBrush);
|
| + return;
|
| + }
|
| + if (!bMonoDevice && abs(dest_width) < src_width &&
|
| + abs(dest_height) < src_height) {
|
| + FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width,
|
| + dest_top + dest_height);
|
| + image_rect.Normalize();
|
| + FX_RECT image_clip = image_rect;
|
| + image_clip.Intersect(*pClipRect);
|
| + if (image_clip.IsEmpty()) {
|
| + return;
|
| + }
|
| + image_clip.Offset(-image_rect.left, -image_rect.top);
|
| + CFX_DIBitmap* pStretched = NULL;
|
| + if (src_width * src_height > 10000) {
|
| + pStretched =
|
| + _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);
|
| + } else {
|
| + pStretched =
|
| + pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);
|
| }
|
| - Point destinationPoints[] = {
|
| - Point(dest_left, dest_top),
|
| - Point(dest_left + dest_width, dest_top),
|
| - Point(dest_left, dest_top + dest_height)
|
| - };
|
| - CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
|
| + GpBitmap* bitmap;
|
| + CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),
|
| + (image_clip.Width() + 3) / 4 * 4,
|
| + PixelFormat8bppIndexed,
|
| + pStretched->GetBuffer(), &bitmap);
|
| + int a, r, g, b;
|
| + ArgbDecode(argb, a, r, g, b);
|
| + UINT pal[258];
|
| + pal[0] = 0;
|
| + pal[1] = 256;
|
| + for (int i = 0; i < 256; i++) {
|
| + pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);
|
| + }
|
| + CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
|
| + CallFunc(GdipDrawImageI)(pGraphics, bitmap,
|
| + image_rect.left + image_clip.left,
|
| + image_rect.top + image_clip.top);
|
| CallFunc(GdipDisposeImage)(bitmap);
|
| + delete pStretched;
|
| + return;
|
| + }
|
| + GpBitmap* bitmap;
|
| + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| + PixelFormat1bppIndexed, scan0, &bitmap);
|
| + UINT palette[4] = {PaletteFlagsHasAlpha, 2, 0, argb};
|
| + CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);
|
| + Point destinationPoints[] = {Point(dest_left, dest_top),
|
| + Point(dest_left + dest_width, dest_top),
|
| + Point(dest_left, dest_top + dest_height)};
|
| + CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
|
| + CallFunc(GdipDisposeImage)(bitmap);
|
| }
|
| -CGdiplusExt::CGdiplusExt()
|
| -{
|
| - m_hModule = NULL;
|
| - m_GdiModule = NULL;
|
| - for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
|
| - m_Functions[i] = NULL;
|
| - }
|
| - m_pGdiAddFontMemResourceEx = NULL;
|
| - m_pGdiRemoveFontMemResourseEx = NULL;
|
| +static void OutputImage(GpGraphics* pGraphics,
|
| + const CFX_DIBitmap* pBitmap,
|
| + const FX_RECT* pSrcRect,
|
| + int dest_left,
|
| + int dest_top,
|
| + int dest_width,
|
| + int dest_height) {
|
| + int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {
|
| + FX_RECT new_rect(0, 0, src_width, src_height);
|
| + CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);
|
| + if (!pCloned) {
|
| + return;
|
| + }
|
| + OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width,
|
| + dest_height);
|
| + delete pCloned;
|
| + return;
|
| + }
|
| + int src_pitch = pBitmap->GetPitch();
|
| + uint8_t* scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch +
|
| + pBitmap->GetBPP() * pSrcRect->left / 8;
|
| + GpBitmap* bitmap = NULL;
|
| + switch (pBitmap->GetFormat()) {
|
| + case FXDIB_Argb:
|
| + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| + PixelFormat32bppARGB, scan0, &bitmap);
|
| + break;
|
| + case FXDIB_Rgb32:
|
| + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| + PixelFormat32bppRGB, scan0, &bitmap);
|
| + break;
|
| + case FXDIB_Rgb:
|
| + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| + PixelFormat24bppRGB, scan0, &bitmap);
|
| + break;
|
| + case FXDIB_8bppRgb: {
|
| + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| + PixelFormat8bppIndexed, scan0,
|
| + &bitmap);
|
| + UINT pal[258];
|
| + pal[0] = 0;
|
| + pal[1] = 256;
|
| + for (int i = 0; i < 256; i++) {
|
| + pal[i + 2] = pBitmap->GetPaletteEntry(i);
|
| + }
|
| + CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
|
| + break;
|
| + }
|
| + case FXDIB_1bppRgb: {
|
| + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
|
| + PixelFormat1bppIndexed, scan0,
|
| + &bitmap);
|
| + break;
|
| + }
|
| + }
|
| + if (dest_height < 0) {
|
| + dest_height--;
|
| + }
|
| + if (dest_width < 0) {
|
| + dest_width--;
|
| + }
|
| + Point destinationPoints[] = {Point(dest_left, dest_top),
|
| + Point(dest_left + dest_width, dest_top),
|
| + Point(dest_left, dest_top + dest_height)};
|
| + CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
|
| + CallFunc(GdipDisposeImage)(bitmap);
|
| }
|
| -void CGdiplusExt::Load()
|
| -{
|
| - CFX_ByteString strPlusPath = "";
|
| - FX_CHAR buf[MAX_PATH];
|
| - GetSystemDirectoryA(buf, MAX_PATH);
|
| - strPlusPath += buf;
|
| - strPlusPath += "\\";
|
| - strPlusPath += "GDIPLUS.DLL";
|
| - m_hModule = LoadLibraryA(strPlusPath);
|
| - if (m_hModule == NULL) {
|
| - return;
|
| - }
|
| - for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
|
| - m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);
|
| - if (m_Functions[i] == NULL) {
|
| - m_hModule = NULL;
|
| - return;
|
| - }
|
| - }
|
| - uintptr_t gdiplusToken;
|
| - GdiplusStartupInput gdiplusStartupInput;
|
| - ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(&gdiplusToken, &gdiplusStartupInput, NULL);
|
| - m_GdiModule = LoadLibraryA("GDI32.DLL");
|
| - if (m_GdiModule == NULL) {
|
| - return;
|
| - }
|
| - m_pGdiAddFontMemResourceEx = GetProcAddress(m_GdiModule, "AddFontMemResourceEx");
|
| - m_pGdiRemoveFontMemResourseEx = GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx");
|
| +CGdiplusExt::CGdiplusExt() {
|
| + m_hModule = NULL;
|
| + m_GdiModule = NULL;
|
| + for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i++) {
|
| + m_Functions[i] = NULL;
|
| + }
|
| + m_pGdiAddFontMemResourceEx = NULL;
|
| + m_pGdiRemoveFontMemResourseEx = NULL;
|
| }
|
| -CGdiplusExt::~CGdiplusExt()
|
| -{
|
| +void CGdiplusExt::Load() {
|
| + CFX_ByteString strPlusPath = "";
|
| + FX_CHAR buf[MAX_PATH];
|
| + GetSystemDirectoryA(buf, MAX_PATH);
|
| + strPlusPath += buf;
|
| + strPlusPath += "\\";
|
| + strPlusPath += "GDIPLUS.DLL";
|
| + m_hModule = LoadLibraryA(strPlusPath);
|
| + if (m_hModule == NULL) {
|
| + return;
|
| + }
|
| + for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i++) {
|
| + m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);
|
| + if (m_Functions[i] == NULL) {
|
| + m_hModule = NULL;
|
| + return;
|
| + }
|
| + }
|
| + uintptr_t gdiplusToken;
|
| + GdiplusStartupInput gdiplusStartupInput;
|
| + ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(
|
| + &gdiplusToken, &gdiplusStartupInput, NULL);
|
| + m_GdiModule = LoadLibraryA("GDI32.DLL");
|
| + if (m_GdiModule == NULL) {
|
| + return;
|
| + }
|
| + m_pGdiAddFontMemResourceEx =
|
| + GetProcAddress(m_GdiModule, "AddFontMemResourceEx");
|
| + m_pGdiRemoveFontMemResourseEx =
|
| + GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx");
|
| }
|
| -LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size)
|
| -{
|
| - GpFontCollection* pCollection = NULL;
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipNewPrivateFontCollection)(&pCollection);
|
| - GpStatus status = CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);
|
| - if (status == Ok) {
|
| - return pCollection;
|
| - }
|
| - CallFunc(GdipDeletePrivateFontCollection)(&pCollection);
|
| - return NULL;
|
| +CGdiplusExt::~CGdiplusExt() {}
|
| +LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size) {
|
| + GpFontCollection* pCollection = NULL;
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipNewPrivateFontCollection)(&pCollection);
|
| + GpStatus status =
|
| + CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);
|
| + if (status == Ok) {
|
| + return pCollection;
|
| + }
|
| + CallFunc(GdipDeletePrivateFontCollection)(&pCollection);
|
| + return NULL;
|
| }
|
| -void CGdiplusExt::DeleteMemFont(LPVOID pCollection)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);
|
| +void CGdiplusExt::DeleteMemFont(LPVOID pCollection) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);
|
| }
|
| -FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - PixelFormat format;
|
| - switch (pBitmap->GetFormat()) {
|
| - case FXDIB_Rgb:
|
| - format = PixelFormat24bppRGB;
|
| - break;
|
| - case FXDIB_Rgb32:
|
| - format = PixelFormat32bppRGB;
|
| - break;
|
| - case FXDIB_Argb:
|
| - format = PixelFormat32bppARGB;
|
| - break;
|
| - default:
|
| - return FALSE;
|
| - }
|
| - GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(pBitmap->GetWidth(), pBitmap->GetHeight(),
|
| - pBitmap->GetPitch(), format, pBitmap->GetBuffer(), (GpBitmap**)bitmap);
|
| - if (status == Ok) {
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| +FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void** bitmap) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + PixelFormat format;
|
| + switch (pBitmap->GetFormat()) {
|
| + case FXDIB_Rgb:
|
| + format = PixelFormat24bppRGB;
|
| + break;
|
| + case FXDIB_Rgb32:
|
| + format = PixelFormat32bppRGB;
|
| + break;
|
| + case FXDIB_Argb:
|
| + format = PixelFormat32bppARGB;
|
| + break;
|
| + default:
|
| + return FALSE;
|
| + }
|
| + GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(
|
| + pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap->GetPitch(), format,
|
| + pBitmap->GetBuffer(), (GpBitmap**)bitmap);
|
| + if (status == Ok) {
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| }
|
| -FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - GpStatus status = CallFunc(GdipGetImageGraphicsContext)((GpBitmap*)bitmap, (GpGraphics**)graphics);
|
| - if (status == Ok) {
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| +FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + GpStatus status = CallFunc(GdipGetImageGraphicsContext)(
|
| + (GpBitmap*)bitmap, (GpGraphics**)graphics);
|
| + if (status == Ok) {
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| }
|
| -FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(const FX_WCHAR* name, void* pFontCollection, void**pFamily)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - GpStatus status = CallFunc(GdipCreateFontFamilyFromName)((GDIPCONST WCHAR *)name, (GpFontCollection*)pFontCollection, (GpFontFamily**)pFamily);
|
| - if (status == Ok) {
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| +FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(const FX_WCHAR* name,
|
| + void* pFontCollection,
|
| + void** pFamily) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + GpStatus status = CallFunc(GdipCreateFontFamilyFromName)(
|
| + (GDIPCONST WCHAR*)name, (GpFontCollection*)pFontCollection,
|
| + (GpFontFamily**)pFamily);
|
| + if (status == Ok) {
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| }
|
| -FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - GpStatus status = CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, Unit(flag), (GpFont**)pFont);
|
| - if (status == Ok) {
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| +FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily,
|
| + FX_FLOAT font_size,
|
| + int fontstyle,
|
| + int flag,
|
| + void** pFont) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + GpStatus status =
|
| + CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle,
|
| + Unit(flag), (GpFont**)pFont);
|
| + if (status == Ok) {
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| }
|
| -void CGdiplusExt::GdipGetFontSize(void *pFont, FX_FLOAT *size)
|
| -{
|
| - REAL get_size;
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - GpStatus status = CallFunc(GdipGetFontSize)((GpFont *)pFont, (REAL*)&get_size);
|
| - if (status == Ok) {
|
| - *size = (FX_FLOAT)get_size;
|
| - } else {
|
| - *size = 0;
|
| - }
|
| +void CGdiplusExt::GdipGetFontSize(void* pFont, FX_FLOAT* size) {
|
| + REAL get_size;
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + GpStatus status = CallFunc(GdipGetFontSize)((GpFont*)pFont, (REAL*)&get_size);
|
| + if (status == Ok) {
|
| + *size = (FX_FLOAT)get_size;
|
| + } else {
|
| + *size = 0;
|
| + }
|
| }
|
| -void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, (TextRenderingHint)mode);
|
| +void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics,
|
| + (TextRenderingHint)mode);
|
| }
|
| -void CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);
|
| +void CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);
|
| }
|
| -FX_BOOL CGdiplusExt::GdipDrawDriverString(void *graphics, unsigned short *text, int length,
|
| - void *font, void* brush, void *positions, int flags, const void *matrix)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - GpStatus status = CallFunc(GdipDrawDriverString)((GpGraphics*)graphics, (GDIPCONST UINT16 *)text, (INT)length, (GDIPCONST GpFont *)font, (GDIPCONST GpBrush*)brush,
|
| - (GDIPCONST PointF *)positions, (INT)flags, (GDIPCONST GpMatrix *)matrix);
|
| - if (status == Ok) {
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| +FX_BOOL CGdiplusExt::GdipDrawDriverString(void* graphics,
|
| + unsigned short* text,
|
| + int length,
|
| + void* font,
|
| + void* brush,
|
| + void* positions,
|
| + int flags,
|
| + const void* matrix) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + GpStatus status = CallFunc(GdipDrawDriverString)(
|
| + (GpGraphics*)graphics, (GDIPCONST UINT16*)text, (INT)length,
|
| + (GDIPCONST GpFont*)font, (GDIPCONST GpBrush*)brush,
|
| + (GDIPCONST PointF*)positions, (INT)flags, (GDIPCONST GpMatrix*)matrix);
|
| + if (status == Ok) {
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| }
|
| -void CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);
|
| +void CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);
|
| }
|
| -void CGdiplusExt::GdipDeleteBrush(void* pBrush)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);
|
| +void CGdiplusExt::GdipDeleteBrush(void* pBrush) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);
|
| }
|
| -void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - int numFamilies = 0;
|
| - GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)((GpFontCollection*)pFontCollection, &numFamilies);
|
| - if (status != Ok) {
|
| - return NULL;
|
| - }
|
| - GpFontFamily* family_list[1];
|
| - status = CallFunc(GdipGetFontCollectionFamilyList)((GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);
|
| - if (status != Ok) {
|
| - return NULL;
|
| - }
|
| - GpFont* pFont = NULL;
|
| - status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, UnitPixel, &pFont);
|
| - if (status != Ok) {
|
| - return NULL;
|
| - }
|
| - return pFont;
|
| +void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection,
|
| + FX_FLOAT font_size,
|
| + int fontstyle) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + int numFamilies = 0;
|
| + GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)(
|
| + (GpFontCollection*)pFontCollection, &numFamilies);
|
| + if (status != Ok) {
|
| + return NULL;
|
| + }
|
| + GpFontFamily* family_list[1];
|
| + status = CallFunc(GdipGetFontCollectionFamilyList)(
|
| + (GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);
|
| + if (status != Ok) {
|
| + return NULL;
|
| + }
|
| + GpFont* pFont = NULL;
|
| + status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle,
|
| + UnitPixel, &pFont);
|
| + if (status != Ok) {
|
| + return NULL;
|
| + }
|
| + return pFont;
|
| }
|
| -void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);
|
| +void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a,
|
| + FX_FLOAT b,
|
| + FX_FLOAT c,
|
| + FX_FLOAT d,
|
| + FX_FLOAT e,
|
| + FX_FLOAT f,
|
| + void** matrix) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);
|
| }
|
| -void CGdiplusExt::GdipDeleteMatrix(void* matrix)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);
|
| +void CGdiplusExt::GdipDeleteMatrix(void* matrix) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);
|
| }
|
| -void CGdiplusExt::GdipDeleteFontFamily(void* pFamily)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);
|
| +void CGdiplusExt::GdipDeleteFontFamily(void* pFamily) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);
|
| }
|
| -void CGdiplusExt::GdipDeleteFont(void* pFont)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipDeleteFont)((GpFont*)pFont);
|
| +void CGdiplusExt::GdipDeleteFont(void* pFont) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipDeleteFont)((GpFont*)pFont);
|
| }
|
| -void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);
|
| +void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);
|
| }
|
| -void CGdiplusExt::GdipDisposeImage(void* bitmap)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);
|
| +void CGdiplusExt::GdipDisposeImage(void* bitmap) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);
|
| }
|
| -void CGdiplusExt::GdipDeleteGraphics(void* graphics)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);
|
| +void CGdiplusExt::GdipDeleteGraphics(void* graphics) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);
|
| }
|
| -FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
|
| - int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags)
|
| -{
|
| - ASSERT(pBitmap->GetBPP() == 1);
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - GpGraphics* pGraphics = NULL;
|
| - CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
|
| - CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
|
| - if (flags & FXDIB_NOSMOOTH) {
|
| - CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
|
| - } else {
|
| - CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
|
| - }
|
| - OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, dest_width, dest_height, argb, pClipRect);
|
| - CallFunc(GdipDeleteGraphics)(pGraphics);
|
| - return TRUE;
|
| +FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC,
|
| + BOOL bMonoDevice,
|
| + const CFX_DIBitmap* pBitmap,
|
| + int dest_left,
|
| + int dest_top,
|
| + int dest_width,
|
| + int dest_height,
|
| + FX_DWORD argb,
|
| + const FX_RECT* pClipRect,
|
| + int flags) {
|
| + ASSERT(pBitmap->GetBPP() == 1);
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + GpGraphics* pGraphics = NULL;
|
| + CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
|
| + CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
|
| + if (flags & FXDIB_NOSMOOTH) {
|
| + CallFunc(GdipSetInterpolationMode)(pGraphics,
|
| + InterpolationModeNearestNeighbor);
|
| + } else {
|
| + CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
|
| + }
|
| + OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top,
|
| + dest_width, dest_height, argb, pClipRect);
|
| + CallFunc(GdipDeleteGraphics)(pGraphics);
|
| + return TRUE;
|
| }
|
| -FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
|
| - int dest_width, int dest_height, const FX_RECT* pClipRect, int flags)
|
| -{
|
| - GpGraphics* pGraphics;
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
|
| - CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
|
| - if (flags & FXDIB_NOSMOOTH) {
|
| - CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
|
| - } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || pBitmap->GetHeight() > abs(dest_height) / 2) {
|
| - CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
|
| - } else {
|
| - CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);
|
| - }
|
| - FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
|
| - OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, dest_height);
|
| - CallFunc(GdipDeleteGraphics)(pGraphics);
|
| - CallFunc(GdipDeleteGraphics)(pGraphics);
|
| - return TRUE;
|
| +FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC,
|
| + const CFX_DIBitmap* pBitmap,
|
| + int dest_left,
|
| + int dest_top,
|
| + int dest_width,
|
| + int dest_height,
|
| + const FX_RECT* pClipRect,
|
| + int flags) {
|
| + GpGraphics* pGraphics;
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
|
| + CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
|
| + if (flags & FXDIB_NOSMOOTH) {
|
| + CallFunc(GdipSetInterpolationMode)(pGraphics,
|
| + InterpolationModeNearestNeighbor);
|
| + } else if (pBitmap->GetWidth() > abs(dest_width) / 2 ||
|
| + pBitmap->GetHeight() > abs(dest_height) / 2) {
|
| + CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
|
| + } else {
|
| + CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);
|
| + }
|
| + FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
|
| + OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width,
|
| + dest_height);
|
| + CallFunc(GdipDeleteGraphics)(pGraphics);
|
| + CallFunc(GdipDeleteGraphics)(pGraphics);
|
| + return TRUE;
|
| }
|
| -static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, DWORD argb, FX_BOOL bTextMode = FALSE)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;
|
| - if (!bTextMode) {
|
| - FX_FLOAT unit = pMatrix == NULL ? 1.0f : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);
|
| - if (width < unit) {
|
| - width = unit;
|
| - }
|
| - }
|
| - GpPen* pPen = NULL;
|
| - CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);
|
| - LineCap lineCap;
|
| - DashCap dashCap = DashCapFlat;
|
| - FX_BOOL bDashExtend = FALSE;
|
| - switch(pGraphState->m_LineCap) {
|
| - case CFX_GraphStateData::LineCapButt:
|
| - lineCap = LineCapFlat;
|
| - break;
|
| - case CFX_GraphStateData::LineCapRound:
|
| - lineCap = LineCapRound;
|
| - dashCap = DashCapRound;
|
| - bDashExtend = TRUE;
|
| - break;
|
| - case CFX_GraphStateData::LineCapSquare:
|
| - lineCap = LineCapSquare;
|
| - bDashExtend = TRUE;
|
| - break;
|
| - }
|
| - CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);
|
| - LineJoin lineJoin;
|
| - switch(pGraphState->m_LineJoin) {
|
| - case CFX_GraphStateData::LineJoinMiter:
|
| - lineJoin = LineJoinMiterClipped;
|
| - break;
|
| - case CFX_GraphStateData::LineJoinRound:
|
| - lineJoin = LineJoinRound;
|
| - break;
|
| - case CFX_GraphStateData::LineJoinBevel:
|
| - lineJoin = LineJoinBevel;
|
| - break;
|
| - }
|
| - CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);
|
| - if(pGraphState->m_DashCount) {
|
| - FX_FLOAT* pDashArray = FX_Alloc(FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);
|
| - int nCount = 0;
|
| - FX_FLOAT on_leftover = 0, off_leftover = 0;
|
| - for (int i = 0; i < pGraphState->m_DashCount; i += 2) {
|
| - FX_FLOAT on_phase = pGraphState->m_DashArray[i];
|
| - FX_FLOAT off_phase;
|
| - if (i == pGraphState->m_DashCount - 1) {
|
| - off_phase = on_phase;
|
| - } else {
|
| - off_phase = pGraphState->m_DashArray[i + 1];
|
| - }
|
| - on_phase /= width;
|
| - off_phase /= width;
|
| - if (on_phase + off_phase <= 0.00002f) {
|
| - on_phase = 1.0f / 10;
|
| - off_phase = 1.0f / 10;
|
| - }
|
| - if (bDashExtend) {
|
| - if (off_phase < 1) {
|
| - off_phase = 0;
|
| - } else {
|
| - off_phase -= 1;
|
| - }
|
| - on_phase += 1;
|
| - }
|
| - if (on_phase == 0 || off_phase == 0) {
|
| - if (nCount == 0) {
|
| - on_leftover += on_phase;
|
| - off_leftover += off_phase;
|
| - } else {
|
| - pDashArray[nCount - 2] += on_phase;
|
| - pDashArray[nCount - 1] += off_phase;
|
| - }
|
| - } else {
|
| - pDashArray[nCount++] = on_phase + on_leftover;
|
| - on_leftover = 0;
|
| - pDashArray[nCount++] = off_phase + off_leftover;
|
| - off_leftover = 0;
|
| - }
|
| +static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState,
|
| + const CFX_AffineMatrix* pMatrix,
|
| + DWORD argb,
|
| + FX_BOOL bTextMode = FALSE) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;
|
| + if (!bTextMode) {
|
| + FX_FLOAT unit =
|
| + pMatrix == NULL
|
| + ? 1.0f
|
| + : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);
|
| + if (width < unit) {
|
| + width = unit;
|
| + }
|
| + }
|
| + GpPen* pPen = NULL;
|
| + CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);
|
| + LineCap lineCap;
|
| + DashCap dashCap = DashCapFlat;
|
| + FX_BOOL bDashExtend = FALSE;
|
| + switch (pGraphState->m_LineCap) {
|
| + case CFX_GraphStateData::LineCapButt:
|
| + lineCap = LineCapFlat;
|
| + break;
|
| + case CFX_GraphStateData::LineCapRound:
|
| + lineCap = LineCapRound;
|
| + dashCap = DashCapRound;
|
| + bDashExtend = TRUE;
|
| + break;
|
| + case CFX_GraphStateData::LineCapSquare:
|
| + lineCap = LineCapSquare;
|
| + bDashExtend = TRUE;
|
| + break;
|
| + }
|
| + CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);
|
| + LineJoin lineJoin;
|
| + switch (pGraphState->m_LineJoin) {
|
| + case CFX_GraphStateData::LineJoinMiter:
|
| + lineJoin = LineJoinMiterClipped;
|
| + break;
|
| + case CFX_GraphStateData::LineJoinRound:
|
| + lineJoin = LineJoinRound;
|
| + break;
|
| + case CFX_GraphStateData::LineJoinBevel:
|
| + lineJoin = LineJoinBevel;
|
| + break;
|
| + }
|
| + CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);
|
| + if (pGraphState->m_DashCount) {
|
| + FX_FLOAT* pDashArray = FX_Alloc(
|
| + FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);
|
| + int nCount = 0;
|
| + FX_FLOAT on_leftover = 0, off_leftover = 0;
|
| + for (int i = 0; i < pGraphState->m_DashCount; i += 2) {
|
| + FX_FLOAT on_phase = pGraphState->m_DashArray[i];
|
| + FX_FLOAT off_phase;
|
| + if (i == pGraphState->m_DashCount - 1) {
|
| + off_phase = on_phase;
|
| + } else {
|
| + off_phase = pGraphState->m_DashArray[i + 1];
|
| + }
|
| + on_phase /= width;
|
| + off_phase /= width;
|
| + if (on_phase + off_phase <= 0.00002f) {
|
| + on_phase = 1.0f / 10;
|
| + off_phase = 1.0f / 10;
|
| + }
|
| + if (bDashExtend) {
|
| + if (off_phase < 1) {
|
| + off_phase = 0;
|
| + } else {
|
| + off_phase -= 1;
|
| }
|
| - CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);
|
| - FX_FLOAT phase = pGraphState->m_DashPhase;
|
| - if (bDashExtend) {
|
| - if (phase < 0.5f) {
|
| - phase = 0;
|
| - } else {
|
| - phase -= 0.5f;
|
| - }
|
| + on_phase += 1;
|
| + }
|
| + if (on_phase == 0 || off_phase == 0) {
|
| + if (nCount == 0) {
|
| + on_leftover += on_phase;
|
| + off_leftover += off_phase;
|
| + } else {
|
| + pDashArray[nCount - 2] += on_phase;
|
| + pDashArray[nCount - 1] += off_phase;
|
| }
|
| - CallFunc(GdipSetPenDashOffset)(pPen, phase);
|
| - FX_Free(pDashArray);
|
| - pDashArray = NULL;
|
| - }
|
| - CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);
|
| - return pPen;
|
| + } else {
|
| + pDashArray[nCount++] = on_phase + on_leftover;
|
| + on_leftover = 0;
|
| + pDashArray[nCount++] = off_phase + off_leftover;
|
| + off_leftover = 0;
|
| + }
|
| + }
|
| + CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);
|
| + FX_FLOAT phase = pGraphState->m_DashPhase;
|
| + if (bDashExtend) {
|
| + if (phase < 0.5f) {
|
| + phase = 0;
|
| + } else {
|
| + phase -= 0.5f;
|
| + }
|
| + }
|
| + CallFunc(GdipSetPenDashOffset)(pPen, phase);
|
| + FX_Free(pDashArray);
|
| + pDashArray = NULL;
|
| + }
|
| + CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);
|
| + return pPen;
|
| }
|
| -static FX_BOOL IsSmallTriangle(PointF* points, const CFX_AffineMatrix* pMatrix, int& v1, int& v2)
|
| -{
|
| - int pairs[] = {1, 2, 0, 2, 0, 1};
|
| - for (int i = 0; i < 3; i ++) {
|
| - int pair1 = pairs[i * 2];
|
| - int pair2 = pairs[i * 2 + 1];
|
| - FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;
|
| - FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;
|
| - if (pMatrix) {
|
| - pMatrix->Transform(x1, y1);
|
| - pMatrix->Transform(x2, y2);
|
| - }
|
| - FX_FLOAT dx = x1 - x2;
|
| - FX_FLOAT dy = y1 - y2;
|
| - FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);
|
| - if (distance_square < (1.0f * 2 + 1.0f / 4)) {
|
| - v1 = i;
|
| - v2 = pair1;
|
| - return TRUE;
|
| - }
|
| - }
|
| - return FALSE;
|
| +static FX_BOOL IsSmallTriangle(PointF* points,
|
| + const CFX_AffineMatrix* pMatrix,
|
| + int& v1,
|
| + int& v2) {
|
| + int pairs[] = {1, 2, 0, 2, 0, 1};
|
| + for (int i = 0; i < 3; i++) {
|
| + int pair1 = pairs[i * 2];
|
| + int pair2 = pairs[i * 2 + 1];
|
| + FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;
|
| + FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;
|
| + if (pMatrix) {
|
| + pMatrix->Transform(x1, y1);
|
| + pMatrix->Transform(x2, y2);
|
| + }
|
| + FX_FLOAT dx = x1 - x2;
|
| + FX_FLOAT dy = y1 - y2;
|
| + FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);
|
| + if (distance_square < (1.0f * 2 + 1.0f / 4)) {
|
| + v1 = i;
|
| + v2 = pair1;
|
| + return TRUE;
|
| + }
|
| + }
|
| + return FALSE;
|
| }
|
| -FX_BOOL CGdiplusExt::DrawPath(HDC hDC, const CFX_PathData* pPathData,
|
| - const CFX_AffineMatrix* pObject2Device,
|
| - const CFX_GraphStateData* pGraphState,
|
| - FX_DWORD fill_argb,
|
| - FX_DWORD stroke_argb,
|
| - int fill_mode
|
| - )
|
| -{
|
| - int nPoints = pPathData->GetPointCount();
|
| - if (nPoints == 0) {
|
| - return TRUE;
|
| - }
|
| - FX_PATHPOINT* pPoints = pPathData->GetPoints();
|
| - GpGraphics* pGraphics = NULL;
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
|
| - CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
|
| - CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);
|
| - GpMatrix* pMatrix = NULL;
|
| +FX_BOOL CGdiplusExt::DrawPath(HDC hDC,
|
| + const CFX_PathData* pPathData,
|
| + const CFX_AffineMatrix* pObject2Device,
|
| + const CFX_GraphStateData* pGraphState,
|
| + FX_DWORD fill_argb,
|
| + FX_DWORD stroke_argb,
|
| + int fill_mode) {
|
| + int nPoints = pPathData->GetPointCount();
|
| + if (nPoints == 0) {
|
| + return TRUE;
|
| + }
|
| + FX_PATHPOINT* pPoints = pPathData->GetPoints();
|
| + GpGraphics* pGraphics = NULL;
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
|
| + CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
|
| + CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);
|
| + GpMatrix* pMatrix = NULL;
|
| + if (pObject2Device) {
|
| + CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b,
|
| + pObject2Device->c, pObject2Device->d,
|
| + pObject2Device->e, pObject2Device->f, &pMatrix);
|
| + CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);
|
| + }
|
| + PointF* points = FX_Alloc(PointF, nPoints);
|
| + BYTE* types = FX_Alloc(BYTE, nPoints);
|
| + int nSubPathes = 0;
|
| + FX_BOOL bSubClose = FALSE;
|
| + int pos_subclose = 0;
|
| + FX_BOOL bSmooth = FALSE;
|
| + int startpoint = 0;
|
| + for (int i = 0; i < nPoints; i++) {
|
| + points[i].X = pPoints[i].m_PointX;
|
| + points[i].Y = pPoints[i].m_PointY;
|
| + FX_FLOAT x, y;
|
| if (pObject2Device) {
|
| - CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, pObject2Device->c, pObject2Device->d, pObject2Device->e, pObject2Device->f, &pMatrix);
|
| - CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);
|
| - }
|
| - PointF *points = FX_Alloc(PointF, nPoints);
|
| - BYTE * types = FX_Alloc(BYTE, nPoints);
|
| - int nSubPathes = 0;
|
| - FX_BOOL bSubClose = FALSE;
|
| - int pos_subclose = 0;
|
| - FX_BOOL bSmooth = FALSE;
|
| - int startpoint = 0;
|
| - for(int i = 0; i < nPoints; i++) {
|
| - points[i].X = pPoints[i].m_PointX;
|
| - points[i].Y = pPoints[i].m_PointY;
|
| - FX_FLOAT x, y;
|
| - if (pObject2Device) {
|
| - pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);
|
| - } else {
|
| - x = pPoints[i].m_PointX;
|
| - y = pPoints[i].m_PointY;
|
| - }
|
| - if (x > 50000 * 1.0f) {
|
| - points[i].X = 50000 * 1.0f;
|
| - }
|
| - if (x < -50000 * 1.0f) {
|
| - points[i].X = -50000 * 1.0f;
|
| - }
|
| - if (y > 50000 * 1.0f) {
|
| - points[i].Y = 50000 * 1.0f;
|
| - }
|
| - if (y < -50000 * 1.0f) {
|
| - points[i].Y = -50000 * 1.0f;
|
| - }
|
| - int point_type = pPoints[i].m_Flag & FXPT_TYPE;
|
| - if(point_type == FXPT_MOVETO) {
|
| - types[i] = PathPointTypeStart;
|
| - nSubPathes ++;
|
| - bSubClose = FALSE;
|
| - startpoint = i;
|
| - } else if (point_type == FXPT_LINETO) {
|
| - types[i] = PathPointTypeLine;
|
| - if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
|
| - points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {
|
| - points[i].X += 0.01f;
|
| - continue;
|
| - }
|
| - if (!bSmooth && points[i].X != points[i - 1].X && points[i].Y != points[i - 1].Y) {
|
| - bSmooth = TRUE;
|
| - }
|
| - } else if (point_type == FXPT_BEZIERTO) {
|
| - types[i] = PathPointTypeBezier;
|
| - bSmooth = TRUE;
|
| - }
|
| - if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
|
| - if (bSubClose) {
|
| - types[pos_subclose] &= ~PathPointTypeCloseSubpath;
|
| - } else {
|
| - bSubClose = TRUE;
|
| - }
|
| - pos_subclose = i;
|
| - types[i] |= PathPointTypeCloseSubpath;
|
| - if (!bSmooth && points[i].X != points[startpoint].X && points[i].Y != points[startpoint].Y) {
|
| - bSmooth = TRUE;
|
| - }
|
| - }
|
| - }
|
| - if (fill_mode & FXFILL_NOPATHSMOOTH) {
|
| - bSmooth = FALSE;
|
| - CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);
|
| - } else if (!(fill_mode & FXFILL_FULLCOVER)) {
|
| - if (!bSmooth && (fill_mode & 3)) {
|
| - bSmooth = TRUE;
|
| - }
|
| - if (bSmooth || (pGraphState && pGraphState->m_LineWidth > 2)) {
|
| - CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);
|
| - }
|
| - }
|
| - int new_fill_mode = fill_mode & 3;
|
| - if (nPoints == 4 && pGraphState == NULL) {
|
| - int v1, v2;
|
| - if (IsSmallTriangle(points, pObject2Device, v1, v2)) {
|
| - GpPen* pPen = NULL;
|
| - CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);
|
| - CallFunc(GdipDrawLineI)(pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),
|
| - FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));
|
| - CallFunc(GdipDeletePen)(pPen);
|
| - return TRUE;
|
| - }
|
| - }
|
| - GpPath* pGpPath = NULL;
|
| - CallFunc(GdipCreatePath2)(points, types, nPoints, GdiFillType2Gdip(new_fill_mode), &pGpPath);
|
| - if (!pGpPath) {
|
| - if (pMatrix) {
|
| - CallFunc(GdipDeleteMatrix)(pMatrix);
|
| - }
|
| - FX_Free(points);
|
| - FX_Free(types);
|
| - CallFunc(GdipDeleteGraphics)(pGraphics);
|
| - return FALSE;
|
| - }
|
| - if (new_fill_mode) {
|
| - GpBrush* pBrush = _GdipCreateBrush(fill_argb);
|
| - CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));
|
| - CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);
|
| - CallFunc(GdipDeleteBrush)(pBrush);
|
| - }
|
| - if (pGraphState && stroke_argb) {
|
| - GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, fill_mode & FX_STROKE_TEXT_MODE);
|
| - if (nSubPathes == 1) {
|
| - CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);
|
| - } else {
|
| - int iStart = 0;
|
| - for (int i = 0; i < nPoints; i ++) {
|
| - if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {
|
| - GpPath* pSubPath;
|
| - CallFunc(GdipCreatePath2)(points + iStart, types + iStart, i - iStart + 1, GdiFillType2Gdip(new_fill_mode), &pSubPath);
|
| - iStart = i + 1;
|
| - CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);
|
| - CallFunc(GdipDeletePath)(pSubPath);
|
| - }
|
| - }
|
| - }
|
| - CallFunc(GdipDeletePen)(pPen);
|
| - }
|
| + pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);
|
| + } else {
|
| + x = pPoints[i].m_PointX;
|
| + y = pPoints[i].m_PointY;
|
| + }
|
| + if (x > 50000 * 1.0f) {
|
| + points[i].X = 50000 * 1.0f;
|
| + }
|
| + if (x < -50000 * 1.0f) {
|
| + points[i].X = -50000 * 1.0f;
|
| + }
|
| + if (y > 50000 * 1.0f) {
|
| + points[i].Y = 50000 * 1.0f;
|
| + }
|
| + if (y < -50000 * 1.0f) {
|
| + points[i].Y = -50000 * 1.0f;
|
| + }
|
| + int point_type = pPoints[i].m_Flag & FXPT_TYPE;
|
| + if (point_type == FXPT_MOVETO) {
|
| + types[i] = PathPointTypeStart;
|
| + nSubPathes++;
|
| + bSubClose = FALSE;
|
| + startpoint = i;
|
| + } else if (point_type == FXPT_LINETO) {
|
| + types[i] = PathPointTypeLine;
|
| + if (pPoints[i - 1].m_Flag == FXPT_MOVETO &&
|
| + (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
|
| + points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {
|
| + points[i].X += 0.01f;
|
| + continue;
|
| + }
|
| + if (!bSmooth && points[i].X != points[i - 1].X &&
|
| + points[i].Y != points[i - 1].Y) {
|
| + bSmooth = TRUE;
|
| + }
|
| + } else if (point_type == FXPT_BEZIERTO) {
|
| + types[i] = PathPointTypeBezier;
|
| + bSmooth = TRUE;
|
| + }
|
| + if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
|
| + if (bSubClose) {
|
| + types[pos_subclose] &= ~PathPointTypeCloseSubpath;
|
| + } else {
|
| + bSubClose = TRUE;
|
| + }
|
| + pos_subclose = i;
|
| + types[i] |= PathPointTypeCloseSubpath;
|
| + if (!bSmooth && points[i].X != points[startpoint].X &&
|
| + points[i].Y != points[startpoint].Y) {
|
| + bSmooth = TRUE;
|
| + }
|
| + }
|
| + }
|
| + if (fill_mode & FXFILL_NOPATHSMOOTH) {
|
| + bSmooth = FALSE;
|
| + CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);
|
| + } else if (!(fill_mode & FXFILL_FULLCOVER)) {
|
| + if (!bSmooth && (fill_mode & 3)) {
|
| + bSmooth = TRUE;
|
| + }
|
| + if (bSmooth || (pGraphState && pGraphState->m_LineWidth > 2)) {
|
| + CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);
|
| + }
|
| + }
|
| + int new_fill_mode = fill_mode & 3;
|
| + if (nPoints == 4 && pGraphState == NULL) {
|
| + int v1, v2;
|
| + if (IsSmallTriangle(points, pObject2Device, v1, v2)) {
|
| + GpPen* pPen = NULL;
|
| + CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);
|
| + CallFunc(GdipDrawLineI)(
|
| + pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),
|
| + FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));
|
| + CallFunc(GdipDeletePen)(pPen);
|
| + return TRUE;
|
| + }
|
| + }
|
| + GpPath* pGpPath = NULL;
|
| + CallFunc(GdipCreatePath2)(points, types, nPoints,
|
| + GdiFillType2Gdip(new_fill_mode), &pGpPath);
|
| + if (!pGpPath) {
|
| if (pMatrix) {
|
| - CallFunc(GdipDeleteMatrix)(pMatrix);
|
| + CallFunc(GdipDeleteMatrix)(pMatrix);
|
| }
|
| FX_Free(points);
|
| FX_Free(types);
|
| - CallFunc(GdipDeletePath)(pGpPath);
|
| CallFunc(GdipDeleteGraphics)(pGraphics);
|
| - return TRUE;
|
| -}
|
| -class GpStream final : public IStream
|
| -{
|
| - LONG m_RefCount;
|
| - int m_ReadPos;
|
| - CFX_ByteTextBuf m_InterStream;
|
| -public:
|
| - GpStream()
|
| - {
|
| - m_RefCount = 1;
|
| - m_ReadPos = 0;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE
|
| - QueryInterface(REFIID iid, void ** ppvObject)
|
| - {
|
| - if (iid == __uuidof(IUnknown) ||
|
| - iid == __uuidof(IStream) ||
|
| - iid == __uuidof(ISequentialStream)) {
|
| - *ppvObject = static_cast<IStream*>(this);
|
| - AddRef();
|
| - return S_OK;
|
| - }
|
| - return E_NOINTERFACE;
|
| - }
|
| - virtual ULONG STDMETHODCALLTYPE AddRef(void)
|
| - {
|
| - return (ULONG)InterlockedIncrement(&m_RefCount);
|
| - }
|
| - virtual ULONG STDMETHODCALLTYPE Release(void)
|
| - {
|
| - ULONG res = (ULONG) InterlockedDecrement(&m_RefCount);
|
| - if (res == 0) {
|
| - delete this;
|
| - }
|
| - return res;
|
| - }
|
| -public:
|
| - virtual HRESULT STDMETHODCALLTYPE Read(void* Output, ULONG cb, ULONG* pcbRead)
|
| - {
|
| - size_t bytes_left;
|
| - size_t bytes_out;
|
| - if (pcbRead != NULL) {
|
| - *pcbRead = 0;
|
| - }
|
| - if (m_ReadPos == m_InterStream.GetLength()) {
|
| - return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);
|
| - }
|
| - bytes_left = m_InterStream.GetLength() - m_ReadPos;
|
| - bytes_out = FX_MIN(cb, bytes_left);
|
| - FXSYS_memcpy(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);
|
| - m_ReadPos += (int32_t)bytes_out;
|
| - if (pcbRead != NULL) {
|
| - *pcbRead = (ULONG)bytes_out;
|
| - }
|
| - return S_OK;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE Write(void const* Input, ULONG cb, ULONG* pcbWritten)
|
| - {
|
| - if (cb <= 0) {
|
| - if (pcbWritten != NULL) {
|
| - *pcbWritten = 0;
|
| - }
|
| - return S_OK;
|
| - }
|
| - m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);
|
| - if (pcbWritten != NULL) {
|
| - *pcbWritten = cb;
|
| - }
|
| - return S_OK;
|
| - }
|
| -public:
|
| - virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER)
|
| - {
|
| - return E_NOTIMPL;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*)
|
| - {
|
| - return E_NOTIMPL;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE Commit(DWORD)
|
| - {
|
| - return E_NOTIMPL;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE Revert(void)
|
| - {
|
| - return E_NOTIMPL;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
|
| - {
|
| - return E_NOTIMPL;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
|
| - {
|
| - return E_NOTIMPL;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE Clone(IStream **)
|
| - {
|
| - return E_NOTIMPL;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer)
|
| - {
|
| - long start = 0;
|
| - long new_read_position;
|
| - switch(dwOrigin) {
|
| - case STREAM_SEEK_SET:
|
| - start = 0;
|
| - break;
|
| - case STREAM_SEEK_CUR:
|
| - start = m_ReadPos;
|
| - break;
|
| - case STREAM_SEEK_END:
|
| - start = m_InterStream.GetLength();
|
| - break;
|
| - default:
|
| - return STG_E_INVALIDFUNCTION;
|
| - break;
|
| - }
|
| - new_read_position = start + (long)liDistanceToMove.QuadPart;
|
| - if (new_read_position < 0 || new_read_position > m_InterStream.GetLength()) {
|
| - return STG_E_SEEKERROR;
|
| - }
|
| - m_ReadPos = new_read_position;
|
| - if (lpNewFilePointer != NULL) {
|
| - lpNewFilePointer->QuadPart = m_ReadPos;
|
| - }
|
| - return S_OK;
|
| - }
|
| - virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag)
|
| - {
|
| - if (pStatstg == NULL) {
|
| - return STG_E_INVALIDFUNCTION;
|
| + return FALSE;
|
| + }
|
| + if (new_fill_mode) {
|
| + GpBrush* pBrush = _GdipCreateBrush(fill_argb);
|
| + CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));
|
| + CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);
|
| + CallFunc(GdipDeleteBrush)(pBrush);
|
| + }
|
| + if (pGraphState && stroke_argb) {
|
| + GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb,
|
| + fill_mode & FX_STROKE_TEXT_MODE);
|
| + if (nSubPathes == 1) {
|
| + CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);
|
| + } else {
|
| + int iStart = 0;
|
| + for (int i = 0; i < nPoints; i++) {
|
| + if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {
|
| + GpPath* pSubPath;
|
| + CallFunc(GdipCreatePath2)(points + iStart, types + iStart,
|
| + i - iStart + 1,
|
| + GdiFillType2Gdip(new_fill_mode), &pSubPath);
|
| + iStart = i + 1;
|
| + CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);
|
| + CallFunc(GdipDeletePath)(pSubPath);
|
| }
|
| - ZeroMemory(pStatstg, sizeof(STATSTG));
|
| - pStatstg->cbSize.QuadPart = m_InterStream.GetLength();
|
| - return S_OK;
|
| - }
|
| + }
|
| + }
|
| + CallFunc(GdipDeletePen)(pPen);
|
| + }
|
| + if (pMatrix) {
|
| + CallFunc(GdipDeleteMatrix)(pMatrix);
|
| + }
|
| + FX_Free(points);
|
| + FX_Free(types);
|
| + CallFunc(GdipDeletePath)(pGpPath);
|
| + CallFunc(GdipDeleteGraphics)(pGraphics);
|
| + return TRUE;
|
| +}
|
| +class GpStream final : public IStream {
|
| + LONG m_RefCount;
|
| + int m_ReadPos;
|
| + CFX_ByteTextBuf m_InterStream;
|
| +
|
| + public:
|
| + GpStream() {
|
| + m_RefCount = 1;
|
| + m_ReadPos = 0;
|
| + }
|
| + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
|
| + void** ppvObject) {
|
| + if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||
|
| + iid == __uuidof(ISequentialStream)) {
|
| + *ppvObject = static_cast<IStream*>(this);
|
| + AddRef();
|
| + return S_OK;
|
| + }
|
| + return E_NOINTERFACE;
|
| + }
|
| + virtual ULONG STDMETHODCALLTYPE AddRef(void) {
|
| + return (ULONG)InterlockedIncrement(&m_RefCount);
|
| + }
|
| + virtual ULONG STDMETHODCALLTYPE Release(void) {
|
| + ULONG res = (ULONG)InterlockedDecrement(&m_RefCount);
|
| + if (res == 0) {
|
| + delete this;
|
| + }
|
| + return res;
|
| + }
|
| +
|
| + public:
|
| + virtual HRESULT STDMETHODCALLTYPE Read(void* Output,
|
| + ULONG cb,
|
| + ULONG* pcbRead) {
|
| + size_t bytes_left;
|
| + size_t bytes_out;
|
| + if (pcbRead != NULL) {
|
| + *pcbRead = 0;
|
| + }
|
| + if (m_ReadPos == m_InterStream.GetLength()) {
|
| + return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);
|
| + }
|
| + bytes_left = m_InterStream.GetLength() - m_ReadPos;
|
| + bytes_out = FX_MIN(cb, bytes_left);
|
| + FXSYS_memcpy(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);
|
| + m_ReadPos += (int32_t)bytes_out;
|
| + if (pcbRead != NULL) {
|
| + *pcbRead = (ULONG)bytes_out;
|
| + }
|
| + return S_OK;
|
| + }
|
| + virtual HRESULT STDMETHODCALLTYPE Write(void const* Input,
|
| + ULONG cb,
|
| + ULONG* pcbWritten) {
|
| + if (cb <= 0) {
|
| + if (pcbWritten != NULL) {
|
| + *pcbWritten = 0;
|
| + }
|
| + return S_OK;
|
| + }
|
| + m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);
|
| + if (pcbWritten != NULL) {
|
| + *pcbWritten = cb;
|
| + }
|
| + return S_OK;
|
| + }
|
| +
|
| + public:
|
| + virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER) {
|
| + return E_NOTIMPL;
|
| + }
|
| + virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*,
|
| + ULARGE_INTEGER,
|
| + ULARGE_INTEGER*,
|
| + ULARGE_INTEGER*) {
|
| + return E_NOTIMPL;
|
| + }
|
| + virtual HRESULT STDMETHODCALLTYPE Commit(DWORD) { return E_NOTIMPL; }
|
| + virtual HRESULT STDMETHODCALLTYPE Revert(void) { return E_NOTIMPL; }
|
| + virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER,
|
| + ULARGE_INTEGER,
|
| + DWORD) {
|
| + return E_NOTIMPL;
|
| + }
|
| + virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER,
|
| + ULARGE_INTEGER,
|
| + DWORD) {
|
| + return E_NOTIMPL;
|
| + }
|
| + virtual HRESULT STDMETHODCALLTYPE Clone(IStream**) { return E_NOTIMPL; }
|
| + virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove,
|
| + DWORD dwOrigin,
|
| + ULARGE_INTEGER* lpNewFilePointer) {
|
| + long start = 0;
|
| + long new_read_position;
|
| + switch (dwOrigin) {
|
| + case STREAM_SEEK_SET:
|
| + start = 0;
|
| + break;
|
| + case STREAM_SEEK_CUR:
|
| + start = m_ReadPos;
|
| + break;
|
| + case STREAM_SEEK_END:
|
| + start = m_InterStream.GetLength();
|
| + break;
|
| + default:
|
| + return STG_E_INVALIDFUNCTION;
|
| + break;
|
| + }
|
| + new_read_position = start + (long)liDistanceToMove.QuadPart;
|
| + if (new_read_position < 0 ||
|
| + new_read_position > m_InterStream.GetLength()) {
|
| + return STG_E_SEEKERROR;
|
| + }
|
| + m_ReadPos = new_read_position;
|
| + if (lpNewFilePointer != NULL) {
|
| + lpNewFilePointer->QuadPart = m_ReadPos;
|
| + }
|
| + return S_OK;
|
| + }
|
| + virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag) {
|
| + if (pStatstg == NULL) {
|
| + return STG_E_INVALIDFUNCTION;
|
| + }
|
| + ZeroMemory(pStatstg, sizeof(STATSTG));
|
| + pStatstg->cbSize.QuadPart = m_InterStream.GetLength();
|
| + return S_OK;
|
| + }
|
| };
|
| typedef struct {
|
| - BITMAPINFO* pbmi;
|
| - int Stride;
|
| - LPBYTE pScan0;
|
| - GpBitmap* pBitmap;
|
| - BitmapData* pBitmapData;
|
| - GpStream* pStream;
|
| + BITMAPINFO* pbmi;
|
| + int Stride;
|
| + LPBYTE pScan0;
|
| + GpBitmap* pBitmap;
|
| + BitmapData* pBitmapData;
|
| + GpStream* pStream;
|
| } PREVIEW3_DIBITMAP;
|
| -static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args)
|
| -{
|
| - GpBitmap* pBitmap;
|
| - GpStream* pStream = NULL;
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - Status status = Ok;
|
| - if (args.flags == WINDIB_OPEN_PATHNAME) {
|
| - status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, &pBitmap);
|
| - } else {
|
| - if (args.memory_size == 0 || !args.memory_base) {
|
| - return NULL;
|
| - }
|
| - pStream = new GpStream;
|
| - pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);
|
| - status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);
|
| - }
|
| - if (status != Ok) {
|
| - if (pStream) {
|
| - pStream->Release();
|
| - }
|
| - return NULL;
|
| - }
|
| - UINT height, width;
|
| - CallFunc(GdipGetImageHeight)(pBitmap, &height);
|
| - CallFunc(GdipGetImageWidth)(pBitmap, &width);
|
| - PixelFormat pixel_format;
|
| - CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);
|
| - int info_size = sizeof(BITMAPINFOHEADER);
|
| - int bpp = 24;
|
| - int dest_pixel_format = PixelFormat24bppRGB;
|
| - if (pixel_format == PixelFormat1bppIndexed) {
|
| - info_size += 8;
|
| - bpp = 1;
|
| - dest_pixel_format = PixelFormat1bppIndexed;
|
| - } else if (pixel_format == PixelFormat8bppIndexed) {
|
| - info_size += 1024;
|
| - bpp = 8;
|
| - dest_pixel_format = PixelFormat8bppIndexed;
|
| - } else if (pixel_format == PixelFormat32bppARGB) {
|
| - bpp = 32;
|
| - dest_pixel_format = PixelFormat32bppARGB;
|
| +static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args) {
|
| + GpBitmap* pBitmap;
|
| + GpStream* pStream = NULL;
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + Status status = Ok;
|
| + if (args.flags == WINDIB_OPEN_PATHNAME) {
|
| + status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name,
|
| + &pBitmap);
|
| + } else {
|
| + if (args.memory_size == 0 || !args.memory_base) {
|
| + return NULL;
|
| + }
|
| + pStream = new GpStream;
|
| + pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);
|
| + status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);
|
| + }
|
| + if (status != Ok) {
|
| + if (pStream) {
|
| + pStream->Release();
|
| }
|
| - LPBYTE buf = FX_Alloc(BYTE, info_size);
|
| - BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;
|
| - pbmih->biBitCount = bpp;
|
| - pbmih->biCompression = BI_RGB;
|
| - pbmih->biHeight = -(int)height;
|
| - pbmih->biPlanes = 1;
|
| - pbmih->biWidth = width;
|
| - Rect rect(0, 0, width, height);
|
| - BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);
|
| - CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,
|
| - dest_pixel_format, pBitmapData);
|
| - if (pixel_format == PixelFormat1bppIndexed || pixel_format == PixelFormat8bppIndexed) {
|
| - DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));
|
| - struct {
|
| - UINT flags;
|
| - UINT Count;
|
| - DWORD Entries[256];
|
| - } pal;
|
| - int size = 0;
|
| - CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);
|
| - CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);
|
| - int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;
|
| - for (int i = 0; i < entries; i ++) {
|
| - ppal[i] = pal.Entries[i] & 0x00ffffff;
|
| - }
|
| - }
|
| - PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);
|
| - pInfo->pbmi = (BITMAPINFO*)buf;
|
| - pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;
|
| - pInfo->Stride = pBitmapData->Stride;
|
| - pInfo->pBitmap = pBitmap;
|
| - pInfo->pBitmapData = pBitmapData;
|
| - pInfo->pStream = pStream;
|
| - return pInfo;
|
| + return NULL;
|
| + }
|
| + UINT height, width;
|
| + CallFunc(GdipGetImageHeight)(pBitmap, &height);
|
| + CallFunc(GdipGetImageWidth)(pBitmap, &width);
|
| + PixelFormat pixel_format;
|
| + CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);
|
| + int info_size = sizeof(BITMAPINFOHEADER);
|
| + int bpp = 24;
|
| + int dest_pixel_format = PixelFormat24bppRGB;
|
| + if (pixel_format == PixelFormat1bppIndexed) {
|
| + info_size += 8;
|
| + bpp = 1;
|
| + dest_pixel_format = PixelFormat1bppIndexed;
|
| + } else if (pixel_format == PixelFormat8bppIndexed) {
|
| + info_size += 1024;
|
| + bpp = 8;
|
| + dest_pixel_format = PixelFormat8bppIndexed;
|
| + } else if (pixel_format == PixelFormat32bppARGB) {
|
| + bpp = 32;
|
| + dest_pixel_format = PixelFormat32bppARGB;
|
| + }
|
| + LPBYTE buf = FX_Alloc(BYTE, info_size);
|
| + BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;
|
| + pbmih->biBitCount = bpp;
|
| + pbmih->biCompression = BI_RGB;
|
| + pbmih->biHeight = -(int)height;
|
| + pbmih->biPlanes = 1;
|
| + pbmih->biWidth = width;
|
| + Rect rect(0, 0, width, height);
|
| + BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);
|
| + CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,
|
| + dest_pixel_format, pBitmapData);
|
| + if (pixel_format == PixelFormat1bppIndexed ||
|
| + pixel_format == PixelFormat8bppIndexed) {
|
| + DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));
|
| + struct {
|
| + UINT flags;
|
| + UINT Count;
|
| + DWORD Entries[256];
|
| + } pal;
|
| + int size = 0;
|
| + CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);
|
| + CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);
|
| + int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;
|
| + for (int i = 0; i < entries; i++) {
|
| + ppal[i] = pal.Entries[i] & 0x00ffffff;
|
| + }
|
| + }
|
| + PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);
|
| + pInfo->pbmi = (BITMAPINFO*)buf;
|
| + pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;
|
| + pInfo->Stride = pBitmapData->Stride;
|
| + pInfo->pBitmap = pBitmap;
|
| + pInfo->pBitmapData = pBitmapData;
|
| + pInfo->pStream = pStream;
|
| + return pInfo;
|
| }
|
| -static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo)
|
| -{
|
| - CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| - CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);
|
| - CallFunc(GdipDisposeImage)(pInfo->pBitmap);
|
| - FX_Free(pInfo->pBitmapData);
|
| - FX_Free((LPBYTE)pInfo->pbmi);
|
| - if (pInfo->pStream) {
|
| - pInfo->pStream->Release();
|
| - }
|
| - FX_Free(pInfo);
|
| +static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo) {
|
| + CGdiplusExt& GdiplusExt =
|
| + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
|
| + CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);
|
| + CallFunc(GdipDisposeImage)(pInfo->pBitmap);
|
| + FX_Free(pInfo->pBitmapData);
|
| + FX_Free((LPBYTE)pInfo->pbmi);
|
| + if (pInfo->pStream) {
|
| + pInfo->pStream->Release();
|
| + }
|
| + FX_Free(pInfo);
|
| }
|
| -CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha);
|
| -CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args)
|
| -{
|
| - PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);
|
| - if (pInfo == NULL) {
|
| - return NULL;
|
| - }
|
| - int height = abs(pInfo->pbmi->bmiHeader.biHeight);
|
| - int width = pInfo->pbmi->bmiHeader.biWidth;
|
| - int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
|
| - LPBYTE pData = FX_Alloc2D(BYTE, dest_pitch, height);
|
| - if (dest_pitch == pInfo->Stride) {
|
| - FXSYS_memcpy(pData, pInfo->pScan0, dest_pitch * height);
|
| - } else {
|
| - for (int i = 0; i < height; i ++) {
|
| - FXSYS_memcpy(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, dest_pitch);
|
| - }
|
| - }
|
| - CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);
|
| - FX_Free(pData);
|
| - FreeDIBitmap(pInfo);
|
| - return pDIBitmap;
|
| +CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi,
|
| + LPVOID pData,
|
| + FX_BOOL bAlpha);
|
| +CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args) {
|
| + PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);
|
| + if (pInfo == NULL) {
|
| + return NULL;
|
| + }
|
| + int height = abs(pInfo->pbmi->bmiHeader.biHeight);
|
| + int width = pInfo->pbmi->bmiHeader.biWidth;
|
| + int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
|
| + LPBYTE pData = FX_Alloc2D(BYTE, dest_pitch, height);
|
| + if (dest_pitch == pInfo->Stride) {
|
| + FXSYS_memcpy(pData, pInfo->pScan0, dest_pitch * height);
|
| + } else {
|
| + for (int i = 0; i < height; i++) {
|
| + FXSYS_memcpy(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i,
|
| + dest_pitch);
|
| + }
|
| + }
|
| + CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(
|
| + pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);
|
| + FX_Free(pData);
|
| + FreeDIBitmap(pInfo);
|
| + return pDIBitmap;
|
| }
|
| #endif
|
|
|