// 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"
#include "../../../include/fxge/fx_freetype.h"
#include "../../../include/fxcodec/fx_codec.h"
#include "text_int.h"
#undef FX_GAMMA
#undef FX_GAMMA_INVERSE
#define FX_GAMMA(value)			(value)
#define FX_GAMMA_INVERSE(value)	(value)

namespace {

void ResetTransform(FT_Face face) {
    FXFT_Matrix  matrix;
    matrix.xx = 0x10000L;
    matrix.xy = 0;
    matrix.yx = 0;
    matrix.yy = 0x10000L;
    FXFT_Set_Transform(face, &matrix, 0);
}

// Sets the given transform on the font, and resets it to the identity when it
// goes out of scope.
class ScopedFontTransform
{
public:
    ScopedFontTransform(FT_Face face, FXFT_Matrix* matrix) : m_Face(face) {
        FXFT_Set_Transform(m_Face, matrix, 0);
    }

    ~ScopedFontTransform() {
        ResetTransform(m_Face);
    }

private:
    FT_Face m_Face;
};

}

FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
{
    FX_RECT rect(0, 0, 0, 0);
    FX_BOOL bStarted = FALSE;
    for (int iChar = 0; iChar < nChars; iChar ++) {
        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
        const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph;
        if (pGlyph == NULL) {
            continue;
        }
        int char_left = glyph.m_OriginX + pGlyph->m_Left;
        int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX);
        if (anti_alias == FXFT_RENDER_MODE_LCD) {
            char_width /= 3;
        }
        int char_right = char_left + char_width;
        int char_top = glyph.m_OriginY - pGlyph->m_Top;
        int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retinaScaleY);
        if (!bStarted) {
            rect.left = char_left;
            rect.right = char_right;
            rect.top = char_top;
            rect.bottom = char_bottom;
            bStarted = TRUE;
        } else {
            if (rect.left > char_left) {
                rect.left = char_left;
            }
            if (rect.right < char_right) {
                rect.right = char_right;
            }
            if (rect.top > char_top) {
                rect.top = char_top;
            }
            if (rect.bottom < char_bottom) {
                rect.bottom = char_bottom;
            }
        }
    }
    return rect;
}
static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars)
{
    ASSERT(nChars > 1);
    FX_BOOL bVertical = FALSE;
    if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) {
        bVertical = TRUE;
    } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY) {
        return;
    }
    int i = nChars - 1;
    int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
    FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
    for (i --; i > 0; i --) {
        int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
        FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
        int space = (*next_origin) - (*this_origin);
        FX_FLOAT space_f = next_origin_f - this_origin_f;
        FX_FLOAT error = (FX_FLOAT)(FXSYS_fabs(space_f) - FXSYS_fabs((FX_FLOAT)(space)));
        if (error > 0.5f) {
            *this_origin += space > 0 ? -1 : 1;
        }
        next_origin = this_origin;
        next_origin_f = this_origin_f;
    }
}
static const uint8_t g_TextGammaAdjust[256] = {
    0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19,
    21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38,
    39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55,
    56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72,
    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
    121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135,
    136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
    152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
    167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181,
    182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196,
    197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211,
    212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
    227, 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240,
    241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255,
};
#define ADJUST_ALPHA(background, foreground, src_alpha, text_flags, a) \
    src_alpha = g_TextGammaAdjust[(uint8_t)src_alpha];
void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform)
{
    if (pIccTransform == NULL && !FXGETFLAG_COLORTYPE(alpha_flag)) {
        argb = color;
        return;
    }
    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
        pIccTransform = NULL;
    }
    uint8_t bgra[4];
    if (pIccTransform) {
        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
        color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
        pIccModule->TranslateScanline(pIccTransform, bgra, (const uint8_t*)&color, 1);
        bgra[3] = FXGETFLAG_COLORTYPE(alpha_flag) ?
                  (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag) :
                  FXARGB_A(color);
        argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
        return;
    }
    AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color),
                       FXSYS_GetYValue(color), FXSYS_GetKValue(color),
                       bgra[2], bgra[1], bgra[0]);
    bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag);
    argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
}
FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,
        CFX_Font* pFont, CFX_FontCache* pCache,
        FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
        FX_DWORD fill_color, FX_DWORD text_flags,
        int alpha_flag, void* pIccTransform)
{
    int nativetext_flags = text_flags;
    if (m_DeviceClass != FXDC_DISPLAY) {
        if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {
#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
            if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_WideString::FromLocal("+ZJHL")) == -1)
#ifdef FOXIT_CHROME_BUILD
                if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
#endif
#endif
                    if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
                        return TRUE;
                    }
        }
        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
        if (alpha < 255) {
            return FALSE;
        }
    } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {
#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
        if (!(text_flags & FXFONT_CIDFONT))
#ifdef FOXIT_CHROME_BUILD
            if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
#endif
#endif
                if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
                    return TRUE;
                }
    }
    CFX_AffineMatrix char2device, deviceCtm, text2Device;
    if (pText2Device) {
        char2device = *pText2Device;
        text2Device = *pText2Device;
    }
    char2device.Scale(font_size, -font_size);
    if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||
            ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver())
             && !(text_flags & FXTEXT_PRINTIMAGETEXT))) {
        if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
            int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;
            return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pText2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform);
        }
    }
    int anti_alias = FXFT_RENDER_MODE_MONO;
    FX_BOOL bNormal = FALSE;
    if ((text_flags & FXTEXT_NOSMOOTH) == 0) {
        if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {
            FX_BOOL bClearType;
            if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {
                bClearType = FALSE;
            } else {
                bClearType = text_flags & FXTEXT_CLEARTYPE;
            }
            if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) {
                anti_alias = FXFT_RENDER_MODE_LCD;
                bNormal = TRUE;
            } else if (m_bpp < 16) {
                anti_alias = FXFT_RENDER_MODE_NORMAL;
            } else {
                if (bClearType == FALSE) {
                    anti_alias = FXFT_RENDER_MODE_LCD;
                    bNormal = TRUE;
                } else {
                    anti_alias = FXFT_RENDER_MODE_LCD;
                }
            }
        }
    }
    if (pCache == NULL) {
        pCache = CFX_GEModule::Get()->GetFontCache();
    }
    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
    FX_FONTCACHE_DEFINE(pCache, pFont);
    FXTEXT_GLYPHPOS* pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, nChars);
    int iChar;
    deviceCtm = char2device;
    CFX_AffineMatrix matrixCTM = GetCTM();
    FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);
    FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);
    deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);
    text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);
    for (iChar = 0; iChar < nChars; iChar ++) {
        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
        const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
        glyph.m_fOriginX = charpos.m_OriginX;
        glyph.m_fOriginY = charpos.m_OriginY;
        text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);
        if (anti_alias < FXFT_RENDER_MODE_LCD) {
            glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);
        } else {
            glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);
        }
        glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);
        if (charpos.m_bGlyphAdjust) {
            CFX_AffineMatrix new_matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
                                        charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
            new_matrix.Concat(deviceCtm);
            glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,
                             charpos.m_FontCharWidth, anti_alias, nativetext_flags);
        } else
            glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,
                             charpos.m_FontCharWidth, anti_alias, nativetext_flags);
    }
    if (anti_alias < FXFT_RENDER_MODE_LCD && nChars > 1) {
        _AdjustGlyphSpace(pGlyphAndPos, nChars);
    }
    FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(pGlyphAndPos, nChars, anti_alias);
    if (scale_x > 1 && scale_y > 1) {
        bmp_rect1.left--;
        bmp_rect1.top --;
        bmp_rect1.right ++;
        bmp_rect1.bottom ++;
    }
    FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y),
                     FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y));
    bmp_rect.Intersect(m_ClipBox);
    if (bmp_rect.IsEmpty()) {
        FX_Free(pGlyphAndPos);
        return TRUE;
    }
    int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x);
    int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y);
    int pixel_left = FXSYS_round(bmp_rect.left * scale_x);
    int pixel_top = FXSYS_round(bmp_rect.top * scale_y);
    if (anti_alias == FXFT_RENDER_MODE_MONO) {
        CFX_DIBitmap bitmap;
        if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) {
            FX_Free(pGlyphAndPos);
            return FALSE;
        }
        bitmap.Clear(0);
        for (iChar = 0; iChar < nChars; iChar ++) {
            FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
            if (glyph.m_pGlyph == NULL) {
                continue;
            }
            const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
            bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left,
                                  glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top,
                                  pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0);
        }
        FX_Free(pGlyphAndPos);
        return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);
    }
    CFX_DIBitmap bitmap;
    if (m_bpp == 8) {
        if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) {
            FX_Free(pGlyphAndPos);
            return FALSE;
        }
    } else {
        if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) {
            FX_Free(pGlyphAndPos);
            return FALSE;
        }
    }
    if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) {
        bitmap.Clear(0xFFFFFFFF);
        if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) {
            FX_Free(pGlyphAndPos);
            return FALSE;
        }
    } else {
        bitmap.Clear(0);
        if (bitmap.m_pAlphaMask) {
            bitmap.m_pAlphaMask->Clear(0);
        }
    }
    int dest_width = pixel_width;
    uint8_t* dest_buf = bitmap.GetBuffer();
    int dest_pitch = bitmap.GetPitch();
    int Bpp = bitmap.GetBPP() / 8;
    int a, r, g, b;
    if (anti_alias == FXFT_RENDER_MODE_LCD) {
        _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
        ArgbDecode(fill_color, a, r, g, b);
        r = FX_GAMMA(r);
        g = FX_GAMMA(g);
        b = FX_GAMMA(b);
    }
    for (iChar = 0; iChar < nChars; iChar ++) {
        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
        if (glyph.m_pGlyph == NULL) {
            continue;
        }
        const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
        int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left;
        int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top;
        int ncols = pGlyph->GetWidth();
        int nrows = pGlyph->GetHeight();
        if (anti_alias == FXFT_RENDER_MODE_NORMAL) {
            if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_color,
                                      0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
                FX_Free(pGlyphAndPos);
                return FALSE;
            }
            continue;
        }
        FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE;
        ncols /= 3;
        int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3;
        uint8_t* src_buf = pGlyph->GetBuffer();
        int src_pitch = pGlyph->GetPitch();
        int start_col = left;
        if (start_col < 0) {
            start_col = 0;
        }
        int end_col = left + ncols;
        if (end_col > dest_width) {
            end_col = dest_width;
        }
        if (start_col >= end_col) {
            continue;
        }
        if (bitmap.GetFormat() == FXDIB_Argb) {
            for (int row = 0; row < nrows; row ++) {
                int dest_row = row + top;
                if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
                    continue;
                }
                uint8_t* src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
                uint8_t* dest_scan = dest_buf + dest_row * dest_pitch + (start_col << 2);
                if (bBGRStripe) {
                    if (x_subpixel == 0) {
                        for (int col = start_col; col < end_col; col ++) {
                            int src_alpha = src_scan[2];
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[1];
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[0];
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                    } else if (x_subpixel == 1) {
                        int src_alpha = src_scan[1];
                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                        src_alpha = src_alpha * a / 255;
                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                        src_alpha = src_scan[0];
                        ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                        src_alpha = src_alpha * a / 255;
                        dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                        if (start_col > left) {
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                        }
                        dest_scan[3] = 255;
                        dest_scan += 4;
                        src_scan += 3;
                        for (int col = start_col + 1; col < end_col - 1; col ++) {
                            int src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                    } else {
                        int src_alpha = src_scan[0];
                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                        src_alpha = src_alpha * a / 255;
                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                        if (start_col > left) {
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[-2];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                        }
                        dest_scan[3] = 255;
                        dest_scan += 4;
                        src_scan += 3;
                        for (int col = start_col + 1; col < end_col - 1; col ++) {
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[-2];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                    }
                } else {
                    if (x_subpixel == 0) {
                        for (int col = start_col; col < end_col; col ++) {
                            if (bNormal) {
                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                                src_alpha1 = src_alpha1 * a / 255;
                                uint8_t back_alpha = dest_scan[3];
                                if (back_alpha == 0) {
                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
                                    dest_scan += 4;
                                    src_scan += 3;
                                    continue;
                                }
                                if (src_alpha1 == 0) {
                                    dest_scan += 4;
                                    src_scan += 3;
                                    continue;
                                }
                                uint8_t dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
                                dest_scan[3] = dest_alpha;
                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
                                dest_scan += 4;
                                src_scan += 3;
                                continue;
                            }
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[2];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                    } else if (x_subpixel == 1) {
                        if (bNormal) {
                            int src_alpha1 = start_col > left ? ((src_scan[-1] + src_scan[0] + src_scan[1]) / 3) : ((src_scan[0] + src_scan[1]) / 3);
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                            src_alpha1 = src_alpha1 * a / 255;
                            if (src_alpha1 == 0) {
                                dest_scan += 4;
                                src_scan += 3;
                            } else {
                                uint8_t back_alpha = dest_scan[3];
                                if (back_alpha == 0) {
                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
                                } else {
                                    uint8_t dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
                                    dest_scan[3] = dest_alpha;
                                    int alpha_ratio = src_alpha1 * 255 / dest_alpha;
                                    dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
                                    dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
                                    dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
                                }
                                dest_scan += 4;
                                src_scan += 3;
                            }
                        } else {
                            if (start_col > left) {
                                int src_alpha = src_scan[-1];
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                                src_alpha = src_alpha * a / 255;
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            }
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                        for (int col = start_col + 1; col < end_col; col ++) {
                            if (bNormal) {
                                int src_alpha1 = (src_scan[-1] + src_scan[0] + src_scan[1]) / 3;
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                                src_alpha1 = src_alpha1 * a / 255;
                                uint8_t back_alpha = dest_scan[3];
                                if (back_alpha == 0) {
                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
                                    dest_scan += 4;
                                    src_scan += 3;
                                    continue;
                                }
                                if (src_alpha1 == 0) {
                                    dest_scan += 4;
                                    src_scan += 3;
                                    continue;
                                }
                                uint8_t dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
                                dest_scan[3] = dest_alpha;
                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
                                dest_scan += 4;
                                src_scan += 3;
                                continue;
                            }
                            int src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                    } else {
                        if (bNormal) {
                            int src_alpha1 = start_col > left ? ((src_scan[-2] + src_scan[-1] + src_scan[0]) / 3) : ((src_scan[0]) / 3);
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                            src_alpha1 = src_alpha1 * a / 255;
                            if (src_alpha1 == 0) {
                                dest_scan += 4;
                                src_scan += 3;
                            } else {
                                uint8_t back_alpha = dest_scan[3];
                                if (back_alpha == 0) {
                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
                                } else {
                                    uint8_t dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
                                    dest_scan[3] = dest_alpha;
                                    int alpha_ratio = src_alpha1 * 255 / dest_alpha;
                                    dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
                                    dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
                                    dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
                                }
                                dest_scan += 4;
                                src_scan += 3;
                            }
                        } else {
                            if (start_col > left) {
                                int src_alpha = src_scan[-2];
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                                src_alpha = src_alpha * a / 255;
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                                src_alpha = src_scan[-1];
                                ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                                src_alpha = src_alpha * a / 255;
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            }
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                        for (int col = start_col + 1; col < end_col; col ++) {
                            if (bNormal) {
                                int src_alpha1 = (src_scan[-2] + src_scan[-1] + src_scan[0]) / 3;
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                                src_alpha1 = src_alpha1 * a / 255;
                                uint8_t back_alpha = dest_scan[3];
                                if (back_alpha == 0) {
                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
                                    dest_scan += 4;
                                    src_scan += 3;
                                    continue;
                                }
                                if (src_alpha1 == 0) {
                                    dest_scan += 4;
                                    src_scan += 3;
                                    continue;
                                }
                                uint8_t dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
                                dest_scan[3] = dest_alpha;
                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
                                dest_scan += 4;
                                src_scan += 3;
                                continue;
                            }
                            int src_alpha = src_scan[-2];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan[3] = 255;
                            dest_scan += 4;
                            src_scan += 3;
                        }
                    }
                }
            }
        } else {
            for (int row = 0; row < nrows; row ++) {
                int dest_row = row + top;
                if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
                    continue;
                }
                uint8_t* src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
                uint8_t* dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp;
                if (bBGRStripe) {
                    if (x_subpixel == 0) {
                        for (int col = start_col; col < end_col; col ++) {
                            int src_alpha = src_scan[2];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                    } else if (x_subpixel == 1) {
                        int src_alpha = src_scan[1];
                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                        src_alpha = src_alpha * a / 255;
                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                        src_alpha = src_scan[0];
                        ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                        src_alpha = src_alpha * a / 255;
                        dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                        if (start_col > left) {
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                        }
                        dest_scan += Bpp;
                        src_scan += 3;
                        for (int col = start_col + 1; col < end_col - 1; col ++) {
                            int src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                    } else {
                        int src_alpha = src_scan[0];
                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                        src_alpha = src_alpha * a / 255;
                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                        if (start_col > left) {
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[-2];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                        }
                        dest_scan += Bpp;
                        src_scan += 3;
                        for (int col = start_col + 1; col < end_col - 1; col ++) {
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[-2];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                    }
                } else {
                    if (x_subpixel == 0) {
                        for (int col = start_col; col < end_col; col ++) {
                            if (bNormal) {
                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                                src_alpha1 = src_alpha1 * a / 255;
                                if (src_alpha1 == 0) {
                                    dest_scan += Bpp;
                                    src_scan += 3;
                                    continue;
                                }
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
                                dest_scan += Bpp;
                                src_scan += 3;
                                continue;
                            }
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[2];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                    } else if (x_subpixel == 1) {
                        if (bNormal) {
                            int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[1] + src_scan[-1]) / 3 : (src_scan[0] + src_scan[1]) / 3;
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                            src_alpha1 = src_alpha1 * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
                            dest_scan += Bpp;
                            src_scan += 3;
                        } else {
                            if (start_col > left) {
                                int src_alpha = src_scan[-1];
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                                src_alpha = src_alpha * a / 255;
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            }
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                        for (int col = start_col + 1; col < end_col; col ++) {
                            if (bNormal) {
                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[-1]) / 3;
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                                src_alpha1 = src_alpha1 * a / 255;
                                if (src_alpha1 == 0) {
                                    dest_scan += Bpp;
                                    src_scan += 3;
                                    continue;
                                }
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
                                dest_scan += Bpp;
                                src_scan += 3;
                                continue;
                            }
                            int src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[1];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                    } else {
                        if (bNormal) {
                            int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[-2] + src_scan[-1]) / 3 : src_scan[0] / 3;
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                            src_alpha1 = src_alpha1 * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
                            dest_scan += Bpp;
                            src_scan += 3;
                        } else {
                            if (start_col > left) {
                                int src_alpha = src_scan[-2];
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                                src_alpha = src_alpha * a / 255;
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                                src_alpha = src_scan[-1];
                                ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                                src_alpha = src_alpha * a / 255;
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            }
                            int src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                        for (int col = start_col + 1; col < end_col; col ++) {
                            if (bNormal) {
                                int src_alpha1 = ((int)(src_scan[0]) + (int)(src_scan[-2]) + (int)(src_scan[-1])) / 3;
                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
                                src_alpha1 = src_alpha1 * a / 255;
                                if (src_alpha1 == 0) {
                                    dest_scan += Bpp;
                                    src_scan += 3;
                                    continue;
                                }
                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
                                dest_scan += Bpp;
                                src_scan += 3;
                                continue;
                            }
                            int src_alpha = src_scan[-2];
                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
                            src_alpha = src_scan[-1];
                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
                            src_alpha = src_scan[0];
                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
                            src_alpha = src_alpha * a / 255;
                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
                            dest_scan += Bpp;
                            src_scan += 3;
                        }
                    }
                }
            }
        }
    }
    if (bitmap.IsAlphaMask()) {
        SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag, pIccTransform);
    } else {
        SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);
    }
    FX_Free(pGlyphAndPos);
    return TRUE;
}
FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,
                                       CFX_Font* pFont, CFX_FontCache* pCache,
                                       FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,
                                       const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,
                                       FX_DWORD fill_color, FX_ARGB stroke_color, CFX_PathData* pClippingPath, int nFlag,
                                       int alpha_flag, void* pIccTransform, int blend_type)
{
    if (pCache == NULL) {
        pCache = CFX_GEModule::Get()->GetFontCache();
    }
    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
    FX_FONTCACHE_DEFINE(pCache, pFont);
    for (int iChar = 0; iChar < nChars; iChar ++) {
        const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
        CFX_AffineMatrix matrix;
        if (charpos.m_bGlyphAdjust)
            matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
                       charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
        matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
        const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
        if (pPath == NULL) {
            continue;
        }
        matrix.Concat(*pText2User);
        CFX_PathData TransformedPath(*pPath);
        TransformedPath.Transform(&matrix);
        FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ?
                            (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA_STROKE(alpha_flag)) :
                            (fill_color || stroke_color);
        if (bHasAlpha) {
            int fill_mode = nFlag;
            if (FXGETFLAG_COLORTYPE(alpha_flag)) {
                if (FXGETFLAG_ALPHA_FILL(alpha_flag)) {
                    fill_mode |= FXFILL_WINDING;
                }
            } else {
                if (fill_color) {
                    fill_mode |= FXFILL_WINDING;
                }
            }
            fill_mode |= FX_FILL_TEXT_MODE;
            if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
                return FALSE;
            }
        }
        if (pClippingPath) {
            pClippingPath->Append(&TransformedPath, pUser2Device);
        }
    }
    return TRUE;
}
CFX_FontCache::~CFX_FontCache()
{
    FreeCache(TRUE);
}
CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont)
{
    FX_BOOL bExternal = pFont->GetFace() == NULL;
    void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
    CFX_FTCacheMap& map =  bExternal ? m_ExtFaceMap : m_FTFaceMap;
    CFX_CountedFaceCache* counted_face_cache = NULL;
    if (map.Lookup((FXFT_Face)face, counted_face_cache)) {
        counted_face_cache->m_nCount++;
        return counted_face_cache->m_Obj;
    }
    CFX_FaceCache* face_cache = new CFX_FaceCache(bExternal ? NULL : (FXFT_Face)face);
    counted_face_cache = new CFX_CountedFaceCache;
    counted_face_cache->m_nCount = 2;
    counted_face_cache->m_Obj = face_cache;
    map.SetAt((FXFT_Face)face, counted_face_cache);
    return face_cache;
}
void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont)
{
    FX_BOOL bExternal = pFont->GetFace() == NULL;
    void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
    CFX_FTCacheMap& map =  bExternal ? m_ExtFaceMap : m_FTFaceMap;
    CFX_CountedFaceCache* counted_face_cache = NULL;
    if (!map.Lookup((FXFT_Face)face, counted_face_cache)) {
        return;
    }
    if (counted_face_cache->m_nCount > 1) {
        counted_face_cache->m_nCount--;
    }
}
void CFX_FontCache::FreeCache(FX_BOOL bRelease)
{
    {
        FX_POSITION pos;
        pos = m_FTFaceMap.GetStartPosition();
        while (pos) {
            FXFT_Face face;
            CFX_CountedFaceCache* cache;
            m_FTFaceMap.GetNextAssoc(pos, face, cache);
            if (bRelease || cache->m_nCount < 2) {
                delete cache->m_Obj;
                delete cache;
                m_FTFaceMap.RemoveKey(face);
            }
        }
        pos = m_ExtFaceMap.GetStartPosition();
        while (pos) {
            FXFT_Face face;
            CFX_CountedFaceCache* cache;
            m_ExtFaceMap.GetNextAssoc(pos, face, cache);
            if (bRelease || cache->m_nCount < 2) {
                delete cache->m_Obj;
                delete cache;
                m_ExtFaceMap.RemoveKey(face);
            }
        }
    }
}
CFX_FaceCache::CFX_FaceCache(FXFT_Face face)
{
    m_Face = face;
    m_pBitmap = NULL;
}
CFX_FaceCache::~CFX_FaceCache()
{
    FX_POSITION pos = m_SizeMap.GetStartPosition();
    CFX_ByteString Key;
    CFX_SizeGlyphCache* pSizeCache = NULL;
    while(pos) {
        m_SizeMap.GetNextAssoc( pos, Key, (void*&)pSizeCache);
        delete pSizeCache;
    }
    m_SizeMap.RemoveAll();
    pos = m_PathMap.GetStartPosition();
    void* key1;
    CFX_PathData* pPath;
    while (pos) {
        m_PathMap.GetNextAssoc(pos, key1, (void*&)pPath);
        delete pPath;
    }
    if (m_pBitmap) {
        delete m_pBitmap;
    }
    m_PathMap.RemoveAll();
}
#if _FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_
void CFX_FaceCache::InitPlatform()
{
}
#endif
CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix,
        CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle,
        int dest_width, int anti_alias)
{
    CFX_SizeGlyphCache* pSizeCache = NULL;
    if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
        pSizeCache = new CFX_SizeGlyphCache;
        m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
    }
    CFX_GlyphBitmap* pGlyphBitmap = NULL;
    if (pSizeCache->m_GlyphMap.Lookup((void*)(uintptr_t)glyph_index, (void*&)pGlyphBitmap)) {
        return pGlyphBitmap;
    }
    pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_width, anti_alias);
    if (pGlyphBitmap == NULL)	{
        return NULL;
    }
    pSizeCache->m_GlyphMap.SetAt((void*)(uintptr_t)glyph_index, pGlyphBitmap);
    return pGlyphBitmap;
}
const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
        int dest_width, int anti_alias, int& text_flags)
{
    if (glyph_index == (FX_DWORD) - 1) {
        return NULL;
    }
    _CFX_UniqueKeyGen keygen;
#if _FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_
    if (pFont->GetSubstFont())
        keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                        (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
                        pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
    else
        keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                        (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
#else
    if (text_flags & FXTEXT_NO_NATIVETEXT) {
        if (pFont->GetSubstFont())
            keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
        else
            keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
    } else {
        if (pFont->GetSubstFont())
            keygen.Generate(10, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), 3);
        else
            keygen.Generate(7, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias, 3);
    }
#endif
    CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
#if _FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_
    return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
#else
    if (text_flags & FXTEXT_NO_NATIVETEXT) {
        return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
    } else {
        CFX_GlyphBitmap* pGlyphBitmap;
        CFX_SizeGlyphCache* pSizeCache = NULL;
        if (m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
            if (pSizeCache->m_GlyphMap.Lookup((void*)(uintptr_t)glyph_index, (void*&)pGlyphBitmap)) {
                return pGlyphBitmap;
            }
            pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
            if (pGlyphBitmap) {
                pSizeCache->m_GlyphMap.SetAt((void*)(uintptr_t)glyph_index, pGlyphBitmap);
                return pGlyphBitmap;
            }
        } else {
            pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
            if (pGlyphBitmap) {
                pSizeCache = new CFX_SizeGlyphCache;
                m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
                pSizeCache->m_GlyphMap.SetAt((void*)(uintptr_t)glyph_index, pGlyphBitmap);
                return pGlyphBitmap;
            }
        }
        if (pFont->GetSubstFont())
            keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
        else
            keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
        CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
        text_flags |= FXTEXT_NO_NATIVETEXT;
        return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
    }
#endif
}
CFX_SizeGlyphCache::~CFX_SizeGlyphCache()
{
    FX_POSITION pos = m_GlyphMap.GetStartPosition();
    void* Key;
    CFX_GlyphBitmap* pGlyphBitmap = NULL;
    while(pos) {
        m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
        delete pGlyphBitmap;
    }
    m_GlyphMap.RemoveAll();
}
#define CONTRAST_RAMP_STEP	1
void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)
{
    FXFT_MM_Var pMasters = NULL;
    FXFT_Get_MM_Var(m_Face, &pMasters);
    if (pMasters == NULL) {
        return;
    }
    long coords[2];
    if (weight == 0) {
        coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;
    } else {
        coords[0] = weight;
    }
    if (dest_width == 0) {
        coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
    } else {
        int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
        int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
        coords[1] = min_param;
        int error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
        int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
        coords[1] = max_param;
        error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
        int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
        if (max_width == min_width) {
            return;
        }
        int param = min_param + (max_param - min_param) * (dest_width - min_width) / (max_width - min_width);
        coords[1] = param;
    }
    FXFT_Free(m_Face, pMasters);
    FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
}
static const size_t ANGLESKEW_ARRAY_SIZE = 30;
static const char g_AngleSkew[ANGLESKEW_ARRAY_SIZE] = {
    0, 2, 3, 5, 7, 9, 11, 12, 14, 16,
    18, 19, 21, 23, 25, 27, 29, 31, 32, 34,
    36, 38, 40, 42, 45, 47, 49, 51, 53, 55,
};
static const size_t WEIGHTPOW_ARRAY_SIZE = 100;
static const uint8_t g_WeightPow[WEIGHTPOW_ARRAY_SIZE] = {
    0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,
    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,
    37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,
    42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,
    47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,
    51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,
};
static const uint8_t g_WeightPow_11[WEIGHTPOW_ARRAY_SIZE] = {
    0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,
    23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,
    41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,
    46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,
    52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,
    56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,
};
static const uint8_t g_WeightPow_SHIFTJIS[WEIGHTPOW_ARRAY_SIZE] = {
    0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,
    30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,
    51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,
    55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 58, 58, 58,
    58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,
};
static void _GammaAdjust(uint8_t* pData, int nWid, int nHei, int src_pitch, const uint8_t* gammaTable)
{
    int count = nHei * src_pitch;
    for(int i = 0; i < count; i++) {
        pData[i] = gammaTable[pData[i]];
    }
}
static void _ContrastAdjust(uint8_t* pDataIn, uint8_t* pDataOut, int nWid, int nHei, int nSrcRowBytes, int nDstRowBytes)
{
    int col, row, temp;
    int max = 0, min = 255;
    FX_FLOAT rate;
    for (row = 0; row < nHei; row ++) {
        uint8_t* pRow = pDataIn + row * nSrcRowBytes;
        for (col = 0; col < nWid; col++) {
            temp = *pRow ++;
            if (temp > max) {
                max = temp;
            }
            if (temp < min) {
                min = temp;
            }
        }
    }
    temp = max - min;
    if (0 == temp || 255 == temp) {
        int rowbytes = FXSYS_abs(nSrcRowBytes) > nDstRowBytes ? nDstRowBytes : FXSYS_abs(nSrcRowBytes);
        for (row = 0; row < nHei; row ++) {
            FXSYS_memcpy32(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, rowbytes);
        }
        return;
    }
    rate = 255.f / temp;
    for (row = 0; row < nHei; row ++) {
        uint8_t* pSrcRow = pDataIn + row * nSrcRowBytes;
        uint8_t* pDstRow = pDataOut + row * nDstRowBytes;
        for (col = 0; col < nWid; col ++) {
            temp = (int)((*(pSrcRow++) - min) * rate + 0.5);
            if (temp > 255)	{
                temp = 255;
            } else if (temp < 0) {
                temp = 0;
            }
            *pDstRow ++ = (uint8_t)temp;
        }
    }
}
CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
        const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias)
{
    if (m_Face == NULL) {
        return NULL;
    }
    FXFT_Matrix  ft_matrix;
    ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);
    ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);
    ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);
    ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);
    FX_BOOL bUseCJKSubFont = FALSE;
    const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();
    if (pSubstFont) {
        bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;
        int skew = 0;
        if (bUseCJKSubFont) {
            skew = pSubstFont->m_bItlicCJK ? -15 : 0;
        } else {
            skew = pSubstFont->m_ItalicAngle;
        }
        if (skew) {
            skew = skew <= -ANGLESKEW_ARRAY_SIZE ? -58 : -g_AngleSkew[-skew];
            if (pFont->IsVertical()) {
                ft_matrix.yx += ft_matrix.yy * skew / 100;
            } else {
                ft_matrix.xy += -ft_matrix.xx * skew / 100;
            }
        }
        if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
            pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont()->m_Weight);
        }
    }
    ScopedFontTransform scoped_transform(m_Face, &ft_matrix);
    int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
    int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
    if (error) {
        //if an error is returned, try to reload glyphs without hinting.
        if (load_flags & FT_LOAD_NO_HINTING || load_flags & FT_LOAD_NO_SCALE) {
            return NULL;
        }

        load_flags |= FT_LOAD_NO_HINTING;
        error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);

        if (error) { 
            return NULL;
        }
    }
    int weight = 0;
    if (bUseCJKSubFont) {
        weight = pSubstFont->m_WeightCJK;
    } else {
        weight = pSubstFont ? pSubstFont->m_Weight : 0;
    }
    if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {
        int index = (weight - 400) / 10;
        if (index >= WEIGHTPOW_ARRAY_SIZE) {
            return NULL;
        }
        int level = 0;
        if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
            level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;
        } else {
            level = g_WeightPow_11[index] * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;
        }
        FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
    }
    FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary, FT_LCD_FILTER_DEFAULT);
    error = FXFT_Render_Glyph(m_Face, anti_alias);
    if (error) {
        return NULL;
    }
    int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face));
    int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face));
    if (bmwidth > 2048 || bmheight > 2048) {
        return NULL;
    }
    int dib_width = bmwidth;
    CFX_GlyphBitmap* pGlyphBitmap = new CFX_GlyphBitmap;
    pGlyphBitmap->m_Bitmap.Create(dib_width, bmheight,
                                  anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask);
    pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face);
    pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face);
    int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch();
    int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face));
    uint8_t* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer();
    uint8_t* pSrcBuf = (uint8_t*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face));
    if (anti_alias != FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
        int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1;
        for(int i = 0; i < bmheight; i++)
            for(int n = 0; n < bmwidth; n++) {
                uint8_t data = (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0;
                for (int b = 0; b < bytes; b ++) {
                    pDestBuf[i * dest_pitch + n * bytes + b] = data;
                }
            }
    } else {
        FXSYS_memset32(pDestBuf, 0, dest_pitch * bmheight);
        if (anti_alias == FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
            int rowbytes = FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch);
            for (int row = 0; row < bmheight; row ++) {
                FXSYS_memcpy32(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);
            }
        } else {
            _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, dest_pitch);
            _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::Get()->GetTextGammaTable());
        }
    }
    return pGlyphBitmap;
}
FX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont,
                     int glyph_index, FX_ARGB argb)
{
    CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib;
    FXFT_Face face = pFont->GetFace();
    int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP);
    if (error) {
        return FALSE;
    }
    error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL);
    if (error) {
        return FALSE;
    }
    int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face));
    int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face));
    int left = FXFT_Get_Glyph_BitmapLeft(face);
    int top = FXFT_Get_Glyph_BitmapTop(face);
    const uint8_t* src_buf = (const uint8_t*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face));
    int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face));
    CFX_DIBitmap mask;
    mask.Create(bmwidth, bmheight, FXDIB_8bppMask);
    uint8_t* dest_buf = mask.GetBuffer();
    int dest_pitch = mask.GetPitch();
    for (int row = 0; row < bmheight; row ++) {
        const uint8_t* src_scan = src_buf + row * src_pitch;
        uint8_t* dest_scan = dest_buf + row * dest_pitch;
        FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
    }
    pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0);
    return TRUE;
}
FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
                   CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb)
{
    if (!pFont) {
        return FALSE;
    }
    FXFT_Face face = pFont->GetFace();
    FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE);
    if (pText_matrix) {
        FXFT_Matrix  ft_matrix;
        ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536);
        ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536);
        ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536);
        ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536);
        FXFT_Set_Transform(face, &ft_matrix, 0);
    }
    FX_FLOAT x_pos = 0;
    for (; *text != 0; text ++) {
        FX_WCHAR unicode = *text;
        int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode);
        if (glyph_index <= 0) {
            continue;
        }
        int err = FXFT_Load_Glyph(pFont->m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
        if (err) {
            continue;
        }
        int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face);
        int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face);
        FX_FLOAT x1, y1;
        pText_matrix->Transform(x_pos, 0, x1, y1);
        _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont,
                     glyph_index, argb);
        x_pos += (FX_FLOAT)w / em;
    }
    if (pText_matrix)
        ResetTransform(face);
    return TRUE;
}
FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
                    CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb)
{
    FXFT_Matrix  ft_matrix;
    if (pMatrix) {
        ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536);
        ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536);
        ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536);
        ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536);
    } else {
        ft_matrix.xx = (signed long)(font_size / 64 * 65536);
        ft_matrix.xy = ft_matrix.yx = 0;
        ft_matrix.yy = (signed long)(font_size / 64 * 65536);
    }
    ScopedFontTransform scoped_transform(pFont->m_Face, &ft_matrix);
    FX_BOOL ret = _OutputGlyph(dib, x, y, pFont,
                               glyph_index, argb);
    return ret;
}
const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width)
{
    if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) {
        return NULL;
    }
    CFX_PathData* pGlyphPath = NULL;
    void* key;
    if (pFont->GetSubstFont())
        key = (void*)(uintptr_t)(glyph_index + ((pFont->GetSubstFont()->m_Weight / 16) << 15) +
                                      ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + ((dest_width / 16) << 25) +
                                      (pFont->IsVertical() << 31));
    else {
        key = (void*)(uintptr_t)glyph_index;
    }
    if (m_PathMap.Lookup(key, (void*&)pGlyphPath)) {
        return pGlyphPath;
    }
    pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);
    m_PathMap.SetAt(key, pGlyphPath);
    return pGlyphPath;
}
typedef struct {
    FX_BOOL			m_bCount;
    int				m_PointCount;
    FX_PATHPOINT*	m_pPoints;
    int				m_CurX;
    int				m_CurY;
    FX_FLOAT		m_CoordUnit;
} OUTLINE_PARAMS;
void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param)
{
    if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_Flag == FXPT_MOVETO &&
            param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 1].m_PointX &&
            param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 1].m_PointY) {
        param->m_PointCount -= 2;
    }
    if (param->m_PointCount >= 4 && param->m_pPoints[param->m_PointCount - 4].m_Flag == FXPT_MOVETO &&
            param->m_pPoints[param->m_PointCount - 3].m_Flag == FXPT_BEZIERTO &&
            param->m_pPoints[param->m_PointCount - 3].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
            param->m_pPoints[param->m_PointCount - 3].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
            param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
            param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
            param->m_pPoints[param->m_PointCount - 1].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
            param->m_pPoints[param->m_PointCount - 1].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY) {
        param->m_PointCount -= 4;
    }
}
extern "C" {
    static int _Outline_MoveTo(const FXFT_Vector* to, void* user)
    {
        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
        if (!param->m_bCount) {
            _Outline_CheckEmptyContour(param);
            param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_MOVETO;
            param->m_CurX = to->x;
            param->m_CurY = to->y;
            if (param->m_PointCount) {
                param->m_pPoints[param->m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
            }
        }
        param->m_PointCount ++;
        return 0;
    }
};
extern "C" {
    static int _Outline_LineTo(const FXFT_Vector* to, void* user)
    {
        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
        if (!param->m_bCount) {
            param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_LINETO;
            param->m_CurX = to->x;
            param->m_CurY = to->y;
        }
        param->m_PointCount ++;
        return 0;
    }
};
extern "C" {
    static int _Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user)
    {
        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
        if (!param->m_bCount) {
            param->m_pPoints[param->m_PointCount].m_PointX = (param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_PointY = (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
            param->m_pPoints[param->m_PointCount + 1].m_PointX = (control->x + (to->x - control->x) / 3) / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 1].m_PointY = (control->y + (to->y - control->y) / 3) / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
            param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
            param->m_CurX = to->x;
            param->m_CurY = to->y;
        }
        param->m_PointCount += 3;
        return 0;
    }
};
extern "C" {
    static int _Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user)
    {
        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
        if (!param->m_bCount) {
            param->m_pPoints[param->m_PointCount].m_PointX = control1->x / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_PointY = control1->y / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
            param->m_pPoints[param->m_PointCount + 1].m_PointX = control2->x / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 1].m_PointY = control2->y / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
            param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
            param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
            param->m_CurX = to->x;
            param->m_CurY = to->y;
        }
        param->m_PointCount += 3;
        return 0;
    }
};
CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)
{
    if (m_Face == NULL) {
        return NULL;
    }
    FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
    FXFT_Matrix  ft_matrix = {65536, 0, 0, 65536};
    if (m_pSubstFont) {
        if (m_pSubstFont->m_ItalicAngle) {
            int skew = m_pSubstFont->m_ItalicAngle;
            skew = skew <= -ANGLESKEW_ARRAY_SIZE ? -58 : -g_AngleSkew[-skew];
            if (m_bVertical) {
                ft_matrix.yx += ft_matrix.yy * skew / 100;
            } else {
                ft_matrix.xy += -ft_matrix.xx * skew / 100;
            }
        }
        if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
            AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);
        }
    }
    ScopedFontTransform scoped_transform(m_Face, &ft_matrix);
    int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;
    int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
    if (error) {
        return NULL;
    }
    if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSubstFont->m_Weight > 400) {
        int index = (m_pSubstFont->m_Weight - 400) / 10;
        if (index >= WEIGHTPOW_ARRAY_SIZE)
            index = WEIGHTPOW_ARRAY_SIZE - 1;
        int level = 0;
        if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
            level = g_WeightPow_SHIFTJIS[index] * 2 * 65536 / 36655;
        } else {
            level = g_WeightPow[index] * 2;
        }
        FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
    }
    FXFT_Outline_Funcs funcs;
    funcs.move_to = _Outline_MoveTo;
    funcs.line_to = _Outline_LineTo;
    funcs.conic_to = _Outline_ConicTo;
    funcs.cubic_to = _Outline_CubicTo;
    funcs.shift = 0;
    funcs.delta = 0;
    OUTLINE_PARAMS params;
    params.m_bCount = TRUE;
    params.m_PointCount = 0;
    FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
    if (params.m_PointCount == 0) {
        return NULL;
    }
    CFX_PathData* pPath = new CFX_PathData;
    pPath->SetPointCount(params.m_PointCount);
    params.m_bCount = FALSE;
    params.m_PointCount = 0;
    params.m_pPoints = pPath->GetPoints();
    params.m_CurX = params.m_CurY = 0;
    params.m_CoordUnit = 64 * 64.0;
    FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
    _Outline_CheckEmptyContour(&params);
    pPath->TrimPoints(params.m_PointCount);
    if (params.m_PointCount) {
        pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
    }
    return pPath;
}
void _CFX_UniqueKeyGen::Generate(int count, ...)
{
    va_list argList;
    va_start(argList, count);
    for (int i = 0; i < count; i ++) {
        int p = va_arg(argList, int);
        ((FX_DWORD*)m_Key)[i] = p;
    }
    va_end(argList);
    m_KeyLen = count * sizeof(FX_DWORD);
}
