// 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 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;
}
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;
        } else {
            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
