// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../../include/fxge/fx_ge.h"
#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_
#include <windows.h>
#include <algorithm>
namespace Gdiplus {
  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;
}
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,
};
static LPCSTR g_GdipFuncNames[] = {
    "GdipCreatePath2",
    "GdipSetPenDashStyle",
    "GdipSetPenDashArray",
    "GdipSetPenDashCap197819",
    "GdipSetPenLineJoin",
    "GdipSetPenWidth",
    "GdipCreateFromHDC",
    "GdipSetPageUnit",
    "GdipSetSmoothingMode",
    "GdipCreateSolidFill",
    "GdipFillPath",
    "GdipDeleteBrush",
    "GdipCreatePen1",
    "GdipSetPenMiterLimit",
    "GdipDrawPath",
    "GdipDeletePen",
    "GdipDeletePath",
    "GdipDeleteGraphics",
    "GdipCreateBitmapFromFileICM",
    "GdipCreateBitmapFromStreamICM",
    "GdipGetImageHeight",
    "GdipGetImageWidth",
    "GdipGetImagePixelFormat",
    "GdipBitmapLockBits",
    "GdipGetImagePaletteSize",
    "GdipGetImagePalette",
    "GdipBitmapUnlockBits",
    "GdipDisposeImage",
    "GdipFillRectangle",
    "GdipCreateBitmapFromScan0",
    "GdipSetImagePalette",
    "GdipSetInterpolationMode",
    "GdipDrawImagePointsI",
    "GdipCreateBitmapFromGdiDib",
    "GdiplusStartup",
    "GdipDrawLineI",
    "GdipResetClip",
    "GdipCreatePath",
    "GdipAddPathPath",
    "GdipSetPathFillMode",
    "GdipSetClipPath",
    "GdipGetClip",
    "GdipCreateRegion",
    "GdipGetClipBoundsI",
    "GdipSetClipRegion",
    "GdipWidenPath",
    "GdipAddPathLine",
    "GdipAddPathRectangle",
    "GdipDeleteRegion",
    "GdipGetDC",
    "GdipReleaseDC",
    "GdipSetPenLineCap197819",
    "GdipSetPenDashOffset",
    "GdipResetPath",
    "GdipCreateRegionPath",
    "GdipCreateFont",
    "GdipGetFontSize",
    "GdipCreateFontFamilyFromName",
    "GdipSetTextRenderingHint",
    "GdipDrawDriverString",
    "GdipCreateMatrix2",
    "GdipDeleteMatrix",
    "GdipSetWorldTransform",
    "GdipResetWorldTransform",
    "GdipDeleteFontFamily",
    "GdipDeleteFont",
    "GdipNewPrivateFontCollection",
    "GdipDeletePrivateFontCollection",
    "GdipPrivateAddMemoryFont",
    "GdipGetFontCollectionFamilyList",
    "GdipGetFontCollectionFamilyCount",
    "GdipSetTextContrast",
    "GdipSetPixelOffsetMode",
    "GdipGetImageGraphicsContext",
    "GdipDrawImageI",
    "GdipDrawImageRectI",
    "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;
}
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 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;
}
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;
            }
    }
    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);
}
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;
}
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()
{
}
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);
}
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::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;
}
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::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;
}
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::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::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::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::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);
}
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;
}
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;
            }
        }
        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;
}
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) {
            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);
    }
    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;
} 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;
    }
    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);
}
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
