Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: src/ports/SkFontHost_win.cpp

Issue 12676024: Force all font backends to override onGetFontDescriptor, so we can (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkAdvancedTypefaceMetrics.h" 9 #include "SkAdvancedTypefaceMetrics.h"
10 #include "SkBase64.h" 10 #include "SkBase64.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 call_ensure_accessible(static_cast<const LogFontTypeface*>(face)->fLogFo nt); 209 call_ensure_accessible(static_cast<const LogFontTypeface*>(face)->fLogFo nt);
210 } 210 }
211 211
212 protected: 212 protected:
213 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; 213 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE;
214 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK _OVERRIDE; 214 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK _OVERRIDE;
215 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; 215 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE;
216 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( 216 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics(
217 SkAdvancedTypefaceMetrics::PerGlyphInfo, 217 SkAdvancedTypefaceMetrics::PerGlyphInfo,
218 const uint32_t*, uint32_t) const SK_OVERRIDE; 218 const uint32_t*, uint32_t) const SK_OVERRIDE;
219 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE ;
219 }; 220 };
220 221
221 class FontMemResourceTypeface : public LogFontTypeface { 222 class FontMemResourceTypeface : public LogFontTypeface {
222 public: 223 public:
223 /** 224 /**
224 * Takes ownership of fontMemResource. 225 * Takes ownership of fontMemResource.
225 */ 226 */
226 FontMemResourceTypeface(SkTypeface::Style style, SkFontID fontID, const LOGF ONT& lf, HANDLE fontMemResource) : 227 FontMemResourceTypeface(SkTypeface::Style style, SkFontID fontID, const LOGF ONT& lf, HANDLE fontMemResource) :
227 LogFontTypeface(style, fontID, lf, true), fFontMemResource(fontMemResour ce) { 228 LogFontTypeface(style, fontID, lf, true), fFontMemResource(fontMemResour ce) {
228 } 229 }
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 static void tchar_to_skstring(const TCHAR* t, SkString* s) { 1273 static void tchar_to_skstring(const TCHAR* t, SkString* s) {
1273 #ifdef UNICODE 1274 #ifdef UNICODE
1274 size_t sSize = WideCharToMultiByte(CP_UTF8, 0, t, -1, NULL, 0, NULL, NULL); 1275 size_t sSize = WideCharToMultiByte(CP_UTF8, 0, t, -1, NULL, 0, NULL, NULL);
1275 s->resize(sSize); 1276 s->resize(sSize);
1276 WideCharToMultiByte(CP_UTF8, 0, t, -1, s->writable_str(), sSize, NULL, NULL) ; 1277 WideCharToMultiByte(CP_UTF8, 0, t, -1, s->writable_str(), sSize, NULL, NULL) ;
1277 #else 1278 #else
1278 s->set(t); 1279 s->set(t);
1279 #endif 1280 #endif
1280 } 1281 }
1281 1282
1282 void SkFontHost::Serialize(const SkTypeface* rawFace, SkWStream* stream) { 1283 void LogFontTypeface::onGetFontDescriptor(SkFontDescriptor* desc,
1283 const LogFontTypeface* face = static_cast<const LogFontTypeface*>(rawFace); 1284 bool* isLocalStream) const {
1284 SkFontDescriptor descriptor(face->style());
1285
1286 // Get the actual name of the typeface. The logfont may not know this. 1285 // Get the actual name of the typeface. The logfont may not know this.
1287 HFONT font = CreateFontIndirect(&face->fLogFont); 1286 HFONT font = CreateFontIndirect(&fLogFont);
1288 1287
1289 HDC deviceContext = ::CreateCompatibleDC(NULL); 1288 HDC deviceContext = ::CreateCompatibleDC(NULL);
1290 HFONT savefont = (HFONT)SelectObject(deviceContext, font); 1289 HFONT savefont = (HFONT)SelectObject(deviceContext, font);
1291 1290
1292 int fontNameLen; //length of fontName in TCHARS. 1291 int fontNameLen; //length of fontName in TCHARS.
1293 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { 1292 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) {
1294 LogFontTypeface::EnsureAccessible(rawFace); 1293 call_ensure_accessible(fLogFont);
1295 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { 1294 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) {
1296 fontNameLen = 0; 1295 fontNameLen = 0;
1297 } 1296 }
1298 } 1297 }
1299 1298
1300 SkAutoSTArray<LF_FULLFACESIZE, TCHAR> fontName(fontNameLen+1); 1299 SkAutoSTArray<LF_FULLFACESIZE, TCHAR> fontName(fontNameLen+1);
1301 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { 1300 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) {
1302 LogFontTypeface::EnsureAccessible(rawFace); 1301 call_ensure_accessible(fLogFont);
1303 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { 1302 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) {
1304 fontName[0] = 0; 1303 fontName[0] = 0;
1305 } 1304 }
1306 } 1305 }
1307 1306
1308 if (deviceContext) { 1307 if (deviceContext) {
1309 ::SelectObject(deviceContext, savefont); 1308 ::SelectObject(deviceContext, savefont);
1310 ::DeleteDC(deviceContext); 1309 ::DeleteDC(deviceContext);
1311 } 1310 }
1312 if (font) { 1311 if (font) {
1313 ::DeleteObject(font); 1312 ::DeleteObject(font);
1314 } 1313 }
1315 1314
1316 SkString familyName; 1315 SkString familyName;
1317 tchar_to_skstring(fontName.get(), &familyName); 1316 tchar_to_skstring(fontName.get(), &familyName);
1318 descriptor.setFamilyName(familyName.c_str());
1319 //TODO: FileName and PostScriptName currently unsupported.
1320 1317
1321 descriptor.serialize(stream); 1318 desc->setFamilyName(familyName.c_str());
1322 1319 *isLocalStream = this->fSerializeAsStream;
1323 if (face->fSerializeAsStream) {
1324 // store the entire font in the fontData
1325 SkAutoTUnref<SkStream> fontStream(face->openStream(NULL));
1326 if (fontStream.get()) {
1327 const uint32_t length = fontStream->getLength();
1328 stream->writePackedUInt(length);
1329 stream->writeStream(fontStream, length);
1330 } else {
1331 stream->writePackedUInt(0);
1332 }
1333 } else {
1334 stream->writePackedUInt(0);
1335 }
1336 }
1337
1338 SkTypeface* SkFontHost::Deserialize(SkStream* stream) {
1339 SkFontDescriptor descriptor(stream);
1340
1341 const uint32_t customFontDataLength = stream->readPackedUInt();
1342 if (customFontDataLength > 0) {
1343 // generate a new stream to store the custom typeface
1344 SkAutoTUnref<SkMemoryStream> fontStream(SkNEW_ARGS(SkMemoryStream, (cust omFontDataLength - 1)));
1345 stream->read((void*)fontStream->getMemoryBase(), customFontDataLength - 1);
1346
1347 return CreateTypefaceFromStream(fontStream.get());
1348 }
1349
1350 return SkFontHost::CreateTypeface(NULL, descriptor.getFamilyName(), descript or.getStyle());
1351 } 1320 }
1352 1321
1353 static bool getWidthAdvance(HDC hdc, int gId, int16_t* advance) { 1322 static bool getWidthAdvance(HDC hdc, int gId, int16_t* advance) {
1354 // Initialize the MAT2 structure to the identify transformation matrix. 1323 // Initialize the MAT2 structure to the identify transformation matrix.
1355 static const MAT2 mat2 = {SkScalarToFIXED(1), SkScalarToFIXED(0), 1324 static const MAT2 mat2 = {SkScalarToFIXED(1), SkScalarToFIXED(0),
1356 SkScalarToFIXED(0), SkScalarToFIXED(1)}; 1325 SkScalarToFIXED(0), SkScalarToFIXED(1)};
1357 int flags = GGO_METRICS | GGO_GLYPH_INDEX; 1326 int flags = GGO_METRICS | GGO_GLYPH_INDEX;
1358 GLYPHMETRICS gm; 1327 GLYPHMETRICS gm;
1359 if (GDI_ERROR == GetGlyphOutline(hdc, gId, flags, &gm, 0, NULL, &mat2)) { 1328 if (GDI_ERROR == GetGlyphOutline(hdc, gId, flags, &gm, 0, NULL, &mat2)) {
1360 return false; 1329 return false;
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 if (isLCD(*rec) && !isAxisAligned(*rec)) { 1671 if (isLCD(*rec) && !isAxisAligned(*rec)) {
1703 rec->fMaskFormat = SkMask::kA8_Format; 1672 rec->fMaskFormat = SkMask::kA8_Format;
1704 } 1673 }
1705 #endif 1674 #endif
1706 1675
1707 if (!fCanBeLCD && isLCD(*rec)) { 1676 if (!fCanBeLCD && isLCD(*rec)) {
1708 rec->fMaskFormat = SkMask::kA8_Format; 1677 rec->fMaskFormat = SkMask::kA8_Format;
1709 rec->fFlags &= ~SkScalerContext::kGenA8FromLCD_Flag; 1678 rec->fFlags &= ~SkScalerContext::kGenA8FromLCD_Flag;
1710 } 1679 }
1711 } 1680 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698