| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../../include/fxge/fx_ge.h" | 7 #include "../../../include/fxge/fx_ge.h" |
| 8 #include "../../../include/fxge/fx_freetype.h" | 8 #include "../../../include/fxge/fx_freetype.h" |
| 9 #include "../../../include/fxcodec/fx_codec.h" | 9 #include "../../../include/fxcodec/fx_codec.h" |
| 10 #include "text_int.h" | 10 #include "text_int.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 | 39 |
| 40 private: | 40 private: |
| 41 FT_Face m_Face; | 41 FT_Face m_Face; |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 } | 44 } |
| 45 | 45 |
| 46 FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_a
lias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY) | 46 FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_a
lias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY) |
| 47 { | 47 { |
| 48 FX_RECT rect(0, 0, 0, 0); | 48 FX_RECT rect(0, 0, 0, 0); |
| 49 FX_BOOL bStarted = FALSE; | 49 bool bStarted = false; |
| 50 for (int iChar = 0; iChar < nChars; iChar ++) { | 50 for (int iChar = 0; iChar < nChars; iChar ++) { |
| 51 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar]; | 51 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar]; |
| 52 const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph; | 52 const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph; |
| 53 if (pGlyph == NULL) { | 53 if (pGlyph == NULL) { |
| 54 continue; | 54 continue; |
| 55 } | 55 } |
| 56 int char_left = glyph.m_OriginX + pGlyph->m_Left; | 56 int char_left = glyph.m_OriginX + pGlyph->m_Left; |
| 57 int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX); | 57 int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX); |
| 58 if (anti_alias == FXFT_RENDER_MODE_LCD) { | 58 if (anti_alias == FXFT_RENDER_MODE_LCD) { |
| 59 char_width /= 3; | 59 char_width /= 3; |
| 60 } | 60 } |
| 61 int char_right = char_left + char_width; | 61 int char_right = char_left + char_width; |
| 62 int char_top = glyph.m_OriginY - pGlyph->m_Top; | 62 int char_top = glyph.m_OriginY - pGlyph->m_Top; |
| 63 int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retina
ScaleY); | 63 int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retina
ScaleY); |
| 64 if (!bStarted) { | 64 if (!bStarted) { |
| 65 rect.left = char_left; | 65 rect.left = char_left; |
| 66 rect.right = char_right; | 66 rect.right = char_right; |
| 67 rect.top = char_top; | 67 rect.top = char_top; |
| 68 rect.bottom = char_bottom; | 68 rect.bottom = char_bottom; |
| 69 bStarted = TRUE; | 69 bStarted = true; |
| 70 } else { | 70 } else { |
| 71 if (rect.left > char_left) { | 71 if (rect.left > char_left) { |
| 72 rect.left = char_left; | 72 rect.left = char_left; |
| 73 } | 73 } |
| 74 if (rect.right < char_right) { | 74 if (rect.right < char_right) { |
| 75 rect.right = char_right; | 75 rect.right = char_right; |
| 76 } | 76 } |
| 77 if (rect.top > char_top) { | 77 if (rect.top > char_top) { |
| 78 rect.top = char_top; | 78 rect.top = char_top; |
| 79 } | 79 } |
| 80 if (rect.bottom < char_bottom) { | 80 if (rect.bottom < char_bottom) { |
| 81 rect.bottom = char_bottom; | 81 rect.bottom = char_bottom; |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 } | 84 } |
| 85 return rect; | 85 return rect; |
| 86 } | 86 } |
| 87 static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars) | 87 static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars) |
| 88 { | 88 { |
| 89 ASSERT(nChars > 1); | 89 ASSERT(nChars > 1); |
| 90 FX_BOOL bVertical = FALSE; | 90 bool bVertical = false; |
| 91 if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) { | 91 if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) { |
| 92 bVertical = TRUE; | 92 bVertical = true; |
| 93 } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY)
{ | 93 } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY)
{ |
| 94 return; | 94 return; |
| 95 } | 95 } |
| 96 int i = nChars - 1; | 96 int i = nChars - 1; |
| 97 int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i]
.m_OriginX; | 97 int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i]
.m_OriginX; |
| 98 FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndP
os[i].m_fOriginX; | 98 FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndP
os[i].m_fOriginX; |
| 99 for (i --; i > 0; i --) { | 99 for (i --; i > 0; i --) { |
| 100 int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPo
s[i].m_OriginX; | 100 int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPo
s[i].m_OriginX; |
| 101 FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyph
AndPos[i].m_fOriginX; | 101 FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyph
AndPos[i].m_fOriginX; |
| 102 int space = (*next_origin) - (*this_origin); | 102 int space = (*next_origin) - (*this_origin); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 FXARGB_A(color); | 148 FXARGB_A(color); |
| 149 argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]); | 149 argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]); |
| 150 return; | 150 return; |
| 151 } | 151 } |
| 152 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), | 152 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), |
| 153 FXSYS_GetYValue(color), FXSYS_GetKValue(color), | 153 FXSYS_GetYValue(color), FXSYS_GetKValue(color), |
| 154 bgra[2], bgra[1], bgra[0]); | 154 bgra[2], bgra[1], bgra[0]); |
| 155 bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_
ALPHA_STROKE(alpha_flag); | 155 bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_
ALPHA_STROKE(alpha_flag); |
| 156 argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]); | 156 argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]); |
| 157 } | 157 } |
| 158 FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pChar
Pos, | 158 bool CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos
, |
| 159 CFX_Font* pFont, CFX_FontCache* pCache, | 159 CFX_Font* pFont, CFX_FontCache* pCache, |
| 160 FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device, | 160 FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device, |
| 161 FX_DWORD fill_color, FX_DWORD text_flags, | 161 FX_DWORD fill_color, FX_DWORD text_flags, |
| 162 int alpha_flag, void* pIccTransform) | 162 int alpha_flag, void* pIccTransform) |
| 163 { | 163 { |
| 164 int nativetext_flags = text_flags; | 164 int nativetext_flags = text_flags; |
| 165 if (m_DeviceClass != FXDC_DISPLAY) { | 165 if (m_DeviceClass != FXDC_DISPLAY) { |
| 166 if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) { | 166 if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) { |
| 167 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 167 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
| 168 if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_Wi
deString::FromLocal("+ZJHL")) == -1) | 168 if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_Wi
deString::FromLocal("+ZJHL")) == -1) |
| 169 #ifdef FOXIT_CHROME_BUILD | 169 #ifdef FOXIT_CHROME_BUILD |
| 170 if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex
10")) | 170 if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex
10")) |
| 171 #endif | 171 #endif |
| 172 #endif | 172 #endif |
| 173 if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont,
pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) { | 173 if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont,
pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) { |
| 174 return TRUE; | 174 return true; |
| 175 } | 175 } |
| 176 } | 176 } |
| 177 int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha
_flag) : FXARGB_A(fill_color); | 177 int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha
_flag) : FXARGB_A(fill_color); |
| 178 if (alpha < 255) { | 178 if (alpha < 255) { |
| 179 return FALSE; | 179 return false; |
| 180 } | 180 } |
| 181 } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) { | 181 } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) { |
| 182 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 182 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
| 183 if (!(text_flags & FXFONT_CIDFONT)) | 183 if (!(text_flags & FXFONT_CIDFONT)) |
| 184 #ifdef FOXIT_CHROME_BUILD | 184 #ifdef FOXIT_CHROME_BUILD |
| 185 if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10")
) | 185 if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10")
) |
| 186 #endif | 186 #endif |
| 187 #endif | 187 #endif |
| 188 if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCa
che, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) { | 188 if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCa
che, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) { |
| 189 return TRUE; | 189 return true; |
| 190 } | 190 } |
| 191 } | 191 } |
| 192 CFX_AffineMatrix char2device, deviceCtm, text2Device; | 192 CFX_AffineMatrix char2device, deviceCtm, text2Device; |
| 193 if (pText2Device) { | 193 if (pText2Device) { |
| 194 char2device = *pText2Device; | 194 char2device = *pText2Device; |
| 195 text2Device = *pText2Device; | 195 text2Device = *pText2Device; |
| 196 } | 196 } |
| 197 char2device.Scale(font_size, -font_size); | 197 char2device.Scale(font_size, -font_size); |
| 198 if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f || | 198 if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f || |
| 199 ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver
()) | 199 ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver
()) |
| 200 && !(text_flags & FXTEXT_PRINTIMAGETEXT))) { | 200 && !(text_flags & FXTEXT_PRINTIMAGETEXT))) { |
| 201 if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & F
XFONT_SUBST_GLYPHPATH)) { | 201 if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & F
XFONT_SUBST_GLYPHPATH)) { |
| 202 int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NO
PATHSMOOTH; | 202 int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NO
PATHSMOOTH; |
| 203 return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pTex
t2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform
); | 203 return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pTex
t2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform
); |
| 204 } | 204 } |
| 205 } | 205 } |
| 206 int anti_alias = FXFT_RENDER_MODE_MONO; | 206 int anti_alias = FXFT_RENDER_MODE_MONO; |
| 207 FX_BOOL bNormal = FALSE; | 207 bool bNormal = false; |
| 208 if ((text_flags & FXTEXT_NOSMOOTH) == 0) { | 208 if ((text_flags & FXTEXT_NOSMOOTH) == 0) { |
| 209 if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) { | 209 if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) { |
| 210 FX_BOOL bClearType; | 210 bool bClearType; |
| 211 if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlag
s & FXFONT_SUBST_CLEARTYPE)) { | 211 if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlag
s & FXFONT_SUBST_CLEARTYPE)) { |
| 212 bClearType = FALSE; | 212 bClearType = false; |
| 213 } else { | 213 } else { |
| 214 bClearType = text_flags & FXTEXT_CLEARTYPE; | 214 bClearType = text_flags & FXTEXT_CLEARTYPE; |
| 215 } | 215 } |
| 216 if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) { | 216 if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) { |
| 217 anti_alias = FXFT_RENDER_MODE_LCD; | 217 anti_alias = FXFT_RENDER_MODE_LCD; |
| 218 bNormal = TRUE; | 218 bNormal = true; |
| 219 } else if (m_bpp < 16) { | 219 } else if (m_bpp < 16) { |
| 220 anti_alias = FXFT_RENDER_MODE_NORMAL; | 220 anti_alias = FXFT_RENDER_MODE_NORMAL; |
| 221 } else { | 221 } else { |
| 222 if (bClearType == FALSE) { | 222 if (bClearType == false) { |
| 223 anti_alias = FXFT_RENDER_MODE_LCD; | 223 anti_alias = FXFT_RENDER_MODE_LCD; |
| 224 bNormal = TRUE; | 224 bNormal = true; |
| 225 } else { | 225 } else { |
| 226 anti_alias = FXFT_RENDER_MODE_LCD; | 226 anti_alias = FXFT_RENDER_MODE_LCD; |
| 227 } | 227 } |
| 228 } | 228 } |
| 229 } | 229 } |
| 230 } | 230 } |
| 231 if (pCache == NULL) { | 231 if (pCache == NULL) { |
| 232 pCache = CFX_GEModule::Get()->GetFontCache(); | 232 pCache = CFX_GEModule::Get()->GetFontCache(); |
| 233 } | 233 } |
| 234 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont); | 234 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 bmp_rect1.left--; | 271 bmp_rect1.left--; |
| 272 bmp_rect1.top --; | 272 bmp_rect1.top --; |
| 273 bmp_rect1.right ++; | 273 bmp_rect1.right ++; |
| 274 bmp_rect1.bottom ++; | 274 bmp_rect1.bottom ++; |
| 275 } | 275 } |
| 276 FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_ro
und((FX_FLOAT)(bmp_rect1.top) / scale_y), | 276 FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_ro
und((FX_FLOAT)(bmp_rect1.top) / scale_y), |
| 277 FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_rou
nd((FX_FLOAT)bmp_rect1.bottom / scale_y)); | 277 FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_rou
nd((FX_FLOAT)bmp_rect1.bottom / scale_y)); |
| 278 bmp_rect.Intersect(m_ClipBox); | 278 bmp_rect.Intersect(m_ClipBox); |
| 279 if (bmp_rect.IsEmpty()) { | 279 if (bmp_rect.IsEmpty()) { |
| 280 FX_Free(pGlyphAndPos); | 280 FX_Free(pGlyphAndPos); |
| 281 return TRUE; | 281 return true; |
| 282 } | 282 } |
| 283 int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x); | 283 int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x); |
| 284 int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y); | 284 int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y); |
| 285 int pixel_left = FXSYS_round(bmp_rect.left * scale_x); | 285 int pixel_left = FXSYS_round(bmp_rect.left * scale_x); |
| 286 int pixel_top = FXSYS_round(bmp_rect.top * scale_y); | 286 int pixel_top = FXSYS_round(bmp_rect.top * scale_y); |
| 287 if (anti_alias == FXFT_RENDER_MODE_MONO) { | 287 if (anti_alias == FXFT_RENDER_MODE_MONO) { |
| 288 CFX_DIBitmap bitmap; | 288 CFX_DIBitmap bitmap; |
| 289 if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) { | 289 if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) { |
| 290 FX_Free(pGlyphAndPos); | 290 FX_Free(pGlyphAndPos); |
| 291 return FALSE; | 291 return false; |
| 292 } | 292 } |
| 293 bitmap.Clear(0); | 293 bitmap.Clear(0); |
| 294 for (iChar = 0; iChar < nChars; iChar ++) { | 294 for (iChar = 0; iChar < nChars; iChar ++) { |
| 295 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar]; | 295 FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar]; |
| 296 if (glyph.m_pGlyph == NULL) { | 296 if (glyph.m_pGlyph == NULL) { |
| 297 continue; | 297 continue; |
| 298 } | 298 } |
| 299 const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap; | 299 const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap; |
| 300 bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pix
el_left, | 300 bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pix
el_left, |
| 301 glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixe
l_top, | 301 glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixe
l_top, |
| 302 pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyp
h, 0, 0); | 302 pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyp
h, 0, 0); |
| 303 } | 303 } |
| 304 FX_Free(pGlyphAndPos); | 304 FX_Free(pGlyphAndPos); |
| 305 return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color); | 305 return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color); |
| 306 } | 306 } |
| 307 CFX_DIBitmap bitmap; | 307 CFX_DIBitmap bitmap; |
| 308 if (m_bpp == 8) { | 308 if (m_bpp == 8) { |
| 309 if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) { | 309 if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) { |
| 310 FX_Free(pGlyphAndPos); | 310 FX_Free(pGlyphAndPos); |
| 311 return FALSE; | 311 return false; |
| 312 } | 312 } |
| 313 } else { | 313 } else { |
| 314 if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) { | 314 if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) { |
| 315 FX_Free(pGlyphAndPos); | 315 FX_Free(pGlyphAndPos); |
| 316 return FALSE; | 316 return false; |
| 317 } | 317 } |
| 318 } | 318 } |
| 319 if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) { | 319 if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) { |
| 320 bitmap.Clear(0xFFFFFFFF); | 320 bitmap.Clear(0xFFFFFFFF); |
| 321 if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) { | 321 if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) { |
| 322 FX_Free(pGlyphAndPos); | 322 FX_Free(pGlyphAndPos); |
| 323 return FALSE; | 323 return false; |
| 324 } | 324 } |
| 325 } else { | 325 } else { |
| 326 bitmap.Clear(0); | 326 bitmap.Clear(0); |
| 327 if (bitmap.m_pAlphaMask) { | 327 if (bitmap.m_pAlphaMask) { |
| 328 bitmap.m_pAlphaMask->Clear(0); | 328 bitmap.m_pAlphaMask->Clear(0); |
| 329 } | 329 } |
| 330 } | 330 } |
| 331 int dest_width = pixel_width; | 331 int dest_width = pixel_width; |
| 332 uint8_t* dest_buf = bitmap.GetBuffer(); | 332 uint8_t* dest_buf = bitmap.GetBuffer(); |
| 333 int dest_pitch = bitmap.GetPitch(); | 333 int dest_pitch = bitmap.GetPitch(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 345 if (glyph.m_pGlyph == NULL) { | 345 if (glyph.m_pGlyph == NULL) { |
| 346 continue; | 346 continue; |
| 347 } | 347 } |
| 348 const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap; | 348 const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap; |
| 349 int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left; | 349 int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left; |
| 350 int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top; | 350 int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top; |
| 351 int ncols = pGlyph->GetWidth(); | 351 int ncols = pGlyph->GetWidth(); |
| 352 int nrows = pGlyph->GetHeight(); | 352 int nrows = pGlyph->GetHeight(); |
| 353 if (anti_alias == FXFT_RENDER_MODE_NORMAL) { | 353 if (anti_alias == FXFT_RENDER_MODE_NORMAL) { |
| 354 if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_colo
r, | 354 if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_colo
r, |
| 355 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alp
ha_flag, pIccTransform)) { | 355 0, 0, FXDIB_BLEND_NORMAL, NULL, false, alp
ha_flag, pIccTransform)) { |
| 356 FX_Free(pGlyphAndPos); | 356 FX_Free(pGlyphAndPos); |
| 357 return FALSE; | 357 return false; |
| 358 } | 358 } |
| 359 continue; | 359 continue; |
| 360 } | 360 } |
| 361 FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE; | 361 bool bBGRStripe = text_flags & FXTEXT_BGR_STRIPE; |
| 362 ncols /= 3; | 362 ncols /= 3; |
| 363 int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3; | 363 int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3; |
| 364 uint8_t* src_buf = pGlyph->GetBuffer(); | 364 uint8_t* src_buf = pGlyph->GetBuffer(); |
| 365 int src_pitch = pGlyph->GetPitch(); | 365 int src_pitch = pGlyph->GetPitch(); |
| 366 int start_col = left; | 366 int start_col = left; |
| 367 if (start_col < 0) { | 367 if (start_col < 0) { |
| 368 start_col = 0; | 368 start_col = 0; |
| 369 } | 369 } |
| 370 int end_col = left + ncols; | 370 int end_col = left + ncols; |
| 371 if (end_col > dest_width) { | 371 if (end_col > dest_width) { |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 } | 938 } |
| 939 } | 939 } |
| 940 } | 940 } |
| 941 } | 941 } |
| 942 if (bitmap.IsAlphaMask()) { | 942 if (bitmap.IsAlphaMask()) { |
| 943 SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag,
pIccTransform); | 943 SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag,
pIccTransform); |
| 944 } else { | 944 } else { |
| 945 SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top); | 945 SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top); |
| 946 } | 946 } |
| 947 FX_Free(pGlyphAndPos); | 947 FX_Free(pGlyphAndPos); |
| 948 return TRUE; | 948 return true; |
| 949 } | 949 } |
| 950 FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPo
s, | 950 bool CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos, |
| 951 CFX_Font* pFont, CFX_FontCache* pCache, | 951 CFX_Font* pFont, CFX_FontCache* pCache, |
| 952 FX_FLOAT font_size, const CFX_AffineMatri
x* pText2User, | 952 FX_FLOAT font_size, const CFX_AffineMatri
x* pText2User, |
| 953 const CFX_AffineMatrix* pUser2Device, con
st CFX_GraphStateData* pGraphState, | 953 const CFX_AffineMatrix* pUser2Device, con
st CFX_GraphStateData* pGraphState, |
| 954 FX_DWORD fill_color, FX_ARGB stroke_color
, CFX_PathData* pClippingPath, int nFlag, | 954 FX_DWORD fill_color, FX_ARGB stroke_color
, CFX_PathData* pClippingPath, int nFlag, |
| 955 int alpha_flag, void* pIccTransform, int
blend_type) | 955 int alpha_flag, void* pIccTransform, int
blend_type) |
| 956 { | 956 { |
| 957 if (pCache == NULL) { | 957 if (pCache == NULL) { |
| 958 pCache = CFX_GEModule::Get()->GetFontCache(); | 958 pCache = CFX_GEModule::Get()->GetFontCache(); |
| 959 } | 959 } |
| 960 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont); | 960 CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont); |
| 961 FX_FONTCACHE_DEFINE(pCache, pFont); | 961 FX_FONTCACHE_DEFINE(pCache, pFont); |
| 962 for (int iChar = 0; iChar < nChars; iChar ++) { | 962 for (int iChar = 0; iChar < nChars; iChar ++) { |
| 963 const FXTEXT_CHARPOS& charpos = pCharPos[iChar]; | 963 const FXTEXT_CHARPOS& charpos = pCharPos[iChar]; |
| 964 CFX_AffineMatrix matrix; | 964 CFX_AffineMatrix matrix; |
| 965 if (charpos.m_bGlyphAdjust) | 965 if (charpos.m_bGlyphAdjust) |
| 966 matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], | 966 matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], |
| 967 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0,
0); | 967 charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0,
0); |
| 968 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_O
riginY); | 968 matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_O
riginY); |
| 969 const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_G
lyphIndex, charpos.m_FontCharWidth); | 969 const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_G
lyphIndex, charpos.m_FontCharWidth); |
| 970 if (pPath == NULL) { | 970 if (pPath == NULL) { |
| 971 continue; | 971 continue; |
| 972 } | 972 } |
| 973 matrix.Concat(*pText2User); | 973 matrix.Concat(*pText2User); |
| 974 CFX_PathData TransformedPath(*pPath); | 974 CFX_PathData TransformedPath(*pPath); |
| 975 TransformedPath.Transform(&matrix); | 975 TransformedPath.Transform(&matrix); |
| 976 FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ? | 976 bool bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ? |
| 977 (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA
_STROKE(alpha_flag)) : | 977 (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA
_STROKE(alpha_flag)) : |
| 978 (fill_color || stroke_color); | 978 (fill_color || stroke_color); |
| 979 if (bHasAlpha) { | 979 if (bHasAlpha) { |
| 980 int fill_mode = nFlag; | 980 int fill_mode = nFlag; |
| 981 if (FXGETFLAG_COLORTYPE(alpha_flag)) { | 981 if (FXGETFLAG_COLORTYPE(alpha_flag)) { |
| 982 if (FXGETFLAG_ALPHA_FILL(alpha_flag)) { | 982 if (FXGETFLAG_ALPHA_FILL(alpha_flag)) { |
| 983 fill_mode |= FXFILL_WINDING; | 983 fill_mode |= FXFILL_WINDING; |
| 984 } | 984 } |
| 985 } else { | 985 } else { |
| 986 if (fill_color) { | 986 if (fill_color) { |
| 987 fill_mode |= FXFILL_WINDING; | 987 fill_mode |= FXFILL_WINDING; |
| 988 } | 988 } |
| 989 } | 989 } |
| 990 fill_mode |= FX_FILL_TEXT_MODE; | 990 fill_mode |= FX_FILL_TEXT_MODE; |
| 991 if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_colo
r, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) { | 991 if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_colo
r, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) { |
| 992 return FALSE; | 992 return false; |
| 993 } | 993 } |
| 994 } | 994 } |
| 995 if (pClippingPath) { | 995 if (pClippingPath) { |
| 996 pClippingPath->Append(&TransformedPath, pUser2Device); | 996 pClippingPath->Append(&TransformedPath, pUser2Device); |
| 997 } | 997 } |
| 998 } | 998 } |
| 999 return TRUE; | 999 return true; |
| 1000 } | 1000 } |
| 1001 CFX_FontCache::~CFX_FontCache() | 1001 CFX_FontCache::~CFX_FontCache() |
| 1002 { | 1002 { |
| 1003 FreeCache(TRUE); | 1003 FreeCache(true); |
| 1004 } | 1004 } |
| 1005 | 1005 |
| 1006 CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont) | 1006 CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont) |
| 1007 { | 1007 { |
| 1008 FXFT_Face internal_face = pFont->GetFace(); | 1008 FXFT_Face internal_face = pFont->GetFace(); |
| 1009 const FX_BOOL bExternal = internal_face == nullptr; | 1009 const bool bExternal = internal_face == nullptr; |
| 1010 FXFT_Face face = bExternal ? | 1010 FXFT_Face face = bExternal ? |
| 1011 (FXFT_Face)pFont->GetSubstFont()->m_ExtHandle : internal_face; | 1011 (FXFT_Face)pFont->GetSubstFont()->m_ExtHandle : internal_face; |
| 1012 CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap; | 1012 CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap; |
| 1013 auto it = map.find(face); | 1013 auto it = map.find(face); |
| 1014 if (it != map.end()) { | 1014 if (it != map.end()) { |
| 1015 CFX_CountedFaceCache* counted_face_cache = it->second; | 1015 CFX_CountedFaceCache* counted_face_cache = it->second; |
| 1016 counted_face_cache->m_nCount++; | 1016 counted_face_cache->m_nCount++; |
| 1017 return counted_face_cache->m_Obj; | 1017 return counted_face_cache->m_Obj; |
| 1018 } | 1018 } |
| 1019 | 1019 |
| 1020 CFX_FaceCache* face_cache = new CFX_FaceCache(bExternal ? nullptr : face); | 1020 CFX_FaceCache* face_cache = new CFX_FaceCache(bExternal ? nullptr : face); |
| 1021 CFX_CountedFaceCache* counted_face_cache = new CFX_CountedFaceCache; | 1021 CFX_CountedFaceCache* counted_face_cache = new CFX_CountedFaceCache; |
| 1022 counted_face_cache->m_nCount = 2; | 1022 counted_face_cache->m_nCount = 2; |
| 1023 counted_face_cache->m_Obj = face_cache; | 1023 counted_face_cache->m_Obj = face_cache; |
| 1024 map[face] = counted_face_cache; | 1024 map[face] = counted_face_cache; |
| 1025 return face_cache; | 1025 return face_cache; |
| 1026 } | 1026 } |
| 1027 | 1027 |
| 1028 void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont) | 1028 void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont) |
| 1029 { | 1029 { |
| 1030 FXFT_Face internal_face = pFont->GetFace(); | 1030 FXFT_Face internal_face = pFont->GetFace(); |
| 1031 const FX_BOOL bExternal = internal_face == nullptr; | 1031 const bool bExternal = internal_face == nullptr; |
| 1032 FXFT_Face face = bExternal ? | 1032 FXFT_Face face = bExternal ? |
| 1033 (FXFT_Face)pFont->GetSubstFont()->m_ExtHandle : internal_face; | 1033 (FXFT_Face)pFont->GetSubstFont()->m_ExtHandle : internal_face; |
| 1034 CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap; | 1034 CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap; |
| 1035 | 1035 |
| 1036 auto it = map.find(face); | 1036 auto it = map.find(face); |
| 1037 if (it == map.end()) | 1037 if (it == map.end()) |
| 1038 return; | 1038 return; |
| 1039 | 1039 |
| 1040 CFX_CountedFaceCache* counted_face_cache = it->second; | 1040 CFX_CountedFaceCache* counted_face_cache = it->second; |
| 1041 if (counted_face_cache->m_nCount > 1) { | 1041 if (counted_face_cache->m_nCount > 1) { |
| 1042 counted_face_cache->m_nCount--; | 1042 counted_face_cache->m_nCount--; |
| 1043 } | 1043 } |
| 1044 } | 1044 } |
| 1045 | 1045 |
| 1046 void CFX_FontCache::FreeCache(FX_BOOL bRelease) | 1046 void CFX_FontCache::FreeCache(bool bRelease) |
| 1047 { | 1047 { |
| 1048 for (auto it = m_FTFaceMap.begin(); it != m_FTFaceMap.end();) { | 1048 for (auto it = m_FTFaceMap.begin(); it != m_FTFaceMap.end();) { |
| 1049 auto curr_it = it++; | 1049 auto curr_it = it++; |
| 1050 CFX_CountedFaceCache* cache = curr_it->second; | 1050 CFX_CountedFaceCache* cache = curr_it->second; |
| 1051 if (bRelease || cache->m_nCount < 2) { | 1051 if (bRelease || cache->m_nCount < 2) { |
| 1052 delete cache->m_Obj; | 1052 delete cache->m_Obj; |
| 1053 delete cache; | 1053 delete cache; |
| 1054 m_FTFaceMap.erase(curr_it); | 1054 m_FTFaceMap.erase(curr_it); |
| 1055 } | 1055 } |
| 1056 } | 1056 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1090 } | 1090 } |
| 1091 delete m_pBitmap; | 1091 delete m_pBitmap; |
| 1092 m_PathMap.RemoveAll(); | 1092 m_PathMap.RemoveAll(); |
| 1093 } | 1093 } |
| 1094 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ | 1094 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ |
| 1095 void CFX_FaceCache::InitPlatform() | 1095 void CFX_FaceCache::InitPlatform() |
| 1096 { | 1096 { |
| 1097 } | 1097 } |
| 1098 #endif | 1098 #endif |
| 1099 CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_Aff
ineMatrix* pMatrix, | 1099 CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_Aff
ineMatrix* pMatrix, |
| 1100 CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle
, | 1100 CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, bool bFontStyle, |
| 1101 int dest_width, int anti_alias) | 1101 int dest_width, int anti_alias) |
| 1102 { | 1102 { |
| 1103 CFX_SizeGlyphCache* pSizeCache = NULL; | 1103 CFX_SizeGlyphCache* pSizeCache = NULL; |
| 1104 if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) { | 1104 if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) { |
| 1105 pSizeCache = new CFX_SizeGlyphCache; | 1105 pSizeCache = new CFX_SizeGlyphCache; |
| 1106 m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache); | 1106 m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache); |
| 1107 } | 1107 } |
| 1108 CFX_GlyphBitmap* pGlyphBitmap = NULL; | 1108 CFX_GlyphBitmap* pGlyphBitmap = NULL; |
| 1109 if (pSizeCache->m_GlyphMap.Lookup((void*)(uintptr_t)glyph_index, (void*&)pGl
yphBitmap)) { | 1109 if (pSizeCache->m_GlyphMap.Lookup((void*)(uintptr_t)glyph_index, (void*&)pGl
yphBitmap)) { |
| 1110 return pGlyphBitmap; | 1110 return pGlyphBitmap; |
| 1111 } | 1111 } |
| 1112 pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_wid
th, anti_alias); | 1112 pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_wid
th, anti_alias); |
| 1113 if (pGlyphBitmap == NULL) { | 1113 if (pGlyphBitmap == NULL) { |
| 1114 return NULL; | 1114 return NULL; |
| 1115 } | 1115 } |
| 1116 pSizeCache->m_GlyphMap.SetAt((void*)(uintptr_t)glyph_index, pGlyphBitmap); | 1116 pSizeCache->m_GlyphMap.SetAt((void*)(uintptr_t)glyph_index, pGlyphBitmap); |
| 1117 return pGlyphBitmap; | 1117 return pGlyphBitmap; |
| 1118 } | 1118 } |
| 1119 const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD
glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix, | 1119 const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD
glyph_index, bool bFontStyle, const CFX_AffineMatrix* pMatrix, |
| 1120 int dest_width, int anti_alias, int& text_flags) | 1120 int dest_width, int anti_alias, int& text_flags) |
| 1121 { | 1121 { |
| 1122 if (glyph_index == (FX_DWORD) - 1) { | 1122 if (glyph_index == (FX_DWORD) - 1) { |
| 1123 return NULL; | 1123 return NULL; |
| 1124 } | 1124 } |
| 1125 _CFX_UniqueKeyGen keygen; | 1125 _CFX_UniqueKeyGen keygen; |
| 1126 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ | 1126 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ |
| 1127 if (pFont->GetSubstFont()) | 1127 if (pFont->GetSubstFont()) |
| 1128 keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000), | 1128 keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000), |
| 1129 (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), de
st_width, anti_alias, | 1129 (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), de
st_width, anti_alias, |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 temp = (int)((*(pSrcRow++) - min) * rate + 0.5); | 1307 temp = (int)((*(pSrcRow++) - min) * rate + 0.5); |
| 1308 if (temp > 255) { | 1308 if (temp > 255) { |
| 1309 temp = 255; | 1309 temp = 255; |
| 1310 } else if (temp < 0) { | 1310 } else if (temp < 0) { |
| 1311 temp = 0; | 1311 temp = 0; |
| 1312 } | 1312 } |
| 1313 *pDstRow ++ = (uint8_t)temp; | 1313 *pDstRow ++ = (uint8_t)temp; |
| 1314 } | 1314 } |
| 1315 } | 1315 } |
| 1316 } | 1316 } |
| 1317 CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_inde
x, FX_BOOL bFontStyle, | 1317 CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_inde
x, bool bFontStyle, |
| 1318 const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias) | 1318 const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias) |
| 1319 { | 1319 { |
| 1320 if (m_Face == NULL) { | 1320 if (m_Face == NULL) { |
| 1321 return NULL; | 1321 return NULL; |
| 1322 } | 1322 } |
| 1323 FXFT_Matrix ft_matrix; | 1323 FXFT_Matrix ft_matrix; |
| 1324 ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536); | 1324 ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536); |
| 1325 ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536); | 1325 ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536); |
| 1326 ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536); | 1326 ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536); |
| 1327 ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536); | 1327 ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536); |
| 1328 FX_BOOL bUseCJKSubFont = FALSE; | 1328 bool bUseCJKSubFont = false; |
| 1329 const CFX_SubstFont* pSubstFont = pFont->GetSubstFont(); | 1329 const CFX_SubstFont* pSubstFont = pFont->GetSubstFont(); |
| 1330 if (pSubstFont) { | 1330 if (pSubstFont) { |
| 1331 bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle; | 1331 bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle; |
| 1332 int skew = 0; | 1332 int skew = 0; |
| 1333 if (bUseCJKSubFont) { | 1333 if (bUseCJKSubFont) { |
| 1334 skew = pSubstFont->m_bItlicCJK ? -15 : 0; | 1334 skew = pSubstFont->m_bItlicCJK ? -15 : 0; |
| 1335 } else { | 1335 } else { |
| 1336 skew = pSubstFont->m_ItalicAngle; | 1336 skew = pSubstFont->m_ItalicAngle; |
| 1337 } | 1337 } |
| 1338 if (skew) { | 1338 if (skew) { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1418 for (int row = 0; row < bmheight; row ++) { | 1418 for (int row = 0; row < bmheight; row ++) { |
| 1419 FXSYS_memcpy(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pi
tch, rowbytes); | 1419 FXSYS_memcpy(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pi
tch, rowbytes); |
| 1420 } | 1420 } |
| 1421 } else { | 1421 } else { |
| 1422 _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, des
t_pitch); | 1422 _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, des
t_pitch); |
| 1423 _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::
Get()->GetTextGammaTable()); | 1423 _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::
Get()->GetTextGammaTable()); |
| 1424 } | 1424 } |
| 1425 } | 1425 } |
| 1426 return pGlyphBitmap; | 1426 return pGlyphBitmap; |
| 1427 } | 1427 } |
| 1428 FX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, | 1428 bool _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, |
| 1429 int glyph_index, FX_ARGB argb) | 1429 int glyph_index, FX_ARGB argb) |
| 1430 { | 1430 { |
| 1431 CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib; | 1431 CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib; |
| 1432 FXFT_Face face = pFont->GetFace(); | 1432 FXFT_Face face = pFont->GetFace(); |
| 1433 int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP); | 1433 int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP); |
| 1434 if (error) { | 1434 if (error) { |
| 1435 return FALSE; | 1435 return false; |
| 1436 } | 1436 } |
| 1437 error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL); | 1437 error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL); |
| 1438 if (error) { | 1438 if (error) { |
| 1439 return FALSE; | 1439 return false; |
| 1440 } | 1440 } |
| 1441 int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face)); | 1441 int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face)); |
| 1442 int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face)); | 1442 int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face)); |
| 1443 int left = FXFT_Get_Glyph_BitmapLeft(face); | 1443 int left = FXFT_Get_Glyph_BitmapLeft(face); |
| 1444 int top = FXFT_Get_Glyph_BitmapTop(face); | 1444 int top = FXFT_Get_Glyph_BitmapTop(face); |
| 1445 const uint8_t* src_buf = (const uint8_t*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Gly
ph_Bitmap(face)); | 1445 const uint8_t* src_buf = (const uint8_t*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Gly
ph_Bitmap(face)); |
| 1446 int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face)); | 1446 int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face)); |
| 1447 CFX_DIBitmap mask; | 1447 CFX_DIBitmap mask; |
| 1448 mask.Create(bmwidth, bmheight, FXDIB_8bppMask); | 1448 mask.Create(bmwidth, bmheight, FXDIB_8bppMask); |
| 1449 uint8_t* dest_buf = mask.GetBuffer(); | 1449 uint8_t* dest_buf = mask.GetBuffer(); |
| 1450 int dest_pitch = mask.GetPitch(); | 1450 int dest_pitch = mask.GetPitch(); |
| 1451 for (int row = 0; row < bmheight; row ++) { | 1451 for (int row = 0; row < bmheight; row ++) { |
| 1452 const uint8_t* src_scan = src_buf + row * src_pitch; | 1452 const uint8_t* src_scan = src_buf + row * src_pitch; |
| 1453 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 1453 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
| 1454 FXSYS_memcpy(dest_scan, src_scan, dest_pitch); | 1454 FXSYS_memcpy(dest_scan, src_scan, dest_pitch); |
| 1455 } | 1455 } |
| 1456 pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0)
; | 1456 pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0)
; |
| 1457 return TRUE; | 1457 return true; |
| 1458 } | 1458 } |
| 1459 FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size, | 1459 bool OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size, |
| 1460 CFX_AffineMatrix* pText_matrix, unsigned short const* text, u
nsigned long argb) | 1460 CFX_AffineMatrix* pText_matrix, unsigned short const* text, u
nsigned long argb) |
| 1461 { | 1461 { |
| 1462 if (!pFont) { | 1462 if (!pFont) { |
| 1463 return FALSE; | 1463 return false; |
| 1464 } | 1464 } |
| 1465 FXFT_Face face = pFont->GetFace(); | 1465 FXFT_Face face = pFont->GetFace(); |
| 1466 FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE); | 1466 FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE); |
| 1467 if (pText_matrix) { | 1467 if (pText_matrix) { |
| 1468 FXFT_Matrix ft_matrix; | 1468 FXFT_Matrix ft_matrix; |
| 1469 ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536); | 1469 ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536); |
| 1470 ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536); | 1470 ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536); |
| 1471 ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536); | 1471 ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536); |
| 1472 ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536); | 1472 ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536); |
| 1473 FXFT_Set_Transform(face, &ft_matrix, 0); | 1473 FXFT_Set_Transform(face, &ft_matrix, 0); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1486 int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face); | 1486 int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face); |
| 1487 int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face); | 1487 int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face); |
| 1488 FX_FLOAT x1, y1; | 1488 FX_FLOAT x1, y1; |
| 1489 pText_matrix->Transform(x_pos, 0, x1, y1); | 1489 pText_matrix->Transform(x_pos, 0, x1, y1); |
| 1490 _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont, | 1490 _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont, |
| 1491 glyph_index, argb); | 1491 glyph_index, argb); |
| 1492 x_pos += (FX_FLOAT)w / em; | 1492 x_pos += (FX_FLOAT)w / em; |
| 1493 } | 1493 } |
| 1494 if (pText_matrix) | 1494 if (pText_matrix) |
| 1495 ResetTransform(face); | 1495 ResetTransform(face); |
| 1496 return TRUE; | 1496 return true; |
| 1497 } | 1497 } |
| 1498 FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size, | 1498 bool OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size, |
| 1499 CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsign
ed long argb) | 1499 CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsign
ed long argb) |
| 1500 { | 1500 { |
| 1501 FXFT_Matrix ft_matrix; | 1501 FXFT_Matrix ft_matrix; |
| 1502 if (pMatrix) { | 1502 if (pMatrix) { |
| 1503 ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536); | 1503 ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536); |
| 1504 ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536); | 1504 ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536); |
| 1505 ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536); | 1505 ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536); |
| 1506 ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536); | 1506 ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536); |
| 1507 } else { | 1507 } else { |
| 1508 ft_matrix.xx = (signed long)(font_size / 64 * 65536); | 1508 ft_matrix.xx = (signed long)(font_size / 64 * 65536); |
| 1509 ft_matrix.xy = ft_matrix.yx = 0; | 1509 ft_matrix.xy = ft_matrix.yx = 0; |
| 1510 ft_matrix.yy = (signed long)(font_size / 64 * 65536); | 1510 ft_matrix.yy = (signed long)(font_size / 64 * 65536); |
| 1511 } | 1511 } |
| 1512 ScopedFontTransform scoped_transform(pFont->m_Face, &ft_matrix); | 1512 ScopedFontTransform scoped_transform(pFont->m_Face, &ft_matrix); |
| 1513 FX_BOOL ret = _OutputGlyph(dib, x, y, pFont, | 1513 bool ret = _OutputGlyph(dib, x, y, pFont, |
| 1514 glyph_index, argb); | 1514 glyph_index, argb); |
| 1515 return ret; | 1515 return ret; |
| 1516 } | 1516 } |
| 1517 const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph
_index, int dest_width) | 1517 const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph
_index, int dest_width) |
| 1518 { | 1518 { |
| 1519 if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) { | 1519 if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) { |
| 1520 return NULL; | 1520 return NULL; |
| 1521 } | 1521 } |
| 1522 CFX_PathData* pGlyphPath = NULL; | 1522 CFX_PathData* pGlyphPath = NULL; |
| 1523 void* key; | 1523 void* key; |
| 1524 if (pFont->GetSubstFont()) | 1524 if (pFont->GetSubstFont()) |
| 1525 key = (void*)(uintptr_t)(glyph_index + ((pFont->GetSubstFont()->m_Weight
/ 16) << 15) + | 1525 key = (void*)(uintptr_t)(glyph_index + ((pFont->GetSubstFont()->m_Weight
/ 16) << 15) + |
| 1526 ((pFont->GetSubstFont()->m_ItalicAngle / 2
) << 21) + ((dest_width / 16) << 25) + | 1526 ((pFont->GetSubstFont()->m_ItalicAngle / 2
) << 21) + ((dest_width / 16) << 25) + |
| 1527 (pFont->IsVertical() << 31)); | 1527 (pFont->IsVertical() << 31)); |
| 1528 else { | 1528 else { |
| 1529 key = (void*)(uintptr_t)glyph_index; | 1529 key = (void*)(uintptr_t)glyph_index; |
| 1530 } | 1530 } |
| 1531 if (m_PathMap.Lookup(key, (void*&)pGlyphPath)) { | 1531 if (m_PathMap.Lookup(key, (void*&)pGlyphPath)) { |
| 1532 return pGlyphPath; | 1532 return pGlyphPath; |
| 1533 } | 1533 } |
| 1534 pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width); | 1534 pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width); |
| 1535 m_PathMap.SetAt(key, pGlyphPath); | 1535 m_PathMap.SetAt(key, pGlyphPath); |
| 1536 return pGlyphPath; | 1536 return pGlyphPath; |
| 1537 } | 1537 } |
| 1538 typedef struct { | 1538 typedef struct { |
| 1539 FX_BOOL» » » m_bCount; | 1539 bool» » » m_bCount; |
| 1540 int m_PointCount; | 1540 int m_PointCount; |
| 1541 FX_PATHPOINT* m_pPoints; | 1541 FX_PATHPOINT* m_pPoints; |
| 1542 int m_CurX; | 1542 int m_CurX; |
| 1543 int m_CurY; | 1543 int m_CurY; |
| 1544 FX_FLOAT m_CoordUnit; | 1544 FX_FLOAT m_CoordUnit; |
| 1545 } OUTLINE_PARAMS; | 1545 } OUTLINE_PARAMS; |
| 1546 void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param) | 1546 void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param) |
| 1547 { | 1547 { |
| 1548 if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_
Flag == FXPT_MOVETO && | 1548 if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_
Flag == FXPT_MOVETO && |
| 1549 param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoin
ts[param->m_PointCount - 1].m_PointX && | 1549 param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoin
ts[param->m_PointCount - 1].m_PointX && |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1680 FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level); | 1680 FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level); |
| 1681 } | 1681 } |
| 1682 FXFT_Outline_Funcs funcs; | 1682 FXFT_Outline_Funcs funcs; |
| 1683 funcs.move_to = _Outline_MoveTo; | 1683 funcs.move_to = _Outline_MoveTo; |
| 1684 funcs.line_to = _Outline_LineTo; | 1684 funcs.line_to = _Outline_LineTo; |
| 1685 funcs.conic_to = _Outline_ConicTo; | 1685 funcs.conic_to = _Outline_ConicTo; |
| 1686 funcs.cubic_to = _Outline_CubicTo; | 1686 funcs.cubic_to = _Outline_CubicTo; |
| 1687 funcs.shift = 0; | 1687 funcs.shift = 0; |
| 1688 funcs.delta = 0; | 1688 funcs.delta = 0; |
| 1689 OUTLINE_PARAMS params; | 1689 OUTLINE_PARAMS params; |
| 1690 params.m_bCount = TRUE; | 1690 params.m_bCount = true; |
| 1691 params.m_PointCount = 0; | 1691 params.m_PointCount = 0; |
| 1692 FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, ¶ms); | 1692 FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, ¶ms); |
| 1693 if (params.m_PointCount == 0) { | 1693 if (params.m_PointCount == 0) { |
| 1694 return NULL; | 1694 return NULL; |
| 1695 } | 1695 } |
| 1696 CFX_PathData* pPath = new CFX_PathData; | 1696 CFX_PathData* pPath = new CFX_PathData; |
| 1697 pPath->SetPointCount(params.m_PointCount); | 1697 pPath->SetPointCount(params.m_PointCount); |
| 1698 params.m_bCount = FALSE; | 1698 params.m_bCount = false; |
| 1699 params.m_PointCount = 0; | 1699 params.m_PointCount = 0; |
| 1700 params.m_pPoints = pPath->GetPoints(); | 1700 params.m_pPoints = pPath->GetPoints(); |
| 1701 params.m_CurX = params.m_CurY = 0; | 1701 params.m_CurX = params.m_CurY = 0; |
| 1702 params.m_CoordUnit = 64 * 64.0; | 1702 params.m_CoordUnit = 64 * 64.0; |
| 1703 FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, ¶ms); | 1703 FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, ¶ms); |
| 1704 _Outline_CheckEmptyContour(¶ms); | 1704 _Outline_CheckEmptyContour(¶ms); |
| 1705 pPath->TrimPoints(params.m_PointCount); | 1705 pPath->TrimPoints(params.m_PointCount); |
| 1706 if (params.m_PointCount) { | 1706 if (params.m_PointCount) { |
| 1707 pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE; | 1707 pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE; |
| 1708 } | 1708 } |
| 1709 return pPath; | 1709 return pPath; |
| 1710 } | 1710 } |
| 1711 void _CFX_UniqueKeyGen::Generate(int count, ...) | 1711 void _CFX_UniqueKeyGen::Generate(int count, ...) |
| 1712 { | 1712 { |
| 1713 va_list argList; | 1713 va_list argList; |
| 1714 va_start(argList, count); | 1714 va_start(argList, count); |
| 1715 for (int i = 0; i < count; i ++) { | 1715 for (int i = 0; i < count; i ++) { |
| 1716 int p = va_arg(argList, int); | 1716 int p = va_arg(argList, int); |
| 1717 ((FX_DWORD*)m_Key)[i] = p; | 1717 ((FX_DWORD*)m_Key)[i] = p; |
| 1718 } | 1718 } |
| 1719 va_end(argList); | 1719 va_end(argList); |
| 1720 m_KeyLen = count * sizeof(FX_DWORD); | 1720 m_KeyLen = count * sizeof(FX_DWORD); |
| 1721 } | 1721 } |
| OLD | NEW |