MinikinUtils.h revision f2114d5646194100242206b267ddd6e7194b7da9
11a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien/*
21a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * Copyright (C) 2014 The Android Open Source Project
31a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *
41a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * Licensed under the Apache License, Version 2.0 (the "License");
51a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * you may not use this file except in compliance with the License.
61a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * You may obtain a copy of the License at
71a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *
81a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *      http://www.apache.org/licenses/LICENSE-2.0
91a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *
101a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * Unless required by applicable law or agreed to in writing, software
111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * distributed under the License is distributed on an "AS IS" BASIS,
121a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * See the License for the specific language governing permissions and
141a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * limitations under the License.
151a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien */
161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
171a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien/**
181a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * Utilities for making Minikin work, especially from existing objects like
191a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * SkPaint and so on.
201a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien **/
211a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
221a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien // TODO: does this really need to be separate from MinikinSkia?
231a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
241a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifndef ANDROID_MINIKIN_UTILS_H
251a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#define ANDROID_MINIKIN_UTILS_H
261a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
271a73f732f91e97c9c66b808c245ddda36a10e987Raph Leviennamespace android {
281a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
291a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienclass MinikinUtils {
301a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpublic:
319d9ee3d666c63938311839002ec974673998c6d0Raph Levien    static void SetLayoutProperties(Layout* layout, SkPaint* paint, int flags,
321a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* face);
33f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    static float xOffsetForTextAlign(SkPaint* paint, const Layout& layout);
34f2114d5646194100242206b267ddd6e7194b7da9Raph Levien
35f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    // f is a functor of type void f(SkTypeface *, size_t start, size_t end);
36f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    template <typename F>
37f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    static void forFontRun(const Layout& layout, F& f) {
38f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        SkTypeface* lastFace = NULL;
39f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t start = 0;
40f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t nGlyphs = layout.nGlyphs();
41f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        for (size_t i = 0; i < nGlyphs; i++) {
42f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            MinikinFontSkia* mfs = static_cast<MinikinFontSkia*>(layout.getFont(i));
43f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            SkTypeface* skFace = mfs->GetSkTypeface();
44f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            if (i > 0 && skFace != lastFace) {
45f2114d5646194100242206b267ddd6e7194b7da9Raph Levien                f(lastFace, start, i);
46f2114d5646194100242206b267ddd6e7194b7da9Raph Levien                start = i;
47f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            }
48f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            lastFace = skFace;
49f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
50f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        if (nGlyphs > start) {
51f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            f(lastFace, start, nGlyphs);
52f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
53f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    }
541a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien};
551a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
561a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}  // namespace android
571a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
581a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif  // ANDROID_MINIKIN_UTILS_H
59