1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2011 Google Inc. All Rights Reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * you may not use this file except in compliance with the License. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * See the License for the specific language governing permissions and 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * limitations under the License. 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_ 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sfntly/font.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sfntly/port/type.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sfntly/port/refcount.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sfntly/table/core/cmap_table.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sfntly/table/truetype/glyph_table.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sfntly/table/truetype/loca_table.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace subtly { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CharacterPredicate; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t FontId; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<FontId, sfntly::Ptr<sfntly::Font> > FontIdMap; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Glyph id pair that contains the loca table glyph id as well as the 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// font id that has the glyph table this glyph belongs to. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GlyphId { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlyphId(int32_t glyph_id, FontId font_id); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~GlyphId() {} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const GlyphId& other) const; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(const GlyphId& other) const; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t glyph_id() const { return glyph_id_; } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_glyph_id(const int32_t glyph_id) { glyph_id_ = glyph_id; } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontId font_id() const { return font_id_; } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_font_id(const FontId font_id) { font_id_ = font_id; } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t glyph_id_; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontId font_id_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<int32_t, GlyphId> CharacterMap; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::set<GlyphId> GlyphIdSet; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Font information used for FontAssembler in the construction of a new font. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Will make copies of character map, glyph id set and font id map. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FontInfo : public sfntly::RefCounted<FontInfo> { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty FontInfo object. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontInfo(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chars_to_glyph_ids maps characters to GlyphIds for CMap construction 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resolved_glyph_ids defines GlyphIds which should be in the final font 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fonts is a map of font ids to fonts to reference any needed table 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontInfo(CharacterMap* chars_to_glyph_ids, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlyphIdSet* resolved_glyph_ids, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontIdMap* fonts); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FontInfo(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the table with the specified tag from the font corresponding to 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // font_id or NULL if there is no such font/table. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // font_id is the id of the font that contains the table 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tag identifies the table to be obtained 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual sfntly::FontDataTable* GetTable(FontId font_id, int32_t tag); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the table map of the font whose id is font_id 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const sfntly::TableMap* GetTableMap(FontId); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterMap* chars_to_glyph_ids() const { return chars_to_glyph_ids_; } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of the chars_to_glyph_ids CharacterMap. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_chars_to_glyph_ids(CharacterMap* chars_to_glyph_ids); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlyphIdSet* resolved_glyph_ids() const { return resolved_glyph_ids_; } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of the glyph_ids GlyphIdSet. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_resolved_glyph_ids(GlyphIdSet* glyph_ids); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontIdMap* fonts() const { return fonts_; } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of the fonts FontIdMap. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_fonts(FontIdMap* fonts); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterMap* chars_to_glyph_ids_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlyphIdSet* resolved_glyph_ids_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontIdMap* fonts_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FontSourcedInfoBuilder is used to create a FontInfo object from a Font 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// optionally specifying a CharacterPredicate to filter out some of 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the font's characters. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It does not take ownership or copy the values its constructor receives. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FontSourcedInfoBuilder : 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public sfntly::RefCounted<FontSourcedInfoBuilder> { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontSourcedInfoBuilder(sfntly::Font* font, FontId font_id); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontSourcedInfoBuilder(sfntly::Font* font, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontId font_id, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterPredicate* predicate); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FontSourcedInfoBuilder() { } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual CALLER_ATTACH FontInfo* GetFontInfo(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetCharacterMap(CharacterMap* chars_to_glyph_ids); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ResolveCompositeGlyphs(CharacterMap* chars_to_glyph_ids, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlyphIdSet* resolved_glyph_ids); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Initialize(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sfntly::Ptr<sfntly::Font> font_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontId font_id_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterPredicate* predicate_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sfntly::Ptr<sfntly::CMapTable::CMap> cmap_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sfntly::Ptr<sfntly::LocaTable> loca_table_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sfntly::Ptr<sfntly::GlyphTable> glyph_table_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_ 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch