// 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 "core/include/fxge/fx_ge.h"
#include "core/include/fxge/fx_freetype.h"
#include "core/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;
};

}  // namespace

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) {
      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 && !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_Matrix* 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_Matrix 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() ||
        (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() &&
          !(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) {
    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_Matrix 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_Matrix 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) {
        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) {
      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_Matrix* pText2User,
                                       const CFX_Matrix* 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) {
    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_Matrix 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) {
      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();
  for (const auto& pair : m_PathMap) {
    delete pair.second;
  }
  m_PathMap.clear();
}
#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
void CFX_FaceCache::InitPlatform() {}
#endif
CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(
    CFX_Font* pFont,
    const CFX_Matrix* 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;
  }
  auto it2 = pSizeCache->m_GlyphMap.find(glyph_index);
  if (it2 != pSizeCache->m_GlyphMap.end())
    return it2->second;

  CFX_GlyphBitmap* pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle,
                                              pMatrix, dest_width, anti_alias);
  if (!pGlyphBitmap)
    return nullptr;

  pSizeCache->m_GlyphMap[glyph_index] = pGlyphBitmap;
  return pGlyphBitmap;
}
const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont,
                                                      FX_DWORD glyph_index,
                                                      FX_BOOL bFontStyle,
                                                      const CFX_Matrix* 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;
    auto it2 = pSizeCache->m_GlyphMap.find(glyph_index);
    if (it2 != pSizeCache->m_GlyphMap.end())
      return it2->second;

    pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix,
                                          dest_width, anti_alias);
    if (pGlyphBitmap) {
      pSizeCache->m_GlyphMap[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[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() {
  for (const auto& pair : m_GlyphMap) {
    delete pair.second;
  }
  m_GlyphMap.clear();
}
#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) {
    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_Matrix* pMatrix,
                                            int dest_width,
                                            int anti_alias) {
  if (!m_Face) {
    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 || glyph_index == (FX_DWORD)-1)
    return nullptr;

  FX_DWORD key = glyph_index;
  if (pFont->GetSubstFont()) {
    key += (((pFont->GetSubstFont()->m_Weight / 16) << 15) +
            ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) +
            ((dest_width / 16) << 25) + (pFont->IsVertical() << 31));
  }
  auto it = m_PathMap.find(key);
  if (it != m_PathMap.end())
    return it->second;

  CFX_PathData* pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);
  m_PathMap[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) {
    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);
}
