16b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/*
26b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved.
36b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
46b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License");
56b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * you may not use this file except in compliance with the License.
66b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * You may obtain a copy of the License at
76b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
86b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *      http://www.apache.org/licenses/LICENSE-2.0
96b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
106b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Unless required by applicable law or agreed to in writing, software
116b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS,
126b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * See the License for the specific language governing permissions and
146b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * limitations under the License.
156b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com */
166b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
176b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
196b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
206b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/bitmap_glyph.h"
21333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/table/bitmap/bitmap_glyph_info.h"
226b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/subtable_container_table.h"
236b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
246b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comnamespace sfntly {
256b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
266b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comclass EbdtTable : public SubTableContainerTable,
276b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                  public RefCounted<EbdtTable> {
286b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com public:
2953847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com  struct Offset {
3053847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com    enum {
3153847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com      kVersion = 0,
3253847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com      kHeaderLength = DataSize::kFixed,
3353847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com    };
3453847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com  };
3553847b66af7e0c1af9928e4da2e978ed3b7c2a25arthurhsu@google.com
366b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  class Builder : public SubTableContainerTable::Builder,
376b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                  public RefCounted<Builder> {
386b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com   public:
396b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    // Constructor scope altered to public because C++ does not allow base
406b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    // class to instantiate derived class with protected constructors.
416b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    Builder(Header* header, WritableFontData* data);
426b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    Builder(Header* header, ReadableFontData* data);
436b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    virtual ~Builder();
446b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
456b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    virtual int32_t SubSerialize(WritableFontData* new_data);
466b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    virtual bool SubReadyToSerialize();
476b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    virtual int32_t SubDataSizeToSerialize();
486b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    virtual void SubDataSet();
496b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
506b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
51333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    void SetLoca(BitmapLocaList* loca_list);
52333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    void GenerateLocaList(BitmapLocaList* output);
53be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com
54be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // Gets the List of glyph builders for the glyph table builder. These may be
55be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // manipulated in any way by the caller and the changes will be reflected in
56be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // the final glyph table produced.
57be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // If there is no current data for the glyph builder or the glyph builders
58be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // have not been previously set then this will return an empty glyph builder
59be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // List. If there is current data (i.e. data read from an existing font) and
60be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // the loca list has not been set or is null, empty, or invalid, then an
61be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // empty glyph builder List will be returned.
62333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // @return the list of glyph builders
63333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapGlyphBuilderList* GlyphBuilders();
64333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
65be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // Replace the internal glyph builders with the one provided. The provided
66be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // list and all contained objects belong to this builder.
67be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // This call is only required if the entire set of glyphs in the glyph
68be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // table builder are being replaced. If the glyph builder list provided from
69be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // the {@link EbdtTable.Builder#glyphBuilders()} is being used and modified
70be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.com    // then those changes will already be reflected in the glyph table builder.
71333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // @param glyphBuilders the new glyph builders
72333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    void SetGlyphBuilders(BitmapGlyphBuilderList* glyph_builders);
73333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
74333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    void Revert();
75333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
76333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // Create a new builder using the header information and data provided.
77333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // @param header the header information
78333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // @param data the data holding the table
796b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
806b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                                WritableFontData* data);
81333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
82333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                                                ReadableFontData* data);
83333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
84333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com   private:
85333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapGlyphBuilderList* GetGlyphBuilders();
86333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    static void Initialize(ReadableFontData* data,
87333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                           BitmapLocaList* loca_list,
88333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                           BitmapGlyphBuilderList* output);
89333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
90333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    static const int32_t kVersion = 0x00020000;  // TODO(stuartg): const/enum
91333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapLocaList glyph_loca_;
92333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    BitmapGlyphBuilderList glyph_builders_;
936b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  };
946b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
956b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  virtual ~EbdtTable();
966b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  int32_t Version();
976b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  CALLER_ATTACH BitmapGlyph* Glyph(int32_t offset,
986b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                   int32_t length,
996b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                   int32_t format);
1006b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com protected:
101333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  EbdtTable(Header* header, ReadableFontData* data);
1026b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com};
1036b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comtypedef Ptr<EbdtTable> EbdtTablePtr;
104be87cfe77f08387d23cabc3a403fa53531b687a8arthurhsu@google.comtypedef Ptr<EbdtTable::Builder> EbdtTableBuilderPtr;
1056b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
1066b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}  // namespace sfntly
1076b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
1086b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
109