| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkAdvancedTypefaceMetrics.h" | 8 #include "SkAdvancedTypefaceMetrics.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 // load the font file | 810 // load the font file |
| 811 fStrikeIndex = -1; | 811 fStrikeIndex = -1; |
| 812 fFTSize = NULL; | 812 fFTSize = NULL; |
| 813 fFace = NULL; | 813 fFace = NULL; |
| 814 fFaceRec = ref_ft_face(typeface); | 814 fFaceRec = ref_ft_face(typeface); |
| 815 if (NULL == fFaceRec) { | 815 if (NULL == fFaceRec) { |
| 816 return; | 816 return; |
| 817 } | 817 } |
| 818 fFace = fFaceRec->fFace; | 818 fFace = fFaceRec->fFace; |
| 819 | 819 |
| 820 // A is the total matrix. | 820 fRec.computeMatrices(SkScalerContextRec::kFull_PreMatrixScale, &fScale, &fMa
trix22Scalar); |
| 821 SkMatrix A; | 821 fMatrix22Scalar.setSkewX(-fMatrix22Scalar.getSkewX()); |
| 822 fRec.getSingleMatrix(&A); | 822 fMatrix22Scalar.setSkewY(-fMatrix22Scalar.getSkewY()); |
| 823 | 823 |
| 824 SkScalar sx = A.getScaleX(); | 824 fScaleX = SkScalarToFixed(fScale.fX); |
| 825 SkScalar sy = A.getScaleY(); | 825 fScaleY = SkScalarToFixed(fScale.fY); |
| 826 fMatrix22Scalar.reset(); | |
| 827 | |
| 828 // In GDI, the hinter is aware of the current transformation | |
| 829 // (the transform is in some sense applied before/with the hinting). | |
| 830 // The bytecode can then test if it is rotated or stretched and decide | |
| 831 // to apply instructions or not. | |
| 832 // | |
| 833 // FreeType, however, always does the transformation strictly after hinting. | |
| 834 // It just sets 'rotated' and 'stretched' to false and only applies the | |
| 835 // size before hinting. | |
| 836 // | |
| 837 // Also, FreeType respects the head::flags::IntegerScaling flag, | |
| 838 // (although this is patched out on most major distros) | |
| 839 // so it is critical to get the size correct on the request. | |
| 840 // | |
| 841 // This also gets us the actual closest size on bitmap fonts as well. | |
| 842 if (A.getSkewX() || A.getSkewY() || sx < 0 || sy < 0) { | |
| 843 // h is where A maps the horizontal baseline. | |
| 844 SkPoint h = SkPoint::Make(SK_Scalar1, 0); | |
| 845 A.mapPoints(&h, 1); | |
| 846 | |
| 847 // G is the Givens Matrix for A (rotational matrix where GA[0][1] == 0). | |
| 848 SkMatrix G; | |
| 849 SkComputeGivensRotation(h, &G); | |
| 850 | |
| 851 // GA is the matrix A with rotation removed. | |
| 852 SkMatrix GA(G); | |
| 853 GA.preConcat(A); | |
| 854 | |
| 855 sx = SkScalarAbs(GA.get(SkMatrix::kMScaleX)); | |
| 856 sy = SkScalarAbs(GA.get(SkMatrix::kMScaleY)); | |
| 857 | |
| 858 // sA is the total matrix A without the text scale. | |
| 859 SkMatrix sA(A); | |
| 860 sA.preScale(SkScalarInvert(sx), SkScalarInvert(sy)); //remove text size | |
| 861 | |
| 862 fMatrix22Scalar.setScaleX(sA.getScaleX()); | |
| 863 fMatrix22Scalar.setSkewX(-sA.getSkewX()); | |
| 864 fMatrix22Scalar.setSkewY(-sA.getSkewY()); | |
| 865 fMatrix22Scalar.setScaleY(sA.getScaleY()); | |
| 866 } | |
| 867 fScale.set(sx, sy); | |
| 868 fScaleX = SkScalarToFixed(sx); | |
| 869 fScaleY = SkScalarToFixed(sy); | |
| 870 fMatrix22.xx = SkScalarToFixed(fMatrix22Scalar.getScaleX()); | 826 fMatrix22.xx = SkScalarToFixed(fMatrix22Scalar.getScaleX()); |
| 871 fMatrix22.xy = SkScalarToFixed(fMatrix22Scalar.getSkewX()); | 827 fMatrix22.xy = SkScalarToFixed(fMatrix22Scalar.getSkewX()); |
| 872 fMatrix22.yx = SkScalarToFixed(fMatrix22Scalar.getSkewY()); | 828 fMatrix22.yx = SkScalarToFixed(fMatrix22Scalar.getSkewY()); |
| 873 fMatrix22.yy = SkScalarToFixed(fMatrix22Scalar.getScaleY()); | 829 fMatrix22.yy = SkScalarToFixed(fMatrix22Scalar.getScaleY()); |
| 874 | 830 |
| 875 fLCDIsVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Flag); | 831 fLCDIsVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Flag); |
| 876 | 832 |
| 877 // compute the flags we send to Load_Glyph | 833 // compute the flags we send to Load_Glyph |
| 878 bool linearMetrics = SkToBool(fRec.fFlags & SkScalerContext::kSubpixelPositi
oning_Flag); | 834 bool linearMetrics = SkToBool(fRec.fFlags & SkScalerContext::kSubpixelPositi
oning_Flag); |
| 879 { | 835 { |
| (...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 if (style) { | 1703 if (style) { |
| 1748 *style = SkFontStyle(weight, width, slant); | 1704 *style = SkFontStyle(weight, width, slant); |
| 1749 } | 1705 } |
| 1750 if (isFixedPitch) { | 1706 if (isFixedPitch) { |
| 1751 *isFixedPitch = FT_IS_FIXED_WIDTH(face); | 1707 *isFixedPitch = FT_IS_FIXED_WIDTH(face); |
| 1752 } | 1708 } |
| 1753 | 1709 |
| 1754 FT_Done_Face(face); | 1710 FT_Done_Face(face); |
| 1755 return true; | 1711 return true; |
| 1756 } | 1712 } |
| OLD | NEW |