OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2014 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #include "SkFont.h" | |
9 #include "SkTypeface.h" | |
10 #include "SkUtils.h" | |
11 | |
12 static SkTypeface* ref_or_default(SkTypeface* face) { | |
13 return face ? SkRef(face) : SkTypeface::RefDefault(); | |
14 } | |
15 | |
16 SkFont::SkFont(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScalar skewX, MaskType mt, | |
17 uint32_t flags) | |
18 : fTypeface(ref_or_default(face)) | |
19 , fSize(size) | |
20 , fScaleX(scaleX) | |
21 , fSkewX(skewX) | |
22 , fFlags(flags) | |
23 , fMaskType(SkToU8(mt)) | |
24 , fPad(0) | |
25 { | |
26 SkASSERT(size > 0); | |
27 SkASSERT(scaleX > 0); | |
28 SkASSERT(SkScalarIsFinite(skewX)); | |
29 SkASSERT(0 == (flags & ~kAllFlags)); | |
30 } | |
31 | |
32 SkFont* SkFont::Create(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScala r skewX, | |
33 MaskType mt, uint32_t flags) { | |
34 if (!(size > 0)) { | |
35 size = 12; | |
36 } | |
37 if (!(scaleX > 0)) { | |
38 scaleX = 1; | |
39 } | |
40 if (!SkScalarIsFinite(skewX)) { | |
41 skewX = 0; | |
42 } | |
43 flags &= kAllFlags; | |
44 return SkNEW_ARGS(SkFont, (face, size, scaleX, skewX, mt, flags)); | |
45 } | |
46 | |
47 SkFont* SkFont::Create(SkTypeface* face, SkScalar size, MaskType mt, uint32_t fl ags) { | |
48 return SkFont::Create(face, size, 1, 0, mt, flags); | |
49 } | |
50 | |
51 SkFont* SkFont::Create(const SkFont& src, SkScalar newSize) { | |
52 return SkFont::Create(src.getTypeface(), newSize, src.getScaleX(), src.getSk ewX(), | |
53 src.getMaskType(), src.getFlags()); | |
54 } | |
55 | |
56 //////////////////////////////////////////////////////////////////////////////// /////////////////// | |
57 | |
58 SkFont::~SkFont() { | |
59 SkSafeUnref(fTypeface); | |
60 } | |
61 | |
62 int SkFont::textToGlyphs(const void* text, size_t byteLength, SkTextEncoding enc oding, | |
63 uint16_t glyphs[], int maxGlyphCount) const { | |
64 if (0 == byteLength) { | |
65 return 0; | |
66 } | |
67 | |
68 SkASSERT(text); | |
69 | |
70 int count; | |
71 switch (encoding) { | |
72 case kUTF8_SkTextEncoding: | |
73 count = SkUTF8_CountUnichars((const char*)text, byteLength); | |
74 case kUTF16_SkTextEncoding: | |
75 count = SkUTF16_CountUnichars((const uint16_t*)text, SkToInt(byteLen gth >> 1)); | |
76 case kUTF32_SkTextEncoding: | |
77 count = SkToInt(byteLength >> 2); | |
78 case kGlyphID_SkTextEncoding: | |
79 count = SkToInt(byteLength >> 1); | |
80 } | |
81 if (NULL == glyphs) { | |
82 return count; | |
83 } | |
84 | |
85 if (kGlyphID_SkTextEncoding == encoding) { | |
86 memcpy(glyphs, text, count << 1); | |
87 return count; | |
88 } | |
89 | |
90 // TODO: unify/eliminate SkTypeface::Encoding with SkTextEncoding | |
91 SkTypeface::Encoding typeface_encoding; | |
92 switch (encoding) { | |
93 case kUTF8_SkTextEncoding: | |
94 typeface_encoding = SkTypeface::kUTF8_Encoding; | |
95 break; | |
96 case kUTF16_SkTextEncoding: | |
97 typeface_encoding = SkTypeface::kUTF16_Encoding; | |
98 break; | |
99 case kUTF32_SkTextEncoding: | |
100 typeface_encoding = SkTypeface::kUTF32_Encoding; | |
101 break; | |
102 case kGlyphID_SkTextEncoding: | |
103 SkASSERT(0); // can't get here | |
104 } | |
105 | |
106 (void)fTypeface->charsToGlyphs(text, typeface_encoding, glyphs, count); | |
107 return count; | |
108 } | |
109 | |
110 SkScalar SkFont::measureText(const void* text, size_t byteLength, SkTextEncoding encoding) const { | |
111 // TODO: need access to the cache | |
112 return -1; | |
113 } | |
114 | |
115 //////////////////////////////////////////////////////////////////////////////// /////////////////// | |
116 | |
117 #include "SkPaint.h" | |
118 | |
119 SkFont* SkFont::Testing_CreateFromPaint(const SkPaint& paint) { | |
120 uint32_t flags = 0; | |
121 if (paint.isVerticalText()) { | |
122 flags |= kVertical_Flag; | |
123 } | |
124 if (paint.isEmbeddedBitmapText()) { | |
125 flags |= kEmbeddedBitmaps_Flag; | |
126 } | |
127 if (paint.getFlags() & SkPaint::kGenA8FromLCD_Flag) { | |
128 flags |= kGenA8FromLCD_Flag; | |
129 } | |
130 if (paint.isFakeBoldText()) { | |
131 flags |= kEmbolden_Flag; | |
132 } | |
133 | |
134 if (SkPaint::kFull_Hinting == paint.getHinting()) { | |
bungeman-skia
2014/03/27 19:13:15
I believe that on all back-ends we currently consi
| |
135 flags |= kEnableByteCodeHints_Flag; | |
136 } | |
137 if (paint.isAutohinted()) { | |
bungeman-skia
2014/03/27 19:13:15
If set, the 'autohinted' flag means (on FreeType o
| |
138 flags |= kEnableAutoHints_Flag; | |
139 } | |
140 if (paint.isSubpixelText() || paint.isLinearText()) { | |
bungeman-skia
2014/03/27 19:13:15
According to the android docs, setting linear shou
| |
141 // this is our default | |
142 } else { | |
143 flags |= kUseNonlinearMetrics_Flag; | |
144 } | |
145 | |
146 MaskType maskType = SkFont::kBW_MaskType; | |
147 if (paint.isAntiAlias()) { | |
148 maskType = paint.isLCDRenderText() ? kLCD_MaskType : kA8_MaskType; | |
149 } | |
150 | |
151 return Create(paint.getTypeface(), | |
152 paint.getTextSize(), paint.getTextScaleX(), paint.getTextSkewX (), | |
153 maskType, flags); | |
154 } | |
OLD | NEW |