MinikinUtils.h revision e21e2a2d1d85d422230c1115abba824338763a88
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 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 343660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien// TODO: these should be defined in Minikin's Layout.h 353660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levienenum { 363660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien kBidi_LTR = 0, 373660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien kBidi_RTL = 1, 383660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien kBidi_Default_LTR = 2, 393660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien kBidi_Default_RTL = 3, 403660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien kBidi_Force_LTR = 4, 413660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien kBidi_Force_RTL = 5, 423660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien 433660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien kBidi_Mask = 0x7 443660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien}; 453660789f06c5fbcb81e6c7c79612048bff8f0f66Raph Levien 461a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienclass MinikinUtils { 471a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpublic: 4863c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod static void doLayout(Layout* layout, const Paint* paint, int bidiFlags, TypefaceImpl* typeface, 4963c5c78a72a21d57913e8601cc2a1ab72a424a02Behdad Esfahbod const uint16_t* buf, size_t start, size_t count, size_t bufSize); 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