1 /*
2  * Copyright 2011 Google Inc. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_
18 #define TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_
19 
20 #include <map>
21 #include <set>
22 
23 #include "sfntly/font.h"
24 #include "sfntly/port/type.h"
25 #include "sfntly/port/refcount.h"
26 #include "sfntly/table/core/cmap_table.h"
27 #include "sfntly/table/truetype/glyph_table.h"
28 #include "sfntly/table/truetype/loca_table.h"
29 
30 namespace subtly {
31 class CharacterPredicate;
32 
33 typedef int32_t FontId;
34 typedef std::map<FontId, sfntly::Ptr<sfntly::Font> > FontIdMap;
35 
36 // Glyph id pair that contains the loca table glyph id as well as the
37 // font id that has the glyph table this glyph belongs to.
38 class GlyphId {
39  public:
40   GlyphId(int32_t glyph_id, FontId font_id);
~GlyphId()41   ~GlyphId() {}
42 
43   bool operator==(const GlyphId& other) const;
44   bool operator<(const GlyphId& other) const;
45 
glyph_id()46   int32_t glyph_id() const { return glyph_id_; }
set_glyph_id(const int32_t glyph_id)47   void set_glyph_id(const int32_t glyph_id) { glyph_id_ = glyph_id; }
font_id()48   FontId font_id() const { return font_id_; }
set_font_id(const FontId font_id)49   void set_font_id(const FontId font_id) { font_id_ = font_id; }
50 
51  private:
52   int32_t glyph_id_;
53   FontId font_id_;
54 };
55 
56 typedef std::map<int32_t, GlyphId> CharacterMap;
57 typedef std::set<GlyphId> GlyphIdSet;
58 
59 // Font information used for FontAssembler in the construction of a new font.
60 // Will make copies of character map, glyph id set and font id map.
61 class FontInfo : public sfntly::RefCounted<FontInfo> {
62  public:
63   // Empty FontInfo object.
64   FontInfo();
65   // chars_to_glyph_ids maps characters to GlyphIds for CMap construction
66   // resolved_glyph_ids defines GlyphIds which should be in the final font
67   // fonts is a map of font ids to fonts to reference any needed table
68   FontInfo(CharacterMap* chars_to_glyph_ids,
69            GlyphIdSet* resolved_glyph_ids,
70            FontIdMap* fonts);
71   virtual ~FontInfo();
72 
73   // Gets the table with the specified tag from the font corresponding to
74   // font_id or NULL if there is no such font/table.
75   // font_id is the id of the font that contains the table
76   // tag identifies the table to be obtained
77   virtual sfntly::FontDataTable* GetTable(FontId font_id, int32_t tag);
78   // Gets the table map of the font whose id is font_id
79   virtual const sfntly::TableMap* GetTableMap(FontId);
80 
chars_to_glyph_ids()81   CharacterMap* chars_to_glyph_ids() const { return chars_to_glyph_ids_; }
82   // Takes ownership of the chars_to_glyph_ids CharacterMap.
83   void set_chars_to_glyph_ids(CharacterMap* chars_to_glyph_ids);
resolved_glyph_ids()84   GlyphIdSet* resolved_glyph_ids() const { return resolved_glyph_ids_; }
85   // Takes ownership of the glyph_ids GlyphIdSet.
86   void set_resolved_glyph_ids(GlyphIdSet* glyph_ids);
fonts()87   FontIdMap* fonts() const { return fonts_; }
88   // Takes ownership of the fonts FontIdMap.
89   void set_fonts(FontIdMap* fonts);
90 
91  private:
92   CharacterMap* chars_to_glyph_ids_;
93   GlyphIdSet* resolved_glyph_ids_;
94   FontIdMap* fonts_;
95 };
96 
97 // FontSourcedInfoBuilder is used to create a FontInfo object from a Font
98 // optionally specifying a CharacterPredicate to filter out some of
99 // the font's characters.
100 // It does not take ownership or copy the values its constructor receives.
101 class FontSourcedInfoBuilder :
102       public sfntly::RefCounted<FontSourcedInfoBuilder> {
103  public:
104   FontSourcedInfoBuilder(sfntly::Font* font, FontId font_id);
105   FontSourcedInfoBuilder(sfntly::Font* font,
106                          FontId font_id,
107                          CharacterPredicate* predicate);
~FontSourcedInfoBuilder()108   virtual ~FontSourcedInfoBuilder() { }
109 
110   virtual CALLER_ATTACH FontInfo* GetFontInfo();
111 
112  protected:
113   bool GetCharacterMap(CharacterMap* chars_to_glyph_ids);
114   bool ResolveCompositeGlyphs(CharacterMap* chars_to_glyph_ids,
115                               GlyphIdSet* resolved_glyph_ids);
116   void Initialize();
117 
118  private:
119   sfntly::Ptr<sfntly::Font> font_;
120   FontId font_id_;
121   CharacterPredicate* predicate_;
122 
123   sfntly::Ptr<sfntly::CMapTable::CMap> cmap_;
124   sfntly::Ptr<sfntly::LocaTable> loca_table_;
125   sfntly::Ptr<sfntly::GlyphTable> glyph_table_;
126 };
127 }
128 #endif  // TYPOGRAPHY_FONT_SFNTLY_SRC_SAMPLE_SUBTLY_FONT_INFO_H_
129