130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved. 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License"); 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License. 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * http://www.apache.org/licenses/LICENSE-2.0 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS, 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License. 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_ 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <map> 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <set> 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h" 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h" 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/refcount.h" 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/core/cmap_table.h" 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/truetype/glyph_table.h" 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/truetype/loca_table.h" 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace subtly { 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass CharacterPredicate; 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef int32_t FontId; 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::map<FontId, sfntly::Ptr<sfntly::Font> > FontIdMap; 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Glyph id pair that contains the loca table glyph id as well as the 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// font id that has the glyph table this glyph belongs to. 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass GlyphId { 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GlyphId(int32_t glyph_id, FontId font_id); 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ~GlyphId() {} 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool operator==(const GlyphId& other) const; 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool operator<(const GlyphId& other) const; 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t glyph_id() const { return glyph_id_; } 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void set_glyph_id(const int32_t glyph_id) { glyph_id_ = glyph_id; } 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontId font_id() const { return font_id_; } 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void set_font_id(const FontId font_id) { font_id_ = font_id; } 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t glyph_id_; 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontId font_id_; 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::map<int32_t, GlyphId> CharacterMap; 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::set<GlyphId> GlyphIdSet; 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Font information used for FontAssembler in the construction of a new font. 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Will make copies of character map, glyph id set and font id map. 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass FontInfo : public sfntly::RefCounted<FontInfo> { 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Empty FontInfo object. 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontInfo(); 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // chars_to_glyph_ids maps characters to GlyphIds for CMap construction 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // resolved_glyph_ids defines GlyphIds which should be in the final font 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // fonts is a map of font ids to fonts to reference any needed table 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontInfo(CharacterMap* chars_to_glyph_ids, 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GlyphIdSet* resolved_glyph_ids, 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontIdMap* fonts); 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~FontInfo(); 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Gets the table with the specified tag from the font corresponding to 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // font_id or NULL if there is no such font/table. 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // font_id is the id of the font that contains the table 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // tag identifies the table to be obtained 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual sfntly::FontDataTable* GetTable(FontId font_id, int32_t tag); 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Gets the table map of the font whose id is font_id 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const sfntly::TableMap* GetTableMap(FontId); 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CharacterMap* chars_to_glyph_ids() const { return chars_to_glyph_ids_; } 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Takes ownership of the chars_to_glyph_ids CharacterMap. 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void set_chars_to_glyph_ids(CharacterMap* chars_to_glyph_ids); 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GlyphIdSet* resolved_glyph_ids() const { return resolved_glyph_ids_; } 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Takes ownership of the glyph_ids GlyphIdSet. 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void set_resolved_glyph_ids(GlyphIdSet* glyph_ids); 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontIdMap* fonts() const { return fonts_; } 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Takes ownership of the fonts FontIdMap. 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void set_fonts(FontIdMap* fonts); 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CharacterMap* chars_to_glyph_ids_; 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GlyphIdSet* resolved_glyph_ids_; 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontIdMap* fonts_; 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// FontSourcedInfoBuilder is used to create a FontInfo object from a Font 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// optionally specifying a CharacterPredicate to filter out some of 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// the font's characters. 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// It does not take ownership or copy the values its constructor receives. 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass FontSourcedInfoBuilder : 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public sfntly::RefCounted<FontSourcedInfoBuilder> { 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontSourcedInfoBuilder(sfntly::Font* font, FontId font_id); 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontSourcedInfoBuilder(sfntly::Font* font, 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontId font_id, 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CharacterPredicate* predicate); 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~FontSourcedInfoBuilder() { } 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual CALLER_ATTACH FontInfo* GetFontInfo(); 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected: 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool GetCharacterMap(CharacterMap* chars_to_glyph_ids); 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool ResolveCompositeGlyphs(CharacterMap* chars_to_glyph_ids, 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GlyphIdSet* resolved_glyph_ids); 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Initialize(); 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sfntly::Ptr<sfntly::Font> font_; 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontId font_id_; 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CharacterPredicate* predicate_; 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sfntly::Ptr<sfntly::CMapTable::CMap> cmap_; 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sfntly::Ptr<sfntly::LocaTable> loca_table_; 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sfntly::Ptr<sfntly::GlyphTable> glyph_table_; 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_ 129