// 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)) {
      bool should_call_draw_device_text = true;
#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
      if ((text_flags & FXFONT_CIDFONT) ||
          (pFont->GetPsName().Find(CFX_WideString::FromLocal("+ZJHL")) != -1) ||
          (pFont->GetPsName() == CFX_WideString::FromLocal("CNAAJI+cmex10"))) {
        should_call_draw_device_text = false;
      }
#endif
      if (should_call_draw_device_text &&
          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)) {
    bool should_call_draw_device_text = true;
#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
    if ((text_flags & FXFONT_CIDFONT) ||
        (pFont->GetPsName() == CFX_WideString::FromLocal("CNAAJI+cmex10"))) {
      should_call_draw_device_text = false;
    }
#endif
    if (should_call_draw_device_text &&
        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) {
  FXFT_Face internal_face = pFont->GetFace();
  const FX_BOOL bExternal = internal_face == nullptr;
  FXFT_Face face =
      bExternal ? (FXFT_Face)pFont->GetSubstFont()->m_ExtHandle : internal_face;
  CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
  auto it = map.find(face);
  if (it != map.end()) {
    CFX_CountedFaceCache* counted_face_cache = it->second;
    counted_face_cache->m_nCount++;
    return counted_face_cache->m_Obj;
  }

  CFX_FaceCache* face_cache = new CFX_FaceCache(bExternal ? nullptr : face);
  CFX_CountedFaceCache* counted_face_cache = new CFX_CountedFaceCache;
  counted_face_cache->m_nCount = 2;
  counted_face_cache->m_Obj = face_cache;
  map[face] = counted_face_cache;
  return face_cache;
}

void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont) {
  FXFT_Face internal_face = pFont->GetFace();
  const FX_BOOL bExternal = internal_face == nullptr;
  FXFT_Face face =
      bExternal ? (FXFT_Face)pFont->GetSubstFont()->m_ExtHandle : internal_face;
  CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;

  auto it = map.find(face);
  if (it == map.end())
    return;

  CFX_CountedFaceCache* counted_face_cache = it->second;
  if (counted_face_cache->m_nCount > 1) {
    counted_face_cache->m_nCount--;
  }
}

void CFX_FontCache::FreeCache(FX_BOOL bRelease) {
  for (auto it = m_FTFaceMap.begin(); it != m_FTFaceMap.end();) {
    auto curr_it = it++;
    CFX_CountedFaceCache* cache = curr_it->second;
    if (bRelease || cache->m_nCount < 2) {
      delete cache->m_Obj;
      delete cache;
      m_FTFaceMap.erase(curr_it);
    }
  }

  for (auto it = m_ExtFaceMap.begin(); it != m_ExtFaceMap.end();) {
    auto curr_it = it++;
    CFX_CountedFaceCache* cache = curr_it->second;
    if (bRelease || cache->m_nCount < 2) {
      delete cache->m_Obj;
      delete cache;
      m_ExtFaceMap.erase(curr_it);
    }
  }
}

CFX_FaceCache::CFX_FaceCache(FXFT_Face face) {
  m_Face = face;
}
CFX_FaceCache::~CFX_FaceCache() {
  for (const auto& pair : m_SizeMap) {
    delete pair.second;
  }
  m_SizeMap.clear();
  FX_POSITION pos = m_PathMap.GetStartPosition();
  void* key1;
  CFX_PathData* pPath;
  while (pos) {
    m_PathMap.GetNextAssoc(pos, key1, (void*&)pPath);
    delete pPath;
  }
  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;
  auto it = m_SizeMap.find(FaceGlyphsKey);
  if (it == m_SizeMap.end()) {
    pSizeCache = new CFX_SizeGlyphCache;
    m_SizeMap[FaceGlyphsKey] = pSizeCache;
  } else {
    pSizeCache = it->second;
  }
  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);
  }
  CFX_GlyphBitmap* pGlyphBitmap;
  auto it = m_SizeMap.find(FaceGlyphsKey);
  if (it != m_SizeMap.end()) {
    CFX_SizeGlyphCache* pSizeCache = it->second;
    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) {
      CFX_SizeGlyphCache* pSizeCache = new CFX_SizeGlyphCache;
      m_SizeMap[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 FaceGlyphsKey2(keygen.m_Key, keygen.m_KeyLen);
  text_flags |= FXTEXT_NO_NATIVETEXT;
  return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey2, 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;
    (void)FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
    (void)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;
    (void)FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
    (void)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) {
      FXFT_Free(m_Face, pMasters);
      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_memcpy(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()->GetFTLibrary(),
                            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_memset(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_memcpy(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;
}
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 = FXFT_LOAD_NO_BITMAP;
  if (!(m_Face->face_flags & FT_FACE_FLAG_SFNT) || !FT_IS_TRICKY(m_Face)) {
    load_flags |= 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);
}
