| OLD | NEW |
| 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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 | 248 |
| 249 static LogFontTypeface* Create(const LOGFONT& lf) { | 249 static LogFontTypeface* Create(const LOGFONT& lf) { |
| 250 return new LogFontTypeface(get_style(lf), lf, false); | 250 return new LogFontTypeface(get_style(lf), lf, false); |
| 251 } | 251 } |
| 252 | 252 |
| 253 static void EnsureAccessible(const SkTypeface* face) { | 253 static void EnsureAccessible(const SkTypeface* face) { |
| 254 call_ensure_accessible(static_cast<const LogFontTypeface*>(face)->fLogFo
nt); | 254 call_ensure_accessible(static_cast<const LogFontTypeface*>(face)->fLogFo
nt); |
| 255 } | 255 } |
| 256 | 256 |
| 257 protected: | 257 protected: |
| 258 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; | 258 SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; |
| 259 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; | 259 SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK_OVERRID
E; |
| 260 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 260 void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
| 261 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 261 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
| 262 SkAdvancedTypefaceMetrics::PerGlyphInfo, | 262 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
| 263 const uint32_t*, uint32_t) const SK_OVERRIDE; | 263 const uint32_t*, uint32_t) const SK_OVERRIDE; |
| 264 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE
; | 264 void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE; |
| 265 virtual int onCharsToGlyphs(const void* chars, Encoding encoding, | 265 virtual int onCharsToGlyphs(const void* chars, Encoding encoding, |
| 266 uint16_t glyphs[], int glyphCount) const SK_OVER
RIDE; | 266 uint16_t glyphs[], int glyphCount) const SK_OVER
RIDE; |
| 267 virtual int onCountGlyphs() const SK_OVERRIDE; | 267 int onCountGlyphs() const SK_OVERRIDE; |
| 268 virtual int onGetUPEM() const SK_OVERRIDE; | 268 int onGetUPEM() const SK_OVERRIDE; |
| 269 virtual void onGetFamilyName(SkString* familyName) const SK_OVERRIDE; | 269 void onGetFamilyName(SkString* familyName) const SK_OVERRIDE; |
| 270 virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_
OVERRIDE; | 270 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_OVERRIDE
; |
| 271 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; | 271 int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; |
| 272 virtual size_t onGetTableData(SkFontTableTag, size_t offset, | 272 virtual size_t onGetTableData(SkFontTableTag, size_t offset, |
| 273 size_t length, void* data) const SK_OVERRIDE; | 273 size_t length, void* data) const SK_OVERRIDE; |
| 274 }; | 274 }; |
| 275 | 275 |
| 276 class FontMemResourceTypeface : public LogFontTypeface { | 276 class FontMemResourceTypeface : public LogFontTypeface { |
| 277 public: | 277 public: |
| 278 /** | 278 /** |
| 279 * The created FontMemResourceTypeface takes ownership of fontMemResource. | 279 * The created FontMemResourceTypeface takes ownership of fontMemResource. |
| 280 */ | 280 */ |
| 281 static FontMemResourceTypeface* Create(const LOGFONT& lf, HANDLE fontMemReso
urce) { | 281 static FontMemResourceTypeface* Create(const LOGFONT& lf, HANDLE fontMemReso
urce) { |
| 282 return new FontMemResourceTypeface(get_style(lf), lf, fontMemResource); | 282 return new FontMemResourceTypeface(get_style(lf), lf, fontMemResource); |
| 283 } | 283 } |
| 284 | 284 |
| 285 protected: | 285 protected: |
| 286 virtual void weak_dispose() const SK_OVERRIDE { | 286 void weak_dispose() const SK_OVERRIDE { |
| 287 RemoveFontMemResourceEx(fFontMemResource); | 287 RemoveFontMemResourceEx(fFontMemResource); |
| 288 //SkTypefaceCache::Remove(this); | 288 //SkTypefaceCache::Remove(this); |
| 289 INHERITED::weak_dispose(); | 289 INHERITED::weak_dispose(); |
| 290 } | 290 } |
| 291 | 291 |
| 292 private: | 292 private: |
| 293 /** | 293 /** |
| 294 * Takes ownership of fontMemResource. | 294 * Takes ownership of fontMemResource. |
| 295 */ | 295 */ |
| 296 FontMemResourceTypeface(const SkFontStyle& style, const LOGFONT& lf, HANDLE
fontMemResource) | 296 FontMemResourceTypeface(const SkFontStyle& style, const LOGFONT& lf, HANDLE
fontMemResource) |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 class SkScalerContext_GDI : public SkScalerContext { | 534 class SkScalerContext_GDI : public SkScalerContext { |
| 535 public: | 535 public: |
| 536 SkScalerContext_GDI(SkTypeface*, const SkDescriptor* desc); | 536 SkScalerContext_GDI(SkTypeface*, const SkDescriptor* desc); |
| 537 virtual ~SkScalerContext_GDI(); | 537 virtual ~SkScalerContext_GDI(); |
| 538 | 538 |
| 539 // Returns true if the constructor was able to complete all of its | 539 // Returns true if the constructor was able to complete all of its |
| 540 // initializations (which may include calling GDI). | 540 // initializations (which may include calling GDI). |
| 541 bool isValid() const; | 541 bool isValid() const; |
| 542 | 542 |
| 543 protected: | 543 protected: |
| 544 virtual unsigned generateGlyphCount() SK_OVERRIDE; | 544 unsigned generateGlyphCount() SK_OVERRIDE; |
| 545 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; | 545 uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; |
| 546 virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; | 546 void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; |
| 547 virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; | 547 void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; |
| 548 virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; | 548 void generateImage(const SkGlyph& glyph) SK_OVERRIDE; |
| 549 virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; | 549 void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; |
| 550 virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; | 550 void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; |
| 551 | 551 |
| 552 private: | 552 private: |
| 553 DWORD getGDIGlyphPath(const SkGlyph& glyph, UINT flags, | 553 DWORD getGDIGlyphPath(const SkGlyph& glyph, UINT flags, |
| 554 SkAutoSTMalloc<BUFFERSIZE, uint8_t>* glyphbuf); | 554 SkAutoSTMalloc<BUFFERSIZE, uint8_t>* glyphbuf); |
| 555 | 555 |
| 556 HDCOffscreen fOffscreen; | 556 HDCOffscreen fOffscreen; |
| 557 /** fGsA is the non-rotational part of total matrix without the text height
scale. | 557 /** fGsA is the non-rotational part of total matrix without the text height
scale. |
| 558 * Used to find the magnitude of advances. | 558 * Used to find the magnitude of advances. |
| 559 */ | 559 */ |
| 560 MAT2 fGsA; | 560 MAT2 fGsA; |
| (...skipping 1821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2382 LOGFONT lf; | 2382 LOGFONT lf; |
| 2383 sk_bzero(&lf, sizeof(lf)); | 2383 sk_bzero(&lf, sizeof(lf)); |
| 2384 lf.lfCharSet = DEFAULT_CHARSET; | 2384 lf.lfCharSet = DEFAULT_CHARSET; |
| 2385 _tcscpy_s(lf.lfFaceName, familyName); | 2385 _tcscpy_s(lf.lfFaceName, familyName); |
| 2386 | 2386 |
| 2387 HDC hdc = ::CreateCompatibleDC(NULL); | 2387 HDC hdc = ::CreateCompatibleDC(NULL); |
| 2388 ::EnumFontFamiliesEx(hdc, &lf, enum_family_proc, (LPARAM)&fArray, 0); | 2388 ::EnumFontFamiliesEx(hdc, &lf, enum_family_proc, (LPARAM)&fArray, 0); |
| 2389 ::DeleteDC(hdc); | 2389 ::DeleteDC(hdc); |
| 2390 } | 2390 } |
| 2391 | 2391 |
| 2392 virtual int count() SK_OVERRIDE { | 2392 int count() SK_OVERRIDE { |
| 2393 return fArray.count(); | 2393 return fArray.count(); |
| 2394 } | 2394 } |
| 2395 | 2395 |
| 2396 virtual void getStyle(int index, SkFontStyle* fs, SkString* styleName) SK_OV
ERRIDE { | 2396 void getStyle(int index, SkFontStyle* fs, SkString* styleName) SK_OVERRIDE { |
| 2397 if (fs) { | 2397 if (fs) { |
| 2398 *fs = get_style(fArray[index].elfLogFont); | 2398 *fs = get_style(fArray[index].elfLogFont); |
| 2399 } | 2399 } |
| 2400 if (styleName) { | 2400 if (styleName) { |
| 2401 const ENUMLOGFONTEX& ref = fArray[index]; | 2401 const ENUMLOGFONTEX& ref = fArray[index]; |
| 2402 // For some reason, ENUMLOGFONTEX and LOGFONT disagree on their type
in the | 2402 // For some reason, ENUMLOGFONTEX and LOGFONT disagree on their type
in the |
| 2403 // non-unicode version. | 2403 // non-unicode version. |
| 2404 // ENUMLOGFONTEX uses BYTE | 2404 // ENUMLOGFONTEX uses BYTE |
| 2405 // LOGFONT uses CHAR | 2405 // LOGFONT uses CHAR |
| 2406 // Here we assert they that the style name is logically the same (si
ze) as | 2406 // Here we assert they that the style name is logically the same (si
ze) as |
| 2407 // a TCHAR, so we can use the same converter function. | 2407 // a TCHAR, so we can use the same converter function. |
| 2408 SkASSERT(sizeof(TCHAR) == sizeof(ref.elfStyle[0])); | 2408 SkASSERT(sizeof(TCHAR) == sizeof(ref.elfStyle[0])); |
| 2409 tchar_to_skstring((const TCHAR*)ref.elfStyle, styleName); | 2409 tchar_to_skstring((const TCHAR*)ref.elfStyle, styleName); |
| 2410 } | 2410 } |
| 2411 } | 2411 } |
| 2412 | 2412 |
| 2413 virtual SkTypeface* createTypeface(int index) SK_OVERRIDE { | 2413 SkTypeface* createTypeface(int index) SK_OVERRIDE { |
| 2414 return SkCreateTypefaceFromLOGFONT(fArray[index].elfLogFont); | 2414 return SkCreateTypefaceFromLOGFONT(fArray[index].elfLogFont); |
| 2415 } | 2415 } |
| 2416 | 2416 |
| 2417 virtual SkTypeface* matchStyle(const SkFontStyle& pattern) SK_OVERRIDE { | 2417 SkTypeface* matchStyle(const SkFontStyle& pattern) SK_OVERRIDE { |
| 2418 // todo: | 2418 // todo: |
| 2419 return SkCreateTypefaceFromLOGFONT(fArray[0].elfLogFont); | 2419 return SkCreateTypefaceFromLOGFONT(fArray[0].elfLogFont); |
| 2420 } | 2420 } |
| 2421 | 2421 |
| 2422 private: | 2422 private: |
| 2423 SkTDArray<ENUMLOGFONTEX> fArray; | 2423 SkTDArray<ENUMLOGFONTEX> fArray; |
| 2424 }; | 2424 }; |
| 2425 | 2425 |
| 2426 class SkFontMgrGDI : public SkFontMgr { | 2426 class SkFontMgrGDI : public SkFontMgr { |
| 2427 public: | 2427 public: |
| 2428 SkFontMgrGDI() { | 2428 SkFontMgrGDI() { |
| 2429 LOGFONT lf; | 2429 LOGFONT lf; |
| 2430 sk_bzero(&lf, sizeof(lf)); | 2430 sk_bzero(&lf, sizeof(lf)); |
| 2431 lf.lfCharSet = DEFAULT_CHARSET; | 2431 lf.lfCharSet = DEFAULT_CHARSET; |
| 2432 | 2432 |
| 2433 HDC hdc = ::CreateCompatibleDC(NULL); | 2433 HDC hdc = ::CreateCompatibleDC(NULL); |
| 2434 ::EnumFontFamiliesEx(hdc, &lf, enum_family_proc, (LPARAM)&fLogFontArray,
0); | 2434 ::EnumFontFamiliesEx(hdc, &lf, enum_family_proc, (LPARAM)&fLogFontArray,
0); |
| 2435 ::DeleteDC(hdc); | 2435 ::DeleteDC(hdc); |
| 2436 } | 2436 } |
| 2437 | 2437 |
| 2438 protected: | 2438 protected: |
| 2439 virtual int onCountFamilies() const SK_OVERRIDE { | 2439 int onCountFamilies() const SK_OVERRIDE { |
| 2440 return fLogFontArray.count(); | 2440 return fLogFontArray.count(); |
| 2441 } | 2441 } |
| 2442 | 2442 |
| 2443 virtual void onGetFamilyName(int index, SkString* familyName) const SK_OVERR
IDE { | 2443 void onGetFamilyName(int index, SkString* familyName) const SK_OVERRIDE { |
| 2444 SkASSERT((unsigned)index < (unsigned)fLogFontArray.count()); | 2444 SkASSERT((unsigned)index < (unsigned)fLogFontArray.count()); |
| 2445 tchar_to_skstring(fLogFontArray[index].elfLogFont.lfFaceName, familyName
); | 2445 tchar_to_skstring(fLogFontArray[index].elfLogFont.lfFaceName, familyName
); |
| 2446 } | 2446 } |
| 2447 | 2447 |
| 2448 virtual SkFontStyleSet* onCreateStyleSet(int index) const SK_OVERRIDE { | 2448 SkFontStyleSet* onCreateStyleSet(int index) const SK_OVERRIDE { |
| 2449 SkASSERT((unsigned)index < (unsigned)fLogFontArray.count()); | 2449 SkASSERT((unsigned)index < (unsigned)fLogFontArray.count()); |
| 2450 return SkNEW_ARGS(SkFontStyleSetGDI, (fLogFontArray[index].elfLogFont.lf
FaceName)); | 2450 return SkNEW_ARGS(SkFontStyleSetGDI, (fLogFontArray[index].elfLogFont.lf
FaceName)); |
| 2451 } | 2451 } |
| 2452 | 2452 |
| 2453 virtual SkFontStyleSet* onMatchFamily(const char familyName[]) const SK_OVER
RIDE { | 2453 SkFontStyleSet* onMatchFamily(const char familyName[]) const SK_OVERRIDE { |
| 2454 if (NULL == familyName) { | 2454 if (NULL == familyName) { |
| 2455 familyName = ""; // do we need this check??? | 2455 familyName = ""; // do we need this check??? |
| 2456 } | 2456 } |
| 2457 LOGFONT lf; | 2457 LOGFONT lf; |
| 2458 logfont_for_name(familyName, &lf); | 2458 logfont_for_name(familyName, &lf); |
| 2459 return SkNEW_ARGS(SkFontStyleSetGDI, (lf.lfFaceName)); | 2459 return SkNEW_ARGS(SkFontStyleSetGDI, (lf.lfFaceName)); |
| 2460 } | 2460 } |
| 2461 | 2461 |
| 2462 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], | 2462 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], |
| 2463 const SkFontStyle& fontstyle) const S
K_OVERRIDE { | 2463 const SkFontStyle& fontstyle) const S
K_OVERRIDE { |
| 2464 // could be in base impl | 2464 // could be in base impl |
| 2465 SkAutoTUnref<SkFontStyleSet> sset(this->matchFamily(familyName)); | 2465 SkAutoTUnref<SkFontStyleSet> sset(this->matchFamily(familyName)); |
| 2466 return sset->matchStyle(fontstyle); | 2466 return sset->matchStyle(fontstyle); |
| 2467 } | 2467 } |
| 2468 | 2468 |
| 2469 virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], con
st SkFontStyle&, | 2469 virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], con
st SkFontStyle&, |
| 2470 const char* bcp47[], int bcp
47Count, | 2470 const char* bcp47[], int bcp
47Count, |
| 2471 SkUnichar character) const S
K_OVERRIDE { | 2471 SkUnichar character) const S
K_OVERRIDE { |
| 2472 return NULL; | 2472 return NULL; |
| 2473 } | 2473 } |
| 2474 | 2474 |
| 2475 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, | 2475 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, |
| 2476 const SkFontStyle& fontstyle) const SK_
OVERRIDE { | 2476 const SkFontStyle& fontstyle) const SK_
OVERRIDE { |
| 2477 // could be in base impl | 2477 // could be in base impl |
| 2478 SkString familyName; | 2478 SkString familyName; |
| 2479 ((LogFontTypeface*)familyMember)->getFamilyName(&familyName); | 2479 ((LogFontTypeface*)familyMember)->getFamilyName(&familyName); |
| 2480 return this->matchFamilyStyle(familyName.c_str(), fontstyle); | 2480 return this->matchFamilyStyle(familyName.c_str(), fontstyle); |
| 2481 } | 2481 } |
| 2482 | 2482 |
| 2483 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const
SK_OVERRIDE { | 2483 SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const SK_OVER
RIDE { |
| 2484 return create_from_stream(stream); | 2484 return create_from_stream(stream); |
| 2485 } | 2485 } |
| 2486 | 2486 |
| 2487 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const SK_OV
ERRIDE { | 2487 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const SK_OVERRIDE { |
| 2488 // could be in base impl | 2488 // could be in base impl |
| 2489 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); | 2489 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); |
| 2490 return this->createFromStream(stream); | 2490 return this->createFromStream(stream); |
| 2491 } | 2491 } |
| 2492 | 2492 |
| 2493 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const
SK_OVERRIDE { | 2493 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const SK_OVERR
IDE { |
| 2494 // could be in base impl | 2494 // could be in base impl |
| 2495 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 2495 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
| 2496 return this->createFromStream(stream); | 2496 return this->createFromStream(stream); |
| 2497 } | 2497 } |
| 2498 | 2498 |
| 2499 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], | 2499 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], |
| 2500 unsigned styleBits) const SK_OVER
RIDE { | 2500 unsigned styleBits) const SK_OVER
RIDE { |
| 2501 LOGFONT lf; | 2501 LOGFONT lf; |
| 2502 if (NULL == familyName) { | 2502 if (NULL == familyName) { |
| 2503 lf = get_default_font(); | 2503 lf = get_default_font(); |
| 2504 } else { | 2504 } else { |
| 2505 logfont_for_name(familyName, &lf); | 2505 logfont_for_name(familyName, &lf); |
| 2506 } | 2506 } |
| 2507 | 2507 |
| 2508 SkTypeface::Style style = (SkTypeface::Style)styleBits; | 2508 SkTypeface::Style style = (SkTypeface::Style)styleBits; |
| 2509 lf.lfWeight = (style & SkTypeface::kBold) != 0 ? FW_BOLD : FW_NORMAL; | 2509 lf.lfWeight = (style & SkTypeface::kBold) != 0 ? FW_BOLD : FW_NORMAL; |
| 2510 lf.lfItalic = ((style & SkTypeface::kItalic) != 0); | 2510 lf.lfItalic = ((style & SkTypeface::kItalic) != 0); |
| 2511 return SkCreateTypefaceFromLOGFONT(lf); | 2511 return SkCreateTypefaceFromLOGFONT(lf); |
| 2512 } | 2512 } |
| 2513 | 2513 |
| 2514 private: | 2514 private: |
| 2515 SkTDArray<ENUMLOGFONTEX> fLogFontArray; | 2515 SkTDArray<ENUMLOGFONTEX> fLogFontArray; |
| 2516 }; | 2516 }; |
| 2517 | 2517 |
| 2518 /////////////////////////////////////////////////////////////////////////////// | 2518 /////////////////////////////////////////////////////////////////////////////// |
| 2519 | 2519 |
| 2520 SkFontMgr* SkFontMgr_New_GDI() { | 2520 SkFontMgr* SkFontMgr_New_GDI() { |
| 2521 return SkNEW(SkFontMgrGDI); | 2521 return SkNEW(SkFontMgrGDI); |
| 2522 } | 2522 } |
| OLD | NEW |