Chromium Code Reviews| 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 |