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 SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
18#define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
19
20#include "sfntly/table/bitmap/bitmap_glyph.h"
21#include "sfntly/table/bitmap/bitmap_glyph_info.h"
22#include "sfntly/table/subtable_container_table.h"
23
24namespace sfntly {
25
26class EbdtTable : public SubTableContainerTable,
27                  public RefCounted<EbdtTable> {
28 public:
29  struct Offset {
30    enum {
31      kVersion = 0,
32      kHeaderLength = DataSize::kFixed,
33    };
34  };
35
36  class Builder : public SubTableContainerTable::Builder,
37                  public RefCounted<Builder> {
38   public:
39    // Constructor scope altered to public because C++ does not allow base
40    // class to instantiate derived class with protected constructors.
41    Builder(Header* header, WritableFontData* data);
42    Builder(Header* header, ReadableFontData* data);
43    virtual ~Builder();
44
45    virtual int32_t SubSerialize(WritableFontData* new_data);
46    virtual bool SubReadyToSerialize();
47    virtual int32_t SubDataSizeToSerialize();
48    virtual void SubDataSet();
49    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
50
51    void SetLoca(BitmapLocaList* loca_list);
52    void GenerateLocaList(BitmapLocaList* output);
53
54    // Gets the List of glyph builders for the glyph table builder. These may be
55    // manipulated in any way by the caller and the changes will be reflected in
56    // the final glyph table produced.
57    // If there is no current data for the glyph builder or the glyph builders
58    // have not been previously set then this will return an empty glyph builder
59    // List. If there is current data (i.e. data read from an existing font) and
60    // the loca list has not been set or is null, empty, or invalid, then an
61    // empty glyph builder List will be returned.
62    // @return the list of glyph builders
63    BitmapGlyphBuilderList* GlyphBuilders();
64
65    // Replace the internal glyph builders with the one provided. The provided
66    // list and all contained objects belong to this builder.
67    // This call is only required if the entire set of glyphs in the glyph
68    // table builder are being replaced. If the glyph builder list provided from
69    // the {@link EbdtTable.Builder#glyphBuilders()} is being used and modified
70    // then those changes will already be reflected in the glyph table builder.
71    // @param glyphBuilders the new glyph builders
72    void SetGlyphBuilders(BitmapGlyphBuilderList* glyph_builders);
73
74    void Revert();
75
76    // Create a new builder using the header information and data provided.
77    // @param header the header information
78    // @param data the data holding the table
79    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
80                                                WritableFontData* data);
81    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
82                                                ReadableFontData* data);
83
84   private:
85    BitmapGlyphBuilderList* GetGlyphBuilders();
86    static void Initialize(ReadableFontData* data,
87                           BitmapLocaList* loca_list,
88                           BitmapGlyphBuilderList* output);
89
90    static const int32_t kVersion = 0x00020000;  // TODO(stuartg): const/enum
91    BitmapLocaList glyph_loca_;
92    BitmapGlyphBuilderList glyph_builders_;
93  };
94
95  virtual ~EbdtTable();
96  int32_t Version();
97  CALLER_ATTACH BitmapGlyph* Glyph(int32_t offset,
98                                   int32_t length,
99                                   int32_t format);
100 protected:
101  EbdtTable(Header* header, ReadableFontData* data);
102};
103typedef Ptr<EbdtTable> EbdtTablePtr;
104typedef Ptr<EbdtTable::Builder> EbdtTableBuilderPtr;
105
106}  // namespace sfntly
107
108#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
109