MinikinUtils.h revision a3024bd7026deb777556dd75dd34a719ea1c2b39
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 27e21e2a2d1d85d422230c1115abba824338763a88Behdad Esfahbod#include <minikin/Layout.h> 286ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include "Paint.h" 29e21e2a2d1d85d422230c1115abba824338763a88Behdad Esfahbod#include "MinikinSkia.h" 30e21e2a2d1d85d422230c1115abba824338763a88Behdad Esfahbod#include "TypefaceImpl.h" 316ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod 321a73f732f91e97c9c66b808c245ddda36a10e987Raph Leviennamespace android { 331a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 341a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienclass MinikinUtils { 351a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpublic: 36c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien static FontStyle prepareMinikinPaint(MinikinPaint* minikinPaint, FontCollection** pFont, 37c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien const Paint* paint, TypefaceImpl* typeface); 38c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien 39c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien static void doLayout(Layout* layout, const Paint* paint, int bidiFlags, 40c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien TypefaceImpl* typeface, const uint16_t* buf, size_t start, size_t count, 41c94f742f7e07a3b86c8f603836c19638472b3e83Raph Levien size_t bufSize); 42e95b5850ac2e56330abf68362451e7614b3dfe16Raph Levien 43a3024bd7026deb777556dd75dd34a719ea1c2b39Keisuke Kuroyanagi static float measureText(const Paint* paint, int bidiFlags, TypefaceImpl* typeface, 44a3024bd7026deb777556dd75dd34a719ea1c2b39Keisuke Kuroyanagi const uint16_t* buf, size_t start, size_t count, size_t bufSize, float *advances); 45a3024bd7026deb777556dd75dd34a719ea1c2b39Keisuke Kuroyanagi 46bb1a96647a82df5a134bf631fc9db342e7ef61deSeigo Nonaka static bool hasVariationSelector(TypefaceImpl* typeface, uint32_t codepoint, uint32_t vs); 47bb1a96647a82df5a134bf631fc9db342e7ef61deSeigo Nonaka 486ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod static float xOffsetForTextAlign(Paint* paint, const Layout& layout); 49f2114d5646194100242206b267ddd6e7194b7da9Raph Levien 506ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod static float hOffsetForTextAlign(Paint* paint, const Layout& layout, const SkPath& path); 511fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien // f is a functor of type void f(size_t start, size_t end); 52f2114d5646194100242206b267ddd6e7194b7da9Raph Levien template <typename F> 536ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod static void forFontRun(const Layout& layout, Paint* paint, F& f) { 540627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien float saveSkewX = paint->getTextSkewX(); 550627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien bool savefakeBold = paint->isFakeBoldText(); 561fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien MinikinFont* curFont = NULL; 57f2114d5646194100242206b267ddd6e7194b7da9Raph Levien size_t start = 0; 58f2114d5646194100242206b267ddd6e7194b7da9Raph Levien size_t nGlyphs = layout.nGlyphs(); 59f2114d5646194100242206b267ddd6e7194b7da9Raph Levien for (size_t i = 0; i < nGlyphs; i++) { 601fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien MinikinFont* nextFont = layout.getFont(i); 611fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien if (i > 0 && nextFont != curFont) { 621fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start)); 631fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien f(start, i); 640627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien paint->setTextSkewX(saveSkewX); 650627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien paint->setFakeBoldText(savefakeBold); 66f2114d5646194100242206b267ddd6e7194b7da9Raph Levien start = i; 67f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 681fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien curFont = nextFont; 69f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 70f2114d5646194100242206b267ddd6e7194b7da9Raph Levien if (nGlyphs > start) { 711fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start)); 721fc0fa87d42ce9268ece76b85b9edc834593e53aRaph Levien f(start, nGlyphs); 730627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien paint->setTextSkewX(saveSkewX); 740627ec08dcc2e87c17e9b85f045dfb27dc4884b3Raph Levien paint->setFakeBoldText(savefakeBold); 75f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 76f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 771a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}; 781a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 791a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien} // namespace android 801a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 81ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#endif // _ANDROID_GRAPHICS_MINIKIN_UTILS_H_ 82