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
24ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#ifndef _ANDROID_GRAPHICS_MINIKIN_UTILS_H_
25ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#define _ANDROID_GRAPHICS_MINIKIN_UTILS_H_
261a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
27dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include <cutils/compiler.h>
28e21e2a2d1d85d422230c1115abba824338763a88Behdad Esfahbod#include <minikin/Layout.h>
296ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include "Paint.h"
30e21e2a2d1d85d422230c1115abba824338763a88Behdad Esfahbod#include "MinikinSkia.h"
31bad99183916ba2bac6659efc8a28273e344ba511sergeyv#include "Typeface.h"
326ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod
331a73f732f91e97c9c66b808c245ddda36a10e987Raph Leviennamespace android {
341a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
351a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienclass MinikinUtils {
361a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpublic:
37dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    ANDROID_API static FontStyle prepareMinikinPaint(MinikinPaint* minikinPaint, FontCollection** pFont,
38bad99183916ba2bac6659efc8a28273e344ba511sergeyv            const Paint* paint, Typeface* typeface);
39c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien
40dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    ANDROID_API static void doLayout(Layout* layout, const Paint* paint, int bidiFlags,
41bad99183916ba2bac6659efc8a28273e344ba511sergeyv            Typeface* typeface, const uint16_t* buf, size_t start, size_t count,
42c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien            size_t bufSize);
43e95b5850ac2e56330abf68362451e7614b3dfe16Raph Levien
44bad99183916ba2bac6659efc8a28273e344ba511sergeyv    ANDROID_API static float measureText(const Paint* paint, int bidiFlags, Typeface* typeface,
45a3024bd7026deb777556dd75dd34a719ea1c2b39Keisuke Kuroyanagi            const uint16_t* buf, size_t start, size_t count, size_t bufSize, float *advances);
46a3024bd7026deb777556dd75dd34a719ea1c2b39Keisuke Kuroyanagi
47bad99183916ba2bac6659efc8a28273e344ba511sergeyv    ANDROID_API static bool hasVariationSelector(Typeface* typeface, uint32_t codepoint, uint32_t vs);
48bb1a96647a82df5a134bf631fc9db342e7ef61deSeigo Nonaka
49dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    ANDROID_API static float xOffsetForTextAlign(Paint* paint, const Layout& layout);
50f2114d5646194100242206b267ddd6e7194b7da9Raph Levien
51dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    ANDROID_API static float hOffsetForTextAlign(Paint* paint, const Layout& layout, const SkPath& path);
521fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien    // f is a functor of type void f(size_t start, size_t end);
53f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    template <typename F>
54dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    ANDROID_API static void forFontRun(const Layout& layout, Paint* paint, F& f) {
550627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien        float saveSkewX = paint->getTextSkewX();
560627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien        bool savefakeBold = paint->isFakeBoldText();
571fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien        MinikinFont* curFont = NULL;
58f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t start = 0;
59f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        size_t nGlyphs = layout.nGlyphs();
60f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        for (size_t i = 0; i < nGlyphs; i++) {
611fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            MinikinFont* nextFont = layout.getFont(i);
621fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            if (i > 0 && nextFont != curFont) {
631fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien                MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start));
641fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien                f(start, i);
650627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien                paint->setTextSkewX(saveSkewX);
660627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien                paint->setFakeBoldText(savefakeBold);
67f2114d5646194100242206b267ddd6e7194b7da9Raph Levien                start = i;
68f2114d5646194100242206b267ddd6e7194b7da9Raph Levien            }
691fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            curFont = nextFont;
70f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
71f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        if (nGlyphs > start) {
721fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start));
731fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien            f(start, nGlyphs);
740627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien            paint->setTextSkewX(saveSkewX);
750627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien            paint->setFakeBoldText(savefakeBold);
76f2114d5646194100242206b267ddd6e7194b7da9Raph Levien        }
77f2114d5646194100242206b267ddd6e7194b7da9Raph Levien    }
781a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien};
791a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
801a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}  // namespace android
811a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
82ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#endif  // _ANDROID_GRAPHICS_MINIKIN_UTILS_H_
83