| 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 "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 if (!gLCDSupportValid) { | 152 if (!gLCDSupportValid) { |
| 153 InitFreetype(); | 153 InitFreetype(); |
| 154 FT_Done_FreeType(gFTLibrary); | 154 FT_Done_FreeType(gFTLibrary); |
| 155 } | 155 } |
| 156 } | 156 } |
| 157 return gLCDSupport; | 157 return gLCDSupport; |
| 158 } | 158 } |
| 159 | 159 |
| 160 class SkScalerContext_FreeType : public SkScalerContext_FreeType_Base { | 160 class SkScalerContext_FreeType : public SkScalerContext_FreeType_Base { |
| 161 public: | 161 public: |
| 162 SkScalerContext_FreeType(const SkDescriptor* desc); | 162 SkScalerContext_FreeType(SkTypeface*, const SkDescriptor* desc); |
| 163 virtual ~SkScalerContext_FreeType(); | 163 virtual ~SkScalerContext_FreeType(); |
| 164 | 164 |
| 165 bool success() const { | 165 bool success() const { |
| 166 return fFaceRec != NULL && | 166 return fFaceRec != NULL && |
| 167 fFTSize != NULL && | 167 fFTSize != NULL && |
| 168 fFace != NULL; | 168 fFace != NULL; |
| 169 } | 169 } |
| 170 | 170 |
| 171 protected: | 171 protected: |
| 172 virtual unsigned generateGlyphCount() SK_OVERRIDE; | 172 virtual unsigned generateGlyphCount() SK_OVERRIDE; |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 return 0 == a && 0 == b; | 643 return 0 == a && 0 == b; |
| 644 } | 644 } |
| 645 | 645 |
| 646 // returns false if there is any non-90-rotation or skew | 646 // returns false if there is any non-90-rotation or skew |
| 647 static bool isAxisAligned(const SkScalerContext::Rec& rec) { | 647 static bool isAxisAligned(const SkScalerContext::Rec& rec) { |
| 648 return 0 == rec.fPreSkewX && | 648 return 0 == rec.fPreSkewX && |
| 649 (bothZero(rec.fPost2x2[0][1], rec.fPost2x2[1][0]) || | 649 (bothZero(rec.fPost2x2[0][1], rec.fPost2x2[1][0]) || |
| 650 bothZero(rec.fPost2x2[0][0], rec.fPost2x2[1][1])); | 650 bothZero(rec.fPost2x2[0][0], rec.fPost2x2[1][1])); |
| 651 } | 651 } |
| 652 | 652 |
| 653 void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface*) { | 653 SkScalerContext* SkTypeface_FreeType::onCreateScalerContext( |
| 654 const SkDescriptor* desc) const { |
| 655 SkScalerContext_FreeType* c = SkNEW_ARGS(SkScalerContext_FreeType, |
| 656 (const_cast<SkTypeface_FreeType*>(this), |
| 657 desc)); |
| 658 if (!c->success()) { |
| 659 SkDELETE(c); |
| 660 c = NULL; |
| 661 } |
| 662 return c; |
| 663 } |
| 664 |
| 665 void SkTypeface_FreeType::onFilterRec(SkScalerContextRec* rec) const { |
| 654 //BOGUS: http://code.google.com/p/chromium/issues/detail?id=121119 | 666 //BOGUS: http://code.google.com/p/chromium/issues/detail?id=121119 |
| 655 //Cap the requested size as larger sizes give bogus values. | 667 //Cap the requested size as larger sizes give bogus values. |
| 656 //Remove when http://code.google.com/p/skia/issues/detail?id=554 is fixed. | 668 //Remove when http://code.google.com/p/skia/issues/detail?id=554 is fixed. |
| 657 if (rec->fTextSize > SkIntToScalar(1 << 14)) { | 669 if (rec->fTextSize > SkIntToScalar(1 << 14)) { |
| 658 rec->fTextSize = SkIntToScalar(1 << 14); | 670 rec->fTextSize = SkIntToScalar(1 << 14); |
| 659 } | 671 } |
| 660 | 672 |
| 661 if (!is_lcd_supported() && isLCD(*rec)) { | 673 if (!is_lcd_supported() && isLCD(*rec)) { |
| 662 // If the runtime Freetype library doesn't support LCD mode, we disable | 674 // If the runtime Freetype library doesn't support LCD mode, we disable |
| 663 // it here. | 675 // it here. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 | 715 |
| 704 if (rec != NULL && rec->fFace != NULL) { | 716 if (rec != NULL && rec->fFace != NULL) { |
| 705 unitsPerEm = rec->fFace->units_per_EM; | 717 unitsPerEm = rec->fFace->units_per_EM; |
| 706 unref_ft_face(rec->fFace); | 718 unref_ft_face(rec->fFace); |
| 707 } | 719 } |
| 708 | 720 |
| 709 return (uint32_t)unitsPerEm; | 721 return (uint32_t)unitsPerEm; |
| 710 } | 722 } |
| 711 #endif | 723 #endif |
| 712 | 724 |
| 713 SkScalerContext_FreeType::SkScalerContext_FreeType(const SkDescriptor* desc) | 725 SkScalerContext_FreeType::SkScalerContext_FreeType(SkTypeface* typeface, |
| 714 : SkScalerContext_FreeType_Base(desc) { | 726 const SkDescriptor* desc) |
| 727 : SkScalerContext_FreeType_Base(typeface, desc) { |
| 715 SkAutoMutexAcquire ac(gFTMutex); | 728 SkAutoMutexAcquire ac(gFTMutex); |
| 716 | 729 |
| 717 if (gFTCount == 0) { | 730 if (gFTCount == 0) { |
| 718 if (!InitFreetype()) { | 731 if (!InitFreetype()) { |
| 719 sk_throw(); | 732 sk_throw(); |
| 720 } | 733 } |
| 721 } | 734 } |
| 722 ++gFTCount; | 735 ++gFTCount; |
| 723 | 736 |
| 724 // load the font file | 737 // load the font file |
| (...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1293 my->fAvgCharWidth = pts[5].fY; | 1306 my->fAvgCharWidth = pts[5].fY; |
| 1294 my->fXMin = xmin; | 1307 my->fXMin = xmin; |
| 1295 my->fXMax = xmax; | 1308 my->fXMax = xmax; |
| 1296 my->fXHeight = x_height; | 1309 my->fXHeight = x_height; |
| 1297 } | 1310 } |
| 1298 } | 1311 } |
| 1299 | 1312 |
| 1300 //////////////////////////////////////////////////////////////////////// | 1313 //////////////////////////////////////////////////////////////////////// |
| 1301 //////////////////////////////////////////////////////////////////////// | 1314 //////////////////////////////////////////////////////////////////////// |
| 1302 | 1315 |
| 1303 SkScalerContext* SkFontHost::CreateScalerContext(const SkDescriptor* desc) { | |
| 1304 SkScalerContext_FreeType* c = SkNEW_ARGS(SkScalerContext_FreeType, (desc)); | |
| 1305 if (!c->success()) { | |
| 1306 SkDELETE(c); | |
| 1307 c = NULL; | |
| 1308 } | |
| 1309 return c; | |
| 1310 } | |
| 1311 | |
| 1312 /////////////////////////////////////////////////////////////////////////////// | |
| 1313 | |
| 1314 /* Export this so that other parts of our FonttHost port can make use of our | 1316 /* Export this so that other parts of our FonttHost port can make use of our |
| 1315 ability to extract the name+style from a stream, using FreeType's api. | 1317 ability to extract the name+style from a stream, using FreeType's api. |
| 1316 */ | 1318 */ |
| 1317 bool find_name_and_attributes(SkStream* stream, SkString* name, | 1319 bool find_name_and_attributes(SkStream* stream, SkString* name, |
| 1318 SkTypeface::Style* style, bool* isFixedWidth) { | 1320 SkTypeface::Style* style, bool* isFixedWidth) { |
| 1319 FT_Library library; | 1321 FT_Library library; |
| 1320 if (FT_Init_FreeType(&library)) { | 1322 if (FT_Init_FreeType(&library)) { |
| 1321 return false; | 1323 return false; |
| 1322 } | 1324 } |
| 1323 | 1325 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1363 *style = (SkTypeface::Style) tempStyle; | 1365 *style = (SkTypeface::Style) tempStyle; |
| 1364 } | 1366 } |
| 1365 if (isFixedWidth) { | 1367 if (isFixedWidth) { |
| 1366 *isFixedWidth = FT_IS_FIXED_WIDTH(face); | 1368 *isFixedWidth = FT_IS_FIXED_WIDTH(face); |
| 1367 } | 1369 } |
| 1368 | 1370 |
| 1369 FT_Done_Face(face); | 1371 FT_Done_Face(face); |
| 1370 FT_Done_FreeType(library); | 1372 FT_Done_FreeType(library); |
| 1371 return true; | 1373 return true; |
| 1372 } | 1374 } |
| OLD | NEW |