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