| Index: src/core/SkFont.cpp | 
| diff --git a/src/core/SkFont.cpp b/src/core/SkFont.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..86a312b678890d4764dba9e7611a2872fdff06d4 | 
| --- /dev/null | 
| +++ b/src/core/SkFont.cpp | 
| @@ -0,0 +1,111 @@ | 
| +/* | 
| + * Copyright 2014 Google Inc. | 
| + * | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +#include "SkFont.h" | 
| +#include "SkTypeface.h" | 
| +#include "SkUtils.h" | 
| + | 
| +static SkTypeface* ref_or_default(SkTypeface* face) { | 
| +    return face ? SkRef(face) : SkTypeface::RefDefault(); | 
| +} | 
| + | 
| +SkFont::SkFont(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScalar skewX, uint32_t flags) | 
| +    : fTypeface(ref_or_default(face)) | 
| +    , fSize(size) | 
| +    , fScaleX(scaleX) | 
| +    , fSkewX(skewX) | 
| +    , fFlags(flags) | 
| +{ | 
| +    SkASSERT(size > 0); | 
| +    SkASSERT(scaleX > 0); | 
| +    SkASSERT(SkScalarIsFinite(skewX)); | 
| +    SkASSERT(0 == (flags & ~kAllFlags)); | 
| +} | 
| + | 
| +SkFont* SkFont::Create(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScalar skewX, | 
| +                       uint32_t flags) { | 
| +    if (!(size > 0)) { | 
| +        size = 12; | 
| +    } | 
| +    if (!(scaleX > 0)) { | 
| +        scaleX = 1; | 
| +    } | 
| +    if (!SkScalarIsFinite(skewX)) { | 
| +        skewX = 0; | 
| +    } | 
| +    flags &= kAllFlags; | 
| +    return SkNEW_ARGS(SkFont, (face, size, scaleX, skewX, flags)); | 
| +} | 
| + | 
| +SkFont* SkFont::Create(SkTypeface* face, SkScalar size, uint32_t flags) { | 
| +    return SkFont::Create(face, size, 1, 0, flags); | 
| +} | 
| + | 
| +SkFont* SkFont::Create(const SkFont& src, SkScalar newSize) { | 
| +    return SkFont::Create(src.getTypeface(), newSize, src.getScaleX(), src.getSkewX(), | 
| +                          src.getFlags()); | 
| +} | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +SkFont::~SkFont() { | 
| +    SkSafeUnref(fTypeface); | 
| +} | 
| + | 
| +int SkFont::textToGlyphs(const void* text, size_t byteLength, SkTextEncoding encoding, | 
| +                         uint16_t glyphs[], int maxGlyphCount) const { | 
| +    if (0 == byteLength) { | 
| +        return 0; | 
| +    } | 
| + | 
| +    SkASSERT(text); | 
| + | 
| +    int count; | 
| +    switch (encoding) { | 
| +        case kUTF8_SkTextEncoding: | 
| +            count = SkUTF8_CountUnichars((const char*)text, byteLength); | 
| +        case kUTF16_SkTextEncoding: | 
| +            count = SkUTF16_CountUnichars((const uint16_t*)text, SkToInt(byteLength >> 1)); | 
| +        case kUTF32_SkTextEncoding: | 
| +            count = SkToInt(byteLength >> 2); | 
| +        case kGlyphID_SkTextEncoding: | 
| +            count = SkToInt(byteLength >> 1); | 
| +    } | 
| +    if (NULL == glyphs) { | 
| +        return count; | 
| +    } | 
| + | 
| +    if (kGlyphID_SkTextEncoding == encoding) { | 
| +        memcpy(glyphs, text, count << 1); | 
| +        return count; | 
| +    } | 
| + | 
| +    // TODO: unify/eliminate SkTypeface::Encoding with SkTextEncoding | 
| +    SkTypeface::Encoding typeface_encoding; | 
| +    switch (encoding) { | 
| +        case kUTF8_SkTextEncoding: | 
| +            typeface_encoding = SkTypeface::kUTF8_Encoding; | 
| +            break; | 
| +        case kUTF16_SkTextEncoding: | 
| +            typeface_encoding = SkTypeface::kUTF16_Encoding; | 
| +            break; | 
| +        case kUTF32_SkTextEncoding: | 
| +            typeface_encoding = SkTypeface::kUTF32_Encoding; | 
| +            break; | 
| +        case kGlyphID_SkTextEncoding: | 
| +            SkASSERT(0);    // can't get here | 
| +    } | 
| + | 
| +    (void)fTypeface->charsToGlyphs(text, typeface_encoding, glyphs, count); | 
| +    return count; | 
| +} | 
| + | 
| +SkScalar SkFont::measureText(const void* text, size_t byteLength, SkTextEncoding encoding) const { | 
| +    // TODO: need access to the cache | 
| +    return -1; | 
| +} | 
| + | 
|  |