130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/bitmap_glyph.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/bitmap/bitmap_glyph_info.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/subtable_container_table.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass EbdtTable : public SubTableContainerTable,
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                  public RefCounted<EbdtTable> {
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  struct Offset {
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    enum {
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kVersion = 0,
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kHeaderLength = DataSize::kFixed,
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    };
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  };
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  class Builder : public SubTableContainerTable::Builder,
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                  public RefCounted<Builder> {
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   public:
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Constructor scope altered to public because C++ does not allow base
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // class to instantiate derived class with protected constructors.
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    Builder(Header* header, WritableFontData* data);
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    Builder(Header* header, ReadableFontData* data);
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual ~Builder();
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual int32_t SubSerialize(WritableFontData* new_data);
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual bool SubReadyToSerialize();
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual int32_t SubDataSizeToSerialize();
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual void SubDataSet();
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetLoca(BitmapLocaList* loca_list);
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void GenerateLocaList(BitmapLocaList* output);
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Gets the List of glyph builders for the glyph table builder. These may be
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // manipulated in any way by the caller and the changes will be reflected in
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // the final glyph table produced.
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // If there is no current data for the glyph builder or the glyph builders
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // have not been previously set then this will return an empty glyph builder
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // List. If there is current data (i.e. data read from an existing font) and
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // the loca list has not been set or is null, empty, or invalid, then an
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // empty glyph builder List will be returned.
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @return the list of glyph builders
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    BitmapGlyphBuilderList* GlyphBuilders();
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Replace the internal glyph builders with the one provided. The provided
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // list and all contained objects belong to this builder.
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // This call is only required if the entire set of glyphs in the glyph
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // table builder are being replaced. If the glyph builder list provided from
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // the {@link EbdtTable.Builder#glyphBuilders()} is being used and modified
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // then those changes will already be reflected in the glyph table builder.
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @param glyphBuilders the new glyph builders
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetGlyphBuilders(BitmapGlyphBuilderList* glyph_builders);
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void Revert();
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Create a new builder using the header information and data provided.
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @param header the header information
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // @param data the data holding the table
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                                WritableFontData* data);
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                                ReadableFontData* data);
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   private:
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    BitmapGlyphBuilderList* GetGlyphBuilders();
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    static void Initialize(ReadableFontData* data,
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                           BitmapLocaList* loca_list,
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                           BitmapGlyphBuilderList* output);
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    static const int32_t kVersion = 0x00020000;  // TODO(stuartg): const/enum
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    BitmapLocaList glyph_loca_;
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    BitmapGlyphBuilderList glyph_builders_;
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  };
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~EbdtTable();
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t Version();
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CALLER_ATTACH BitmapGlyph* Glyph(int32_t offset,
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                   int32_t length,
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                   int32_t format);
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected:
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EbdtTable(Header* header, ReadableFontData* data);
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<EbdtTable> EbdtTablePtr;
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<EbdtTable::Builder> EbdtTableBuilderPtr;
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBDT_TABLE_H_
109