MinikinUtils.h revision 6ba30b85ddfbe37c338ee8dde3dd33322eb38d47
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
196ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod * Paint 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
276ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include "Paint.h"
286ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod
291a73f732f91e97c9c66b808c245ddda36a10e987Raph Leviennamespace android {
301a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
313660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien// TODO: these should be defined in Minikin's Layout.h
323660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levienenum {
333660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    kBidi_LTR = 0,
343660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    kBidi_RTL = 1,
353660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    kBidi_Default_LTR = 2,
363660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    kBidi_Default_RTL = 3,
373660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    kBidi_Force_LTR = 4,
383660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    kBidi_Force_RTL = 5,
393660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien
403660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien    kBidi_Mask = 0x7
413660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien};
423660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien
43e95b5850ac2e56330abf68362451e7614b3dfe16Raph Levienclass Layout;
44e95b5850ac2e56330abf68362451e7614b3dfe16Raph Levienclass TypefaceImpl;
45e95b5850ac2e56330abf68362451e7614b3dfe16Raph Levien
461a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienclass MinikinUtils {
471a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpublic:
486ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    static std::string setLayoutProperties(Layout* layout, const Paint* paint, int bidiFlags,
496bfd7e7df3a9f9ea2f9e57a3552eed7f518be711Raph Levien            TypefaceImpl* typeface);
50e95b5850ac2e56330abf68362451e7614b3dfe16Raph Levien
516ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    static float xOffsetForTextAlign(Paint* paint, const Layout& layout);
52f2114d5646194100242206b267ddd6e7194b7da9Raph Levien
536ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    static float hOffsetForTextAlign(Paint* paint, const Layout& layout, const SkPath& path);
541fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien    // f is a functor of type void f(size_t start, size_t end);
55f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    template <typename F>
566ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    static void forFontRun(const Layout& layout, Paint* paint, F& f) {
570627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien        float saveSkewX = paint->getTextSkewX();
580627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien        bool savefakeBold = paint->isFakeBoldText();
591fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien        MinikinFont* curFont = NULL;
60f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t start = 0;
61f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t nGlyphs = layout.nGlyphs();
62f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        for (size_t i = 0; i < nGlyphs; i++) {
631fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            MinikinFont* nextFont = layout.getFont(i);
641fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            if (i > 0 && nextFont != curFont) {
651fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien                MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start));
661fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien                f(start, i);
670627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien                paint->setTextSkewX(saveSkewX);
680627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien                paint->setFakeBoldText(savefakeBold);
69f2114d5646194100242206b267ddd6e7194b7da9Raph Levien                start = i;
70f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            }
711fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            curFont = nextFont;
72f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
73f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        if (nGlyphs > start) {
741fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start));
751fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            f(start, nGlyphs);
760627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien            paint->setTextSkewX(saveSkewX);
770627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien            paint->setFakeBoldText(savefakeBold);
78f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
79f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    }
801a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien};
811a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
821a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}  // namespace android
831a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
841a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif  // ANDROID_MINIKIN_UTILS_H
85