| Index: core/fxge/apple/fx_apple_platform.cpp
 | 
| diff --git a/core/fxge/apple/fx_apple_platform.cpp b/core/fxge/apple/fx_apple_platform.cpp
 | 
| index 4204e7e6a5b309073d84ebe7f676a72869f9b40b..3bddf64280888d2f58f626c25ae8e6ee451515c5 100644
 | 
| --- a/core/fxge/apple/fx_apple_platform.cpp
 | 
| +++ b/core/fxge/apple/fx_apple_platform.cpp
 | 
| @@ -19,54 +19,31 @@
 | 
|  #include "core/fxge/include/fx_freetype.h"
 | 
|  #include "core/fxge/include/fx_ge_apple.h"
 | 
|  
 | 
| -void CFX_AggDeviceDriver::InitPlatform() {
 | 
| -  CQuartz2D& quartz2d =
 | 
| -      static_cast<CApplePlatform*>(CFX_GEModule::Get()->GetPlatformData())
 | 
| -          ->m_quartz2d;
 | 
| -  m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);
 | 
| -}
 | 
| -void CFX_AggDeviceDriver::DestroyPlatform() {
 | 
| -  CQuartz2D& quartz2d =
 | 
| -      static_cast<CApplePlatform*>(CFX_GEModule::Get()->GetPlatformData())
 | 
| -          ->m_quartz2d;
 | 
| -  if (m_pPlatformGraphics) {
 | 
| -    quartz2d.destroyGraphics(m_pPlatformGraphics);
 | 
| -    m_pPlatformGraphics = nullptr;
 | 
| -  }
 | 
| -}
 | 
| -void CFX_FaceCache::InitPlatform() {}
 | 
| -void CFX_FaceCache::DestroyPlatform() {}
 | 
| -CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(
 | 
| -    CFX_Font* pFont,
 | 
| -    uint32_t glyph_index,
 | 
| -    const CFX_Matrix* pMatrix,
 | 
| -    int dest_width,
 | 
| -    int anti_alias) {
 | 
| -  return nullptr;
 | 
| -}
 | 
| -static FX_BOOL _CGDrawGlyphRun(CGContextRef pContext,
 | 
| -                               int nChars,
 | 
| -                               const FXTEXT_CHARPOS* pCharPos,
 | 
| -                               CFX_Font* pFont,
 | 
| -                               CFX_FontCache* pCache,
 | 
| -                               const CFX_Matrix* pObject2Device,
 | 
| -                               FX_FLOAT font_size,
 | 
| -                               uint32_t argb,
 | 
| -                               int alpha_flag,
 | 
| -                               void* pIccTransform) {
 | 
| -  if (nChars == 0) {
 | 
| +namespace {
 | 
| +
 | 
| +void DoNothing(void* info, const void* data, size_t size) {}
 | 
| +
 | 
| +FX_BOOL CGDrawGlyphRun(CGContextRef pContext,
 | 
| +                       int nChars,
 | 
| +                       const FXTEXT_CHARPOS* pCharPos,
 | 
| +                       CFX_Font* pFont,
 | 
| +                       CFX_FontCache* pCache,
 | 
| +                       const CFX_Matrix* pObject2Device,
 | 
| +                       FX_FLOAT font_size,
 | 
| +                       uint32_t argb) {
 | 
| +  if (nChars == 0)
 | 
|      return TRUE;
 | 
| -  }
 | 
| +
 | 
|    CFX_Matrix new_matrix;
 | 
|    FX_BOOL bNegSize = font_size < 0;
 | 
| -  if (bNegSize) {
 | 
| +  if (bNegSize)
 | 
|      font_size = -font_size;
 | 
| -  }
 | 
| +
 | 
|    FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;
 | 
|    new_matrix.Transform(ori_x, ori_y);
 | 
| -  if (pObject2Device) {
 | 
| +  if (pObject2Device)
 | 
|      new_matrix.Concat(*pObject2Device);
 | 
| -  }
 | 
| +
 | 
|    CQuartz2D& quartz2d =
 | 
|        static_cast<CApplePlatform*>(CFX_GEModule::Get()->GetPlatformData())
 | 
|            ->m_quartz2d;
 | 
| @@ -76,19 +53,17 @@ static FX_BOOL _CGDrawGlyphRun(CGContextRef pContext,
 | 
|  
 | 
|      pFont->SetPlatformFont(
 | 
|          quartz2d.CreateFont(pFont->GetFontData(), pFont->GetSize()));
 | 
| -    if (!pFont->GetPlatformFont()) {
 | 
| +    if (!pFont->GetPlatformFont())
 | 
|        return FALSE;
 | 
| -    }
 | 
|    }
 | 
|    CFX_FixedBufGrow<uint16_t, 32> glyph_indices(nChars);
 | 
|    CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
 | 
|    for (int i = 0; i < nChars; i++) {
 | 
|      glyph_indices[i] = pCharPos[i].m_ExtGID;
 | 
| -    if (bNegSize) {
 | 
| +    if (bNegSize)
 | 
|        glyph_positions[i].x = -pCharPos[i].m_OriginX;
 | 
| -    } else {
 | 
| +    else
 | 
|        glyph_positions[i].x = pCharPos[i].m_OriginX;
 | 
| -    }
 | 
|      glyph_positions[i].y = pCharPos[i].m_OriginY;
 | 
|    }
 | 
|    if (bNegSize) {
 | 
| @@ -102,19 +77,45 @@ static FX_BOOL _CGDrawGlyphRun(CGContextRef pContext,
 | 
|                                       font_size, glyph_indices, glyph_positions,
 | 
|                                       nChars, argb, nullptr);
 | 
|  }
 | 
| -static void _DoNothing(void* info, const void* data, size_t size) {}
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +void CFX_AggDeviceDriver::InitPlatform() {
 | 
| +  CQuartz2D& quartz2d =
 | 
| +      static_cast<CApplePlatform*>(CFX_GEModule::Get()->GetPlatformData())
 | 
| +          ->m_quartz2d;
 | 
| +  m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);
 | 
| +}
 | 
| +void CFX_AggDeviceDriver::DestroyPlatform() {
 | 
| +  CQuartz2D& quartz2d =
 | 
| +      static_cast<CApplePlatform*>(CFX_GEModule::Get()->GetPlatformData())
 | 
| +          ->m_quartz2d;
 | 
| +  if (m_pPlatformGraphics) {
 | 
| +    quartz2d.destroyGraphics(m_pPlatformGraphics);
 | 
| +    m_pPlatformGraphics = nullptr;
 | 
| +  }
 | 
| +}
 | 
| +void CFX_FaceCache::InitPlatform() {}
 | 
| +void CFX_FaceCache::DestroyPlatform() {}
 | 
| +CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(
 | 
| +    CFX_Font* pFont,
 | 
| +    uint32_t glyph_index,
 | 
| +    const CFX_Matrix* pMatrix,
 | 
| +    int dest_width,
 | 
| +    int anti_alias) {
 | 
| +  return nullptr;
 | 
| +}
 | 
| +
 | 
|  FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
 | 
|                                              const FXTEXT_CHARPOS* pCharPos,
 | 
|                                              CFX_Font* pFont,
 | 
|                                              CFX_FontCache* pCache,
 | 
|                                              const CFX_Matrix* pObject2Device,
 | 
|                                              FX_FLOAT font_size,
 | 
| -                                            uint32_t argb,
 | 
| -                                            int alpha_flag,
 | 
| -                                            void* pIccTransform) {
 | 
| -  if (!pFont) {
 | 
| +                                            uint32_t argb) {
 | 
| +  if (!pFont)
 | 
|      return FALSE;
 | 
| -  }
 | 
| +
 | 
|    FX_BOOL bBold = pFont->IsBold();
 | 
|    if (!bBold && pFont->GetSubstFont() &&
 | 
|        pFont->GetSubstFont()->m_Weight >= 500 &&
 | 
| @@ -122,9 +123,8 @@ FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
 | 
|      return FALSE;
 | 
|    }
 | 
|    for (int i = 0; i < nChars; i++) {
 | 
| -    if (pCharPos[i].m_bGlyphAdjust) {
 | 
| +    if (pCharPos[i].m_bGlyphAdjust)
 | 
|        return FALSE;
 | 
| -    }
 | 
|    }
 | 
|    CGContextRef ctx = CGContextRef(m_pPlatformGraphics);
 | 
|    if (!ctx)
 | 
| @@ -142,7 +142,7 @@ FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
 | 
|      if (pClipMask) {
 | 
|        CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData(
 | 
|            nullptr, pClipMask->GetBuffer(),
 | 
| -          pClipMask->GetPitch() * pClipMask->GetHeight(), _DoNothing);
 | 
| +          pClipMask->GetPitch() * pClipMask->GetHeight(), DoNothing);
 | 
|        CGFloat decode_f[2] = {255.f, 0.f};
 | 
|        pImageCG = CGImageMaskCreate(
 | 
|            pClipMask->GetWidth(), pClipMask->GetHeight(), 8, 8,
 | 
| @@ -153,20 +153,19 @@ FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
 | 
|      rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
 | 
|    }
 | 
|    rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg);
 | 
| -  if (pImageCG) {
 | 
| +  if (pImageCG)
 | 
|      CGContextClipToMask(ctx, rect_cg, pImageCG);
 | 
| -  } else {
 | 
| +  else
 | 
|      CGContextClipToRect(ctx, rect_cg);
 | 
| -  }
 | 
| -  FX_BOOL ret =
 | 
| -      _CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache, pObject2Device,
 | 
| -                      font_size, argb, alpha_flag, pIccTransform);
 | 
| -  if (pImageCG) {
 | 
| +
 | 
| +  FX_BOOL ret = CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache,
 | 
| +                               pObject2Device, font_size, argb);
 | 
| +  if (pImageCG)
 | 
|      CGImageRelease(pImageCG);
 | 
| -  }
 | 
|    CGContextRestoreGState(ctx);
 | 
|    return ret;
 | 
|  }
 | 
| +
 | 
|  void CFX_Font::ReleasePlatformResource() {
 | 
|    if (m_pPlatformFont) {
 | 
|      CQuartz2D& quartz2d =
 | 
| 
 |