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,
uint32_t flags) |
| 17 : fTypeface(ref_or_default(face)) |
| 18 , fSize(size) |
| 19 , fScaleX(scaleX) |
| 20 , fSkewX(skewX) |
| 21 , fFlags(flags) |
| 22 { |
| 23 SkASSERT(size > 0); |
| 24 SkASSERT(scaleX > 0); |
| 25 SkASSERT(SkScalarIsFinite(skewX)); |
| 26 SkASSERT(0 == (flags & ~kAllFlags)); |
| 27 } |
| 28 |
| 29 SkFont* SkFont::Create(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScala
r skewX, |
| 30 uint32_t flags) { |
| 31 if (!(size > 0)) { |
| 32 size = 12; |
| 33 } |
| 34 if (!(scaleX > 0)) { |
| 35 scaleX = 1; |
| 36 } |
| 37 if (!SkScalarIsFinite(skewX)) { |
| 38 skewX = 0; |
| 39 } |
| 40 flags &= kAllFlags; |
| 41 return SkNEW_ARGS(SkFont, (face, size, scaleX, skewX, flags)); |
| 42 } |
| 43 |
| 44 SkFont* SkFont::Create(SkTypeface* face, SkScalar size, uint32_t flags) { |
| 45 return SkFont::Create(face, size, 1, 0, flags); |
| 46 } |
| 47 |
| 48 SkFont* SkFont::Create(const SkFont& src, SkScalar newSize) { |
| 49 return SkFont::Create(src.getTypeface(), newSize, src.getScaleX(), src.getSk
ewX(), |
| 50 src.getFlags()); |
| 51 } |
| 52 |
| 53 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 54 |
| 55 SkFont::~SkFont() { |
| 56 SkSafeUnref(fTypeface); |
| 57 } |
| 58 |
| 59 int SkFont::textToGlyphs(const void* text, size_t byteLength, SkTextEncoding enc
oding, |
| 60 uint16_t glyphs[], int maxGlyphCount) const { |
| 61 if (0 == byteLength) { |
| 62 return 0; |
| 63 } |
| 64 |
| 65 SkASSERT(text); |
| 66 |
| 67 int count; |
| 68 switch (encoding) { |
| 69 case kUTF8_SkTextEncoding: |
| 70 count = SkUTF8_CountUnichars((const char*)text, byteLength); |
| 71 case kUTF16_SkTextEncoding: |
| 72 count = SkUTF16_CountUnichars((const uint16_t*)text, SkToInt(byteLen
gth >> 1)); |
| 73 case kUTF32_SkTextEncoding: |
| 74 count = SkToInt(byteLength >> 2); |
| 75 case kGlyphID_SkTextEncoding: |
| 76 count = SkToInt(byteLength >> 1); |
| 77 } |
| 78 if (NULL == glyphs) { |
| 79 return count; |
| 80 } |
| 81 |
| 82 if (kGlyphID_SkTextEncoding == encoding) { |
| 83 memcpy(glyphs, text, count << 1); |
| 84 return count; |
| 85 } |
| 86 |
| 87 // TODO: unify/eliminate SkTypeface::Encoding with SkTextEncoding |
| 88 SkTypeface::Encoding typeface_encoding; |
| 89 switch (encoding) { |
| 90 case kUTF8_SkTextEncoding: |
| 91 typeface_encoding = SkTypeface::kUTF8_Encoding; |
| 92 break; |
| 93 case kUTF16_SkTextEncoding: |
| 94 typeface_encoding = SkTypeface::kUTF16_Encoding; |
| 95 break; |
| 96 case kUTF32_SkTextEncoding: |
| 97 typeface_encoding = SkTypeface::kUTF32_Encoding; |
| 98 break; |
| 99 case kGlyphID_SkTextEncoding: |
| 100 SkASSERT(0); // can't get here |
| 101 } |
| 102 |
| 103 (void)fTypeface->charsToGlyphs(text, typeface_encoding, glyphs, count); |
| 104 return count; |
| 105 } |
| 106 |
| 107 SkScalar SkFont::measureText(const void* text, size_t byteLength, SkTextEncoding
encoding) const { |
| 108 // TODO: need access to the cache |
| 109 return -1; |
| 110 } |
| 111 |
OLD | NEW |