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