MinikinUtils.h revision f2114d5646194100242206b267ddd6e7194b7da9
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 191a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * SkPaint 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 271a73f732f91e97c9c66b808c245ddda36a10e987Raph Leviennamespace android { 281a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 291a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienclass MinikinUtils { 301a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpublic: 319d9ee3d666c63938311839002ec974673998c6d0Raph Levien static void SetLayoutProperties(Layout* layout, SkPaint* paint, int flags, 321a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien TypefaceImpl* face); 33f2114d5646194100242206b267ddd6e7194b7da9Raph Levien static float xOffsetForTextAlign(SkPaint* paint, const Layout& layout); 34f2114d5646194100242206b267ddd6e7194b7da9Raph Levien 35f2114d5646194100242206b267ddd6e7194b7da9Raph Levien // f is a functor of type void f(SkTypeface *, size_t start, size_t end); 36f2114d5646194100242206b267ddd6e7194b7da9Raph Levien template <typename F> 37f2114d5646194100242206b267ddd6e7194b7da9Raph Levien static void forFontRun(const Layout& layout, F& f) { 38f2114d5646194100242206b267ddd6e7194b7da9Raph Levien SkTypeface* lastFace = NULL; 39f2114d5646194100242206b267ddd6e7194b7da9Raph Levien size_t start = 0; 40f2114d5646194100242206b267ddd6e7194b7da9Raph Levien size_t nGlyphs = layout.nGlyphs(); 41f2114d5646194100242206b267ddd6e7194b7da9Raph Levien for (size_t i = 0; i < nGlyphs; i++) { 42f2114d5646194100242206b267ddd6e7194b7da9Raph Levien MinikinFontSkia* mfs = static_cast<MinikinFontSkia*>(layout.getFont(i)); 43f2114d5646194100242206b267ddd6e7194b7da9Raph Levien SkTypeface* skFace = mfs->GetSkTypeface(); 44f2114d5646194100242206b267ddd6e7194b7da9Raph Levien if (i > 0 && skFace != lastFace) { 45f2114d5646194100242206b267ddd6e7194b7da9Raph Levien f(lastFace, start, i); 46f2114d5646194100242206b267ddd6e7194b7da9Raph Levien start = i; 47f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 48f2114d5646194100242206b267ddd6e7194b7da9Raph Levien lastFace = skFace; 49f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 50f2114d5646194100242206b267ddd6e7194b7da9Raph Levien if (nGlyphs > start) { 51f2114d5646194100242206b267ddd6e7194b7da9Raph Levien f(lastFace, start, nGlyphs); 52f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 53f2114d5646194100242206b267ddd6e7194b7da9Raph Levien } 541a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}; 551a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 561a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien} // namespace android 571a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 581a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif // ANDROID_MINIKIN_UTILS_H 59