MinikinUtils.h revision bad99183916ba2bac6659efc8a28273e344ba511
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