19cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien/* 29cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Copyright (C) 2013 The Android Open Source Project 39cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * 49cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Licensed under the Apache License, Version 2.0 (the "License"); 59cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * you may not use this file except in compliance with the License. 69cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * You may obtain a copy of the License at 79cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * 89cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * http://www.apache.org/licenses/LICENSE-2.0 99cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * 109cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Unless required by applicable law or agreed to in writing, software 119cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * distributed under the License is distributed on an "AS IS" BASIS, 129cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * See the License for the specific language governing permissions and 149cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * limitations under the License. 159cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien */ 169cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 179cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#ifndef MINIKIN_FONT_COLLECTION_H 189cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#define MINIKIN_FONT_COLLECTION_H 199cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 209cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#include <vector> 219cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 22b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien#include <minikin/MinikinRefCounted.h> 23bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#include <minikin/MinikinFont.h> 24bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#include <minikin/FontFamily.h> 259cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 269cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Leviennamespace android { 279cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 28b80c1f19c58b927820a8a24bf2218e5645724608Raph Levienclass FontCollection : public MinikinRefCounted { 299cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levienpublic: 309cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien explicit FontCollection(const std::vector<FontFamily*>& typefaces); 319cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 329cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien ~FontCollection(); 339cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 349a5f713add8cfb91ac2c9ed5c917309053201ab6Raph Levien struct Run { 359a5f713add8cfb91ac2c9ed5c917309053201ab6Raph Levien FakedFont fakedFont; 369cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien int start; 379cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien int end; 389cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien }; 394d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien 409cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien void itemize(const uint16_t *string, size_t string_length, FontStyle style, 419cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien std::vector<Run>* result) const; 424d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien 4389566f0ada1cafe673efa064cde38467990235d4Raph Levien // Get the base font for the given style, useful for font-wide metrics. 4489566f0ada1cafe673efa064cde38467990235d4Raph Levien MinikinFont* baseFont(FontStyle style); 459a5f713add8cfb91ac2c9ed5c917309053201ab6Raph Levien 469a5f713add8cfb91ac2c9ed5c917309053201ab6Raph Levien // Get base font with fakery information (fake bold could affect metrics) 479a5f713add8cfb91ac2c9ed5c917309053201ab6Raph Levien FakedFont baseFontFaked(FontStyle style); 4889566f0ada1cafe673efa064cde38467990235d4Raph Levien 494d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien uint32_t getId() const; 504d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levienprivate: 519cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien static const int kLogCharsPerPage = 8; 529cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien static const int kPageMask = (1 << kLogCharsPerPage) - 1; 539cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 549cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien struct Range { 559cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien size_t start; 569cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien size_t end; 579cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien }; 589cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 59253320d25fccbb49621926d49dcf5ef64cf529c6Raph Levien FontFamily* getFamilyForChar(uint32_t ch, FontLanguage lang, int variant) const; 60066e8575af64fb452617ac6005de6ccf6509553bRaph Levien 614d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien // static for allocating unique id's 624d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien static uint32_t sNextId; 634d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien 644d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien // unique id for this font collection (suitable for cache key) 654d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien uint32_t mId; 664d4e6bc8118d15542f1f2a9218f0f7a91a29474fRaph Levien 679cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien // Highest UTF-32 code point that can be mapped 689cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien uint32_t mMaxChar; 699cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 709cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien // This vector has ownership of the bitsets and typeface objects. 71253320d25fccbb49621926d49dcf5ef64cf529c6Raph Levien std::vector<FontFamily*> mFamilies; 729cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 739cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien // This vector contains pointers into mInstances 74253320d25fccbb49621926d49dcf5ef64cf529c6Raph Levien std::vector<FontFamily*> mFamilyVec; 759cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 769cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien // These are offsets into mInstanceVec, one range per page 779cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien std::vector<Range> mRanges; 789cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien}; 799cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 809cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien} // namespace android 819cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 829cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#endif // MINIKIN_FONT_COLLECTION_H 83