Index: src/ports/SkFontHost_win.cpp |
=================================================================== |
--- src/ports/SkFontHost_win.cpp (revision 8299) |
+++ src/ports/SkFontHost_win.cpp (working copy) |
@@ -35,6 +35,14 @@ |
gEnsureLOGFONTAccessibleProc = proc; |
} |
+static void call_ensure_accessible(const LOGFONT& lf) { |
+ if (gEnsureLOGFONTAccessibleProc) { |
+ gEnsureLOGFONTAccessibleProc(lf); |
+ } |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
// always packed xxRRGGBB |
typedef uint32_t SkGdiRGB; |
@@ -168,7 +176,7 @@ |
TEXTMETRIC textMetric; |
if (0 == GetTextMetrics(deviceContext, &textMetric)) { |
- SkFontHost::EnsureTypefaceAccessible(*this); |
+ call_ensure_accessible(lf); |
if (0 == GetTextMetrics(deviceContext, &textMetric)) { |
textMetric.tmPitchAndFamily = TMPF_TRUETYPE; |
} |
@@ -197,6 +205,10 @@ |
return new LogFontTypeface(style, fontID, lf); |
} |
+ static void EnsureAccessible(const SkTypeface* face) { |
+ call_ensure_accessible(static_cast<const LogFontTypeface*>(face)->fLogFont); |
+ } |
+ |
protected: |
virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK_OVERRIDE; |
virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
@@ -294,13 +306,6 @@ |
return NULL; |
} |
-static void ensure_typeface_accessible(SkFontID fontID) { |
- LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindByID(fontID)); |
- if (face) { |
- SkFontHost::EnsureTypefaceAccessible(*face); |
- } |
-} |
- |
static void GetLogFontByID(SkFontID fontID, LOGFONT* lf) { |
LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindByID(fontID)); |
if (face) { |
@@ -562,20 +567,25 @@ |
} |
} |
-SkScalerContext_Windows::SkScalerContext_Windows(SkTypeface* typeface, |
+SkScalerContext_Windows::SkScalerContext_Windows(SkTypeface* rawTypeface, |
const SkDescriptor* desc) |
- : SkScalerContext(typeface, desc), fDDC(0), fFont(0), fSavefont(0), fSC(0) |
+ : SkScalerContext(rawTypeface, desc) |
+ , fDDC(0) |
+ , fFont(0) |
+ , fSavefont(0) |
+ , fSC(0) |
, fGlyphCount(-1) { |
SkAutoMutexAcquire ac(gFTMutex); |
+ LogFontTypeface* typeface = reinterpret_cast<LogFontTypeface*>(rawTypeface); |
+ |
fDDC = ::CreateCompatibleDC(NULL); |
SetGraphicsMode(fDDC, GM_ADVANCED); |
SetBkMode(fDDC, TRANSPARENT); |
// Scaling by the DPI is inconsistent with how Skia draws elsewhere |
//SkScalar height = -(fRec.fTextSize * GetDeviceCaps(ddc, LOGPIXELSY) / 72); |
- LOGFONT lf; |
- GetLogFontByID(fRec.fFontID, &lf); |
+ LOGFONT lf = typeface->fLogFont; |
lf.lfHeight = -gCanonicalTextSize; |
lf.lfQuality = compute_quality(fRec); |
fFont = CreateFontIndirect(&lf); |
@@ -597,7 +607,7 @@ |
fSavefont = (HFONT)SelectObject(fDDC, fFont); |
if (0 == GetTextMetrics(fDDC, &fTM)) { |
- ensure_typeface_accessible(fRec.fFontID); |
+ call_ensure_accessible(lf); |
if (0 == GetTextMetrics(fDDC, &fTM)) { |
fTM.tmPitchAndFamily = TMPF_TRUETYPE; |
} |
@@ -664,7 +674,7 @@ |
fFont = bitmapFont; |
if (0 == GetTextMetrics(fDDC, &fTM)) { |
- ensure_typeface_accessible(fRec.fFontID); |
+ call_ensure_accessible(lf); |
//if the following fails, we'll just draw at gCanonicalTextSize. |
GetTextMetrics(fDDC, &fTM); |
} |
@@ -760,7 +770,7 @@ |
DWORD status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &fMat22); |
if (GDI_ERROR == status) { |
- ensure_typeface_accessible(fRec.fFontID); |
+ LogFontTypeface::EnsureAccessible(this->getTypeface()); |
status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &fMat22); |
if (GDI_ERROR == status) { |
glyph->zeroMetrics(); |
@@ -845,7 +855,7 @@ |
uint32_t ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
if (GDI_ERROR == ret) { |
- ensure_typeface_accessible(fRec.fFontID); |
+ LogFontTypeface::EnsureAccessible(this->getTypeface()); |
ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
} |
if (sizeof(otm) != ret) { |
@@ -1088,7 +1098,7 @@ |
size_t srcRB; |
const void* bits = fOffscreen.draw(glyph, isBW, &srcRB); |
if (NULL == bits) { |
- ensure_typeface_accessible(fRec.fFontID); |
+ LogFontTypeface::EnsureAccessible(this->getTypeface()); |
bits = fOffscreen.draw(glyph, isBW, &srcRB); |
if (NULL == bits) { |
sk_bzero(glyph.fImage, glyph.computeImageSize()); |
@@ -1181,7 +1191,7 @@ |
GLYPHMETRICS gm; |
uint32_t total_size = GetGlyphOutlineW(fDDC, glyph.fID, GGO_NATIVE | GGO_GLYPH_INDEX, &gm, BUFFERSIZE, glyphbuf, &fMat22); |
if (GDI_ERROR == total_size) { |
- ensure_typeface_accessible(fRec.fFontID); |
+ LogFontTypeface::EnsureAccessible(this->getTypeface()); |
total_size = GetGlyphOutlineW(fDDC, glyph.fID, GGO_NATIVE | GGO_GLYPH_INDEX, &gm, BUFFERSIZE, glyphbuf, &fMat22); |
if (GDI_ERROR == total_size) { |
SkASSERT(false); |
@@ -1280,7 +1290,7 @@ |
int fontNameLen; //length of fontName in TCHARS. |
if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { |
- SkFontHost::EnsureTypefaceAccessible(*rawFace); |
+ LogFontTypeface::EnsureAccessible(rawFace); |
if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { |
fontNameLen = 0; |
} |
@@ -1288,7 +1298,7 @@ |
SkAutoSTArray<LF_FULLFACESIZE, TCHAR> fontName(fontNameLen+1); |
if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { |
- SkFontHost::EnsureTypefaceAccessible(*rawFace); |
+ LogFontTypeface::EnsureAccessible(rawFace); |
if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { |
fontName[0] = 0; |
} |
@@ -1371,7 +1381,7 @@ |
OUTLINETEXTMETRIC otm; |
unsigned int otmRet = GetOutlineTextMetrics(hdc, sizeof(otm), &otm); |
if (0 == otmRet) { |
- ensure_typeface_accessible(this->uniqueID()); |
+ call_ensure_accessible(lf); |
otmRet = GetOutlineTextMetrics(hdc, sizeof(otm), &otm); |
} |
if (!otmRet || !GetTextFace(hdc, LF_FACESIZE, lf.lfFaceName)) { |
@@ -1593,7 +1603,7 @@ |
for (int i = 0; i < SK_ARRAY_COUNT(tables); i++) { |
size_t bufferSize = GetFontData(hdc, tables[i], 0, NULL, 0); |
if (bufferSize == GDI_ERROR) { |
- ensure_typeface_accessible(uniqueID); |
+ call_ensure_accessible(lf); |
bufferSize = GetFontData(hdc, tables[i], 0, NULL, 0); |
} |
if (bufferSize != GDI_ERROR) { |