12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*
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");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 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
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_INDEX_SUBTABLE_FORMAT3_H_
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_INDEX_SUBTABLE_FORMAT3_H_
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "sfntly/table/bitmap/index_sub_table.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sfntly {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Format 3 Index Subtable Entry.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IndexSubTableFormat3 : public IndexSubTable,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             public RefCounted<IndexSubTableFormat3> {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Builder : public IndexSubTable::Builder,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  public RefCounted<Builder> {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class BitmapGlyphInfoIterator
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : public RefIterator<BitmapGlyphInfo, Builder, IndexSubTable::Builder> {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      explicit BitmapGlyphInfoIterator(Builder* container);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      virtual ~BitmapGlyphInfoIterator() {}
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      virtual bool HasNext();
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CALLER_ATTACH virtual BitmapGlyphInfo* Next();
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     private:
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int32_t glyph_id_;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    };
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~Builder();
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual int32_t NumGlyphs();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int32_t GlyphStartOffset(int32_t glyph_id);
463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    virtual int32_t GlyphLength(int32_t glyph_id);
473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    CALLER_ATTACH virtual BitmapGlyphInfoIterator* GetIterator();
483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    virtual void SubDataSet();
513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    virtual int32_t SubDataSizeToSerialize();
523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    virtual bool SubReadyToSerialize();
533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    virtual int32_t SubSerialize(WritableFontData* new_data);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void SetOffsetArray(const IntegerList& offset_array);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    static CALLER_ATTACH Builder* CreateBuilder();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static CALLER_ATTACH Builder* CreateBuilder(ReadableFontData* data,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                int32_t index_sub_table_offset,
603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                                int32_t first_glyph_index,
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                                int32_t last_glyph_index);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static CALLER_ATTACH Builder* CreateBuilder(WritableFontData* data,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int32_t index_sub_table_offset,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int32_t first_glyph_index,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int32_t last_glyph_index);
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Revert();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch   private:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Builder();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Builder(WritableFontData* data,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int32_t first_glyph_index,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int32_t last_glyph_index);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Builder(ReadableFontData* data,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int32_t first_glyph_index,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int32_t last_glyph_index);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IntegerList* GetOffsetArray();
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void Initialize(ReadableFontData* data);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    static int32_t DataLength(ReadableFontData* data,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int32_t index_sub_table_offset,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int32_t first_glyph_index,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int32_t last_glyph_index);
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IntegerList offset_array_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~IndexSubTableFormat3();
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int32_t NumGlyphs();
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int32_t GlyphStartOffset(int32_t glyph_id);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t GlyphLength(int32_t glyph_id);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int32_t GetDataLength(ReadableFontData* data,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int32_t offset,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int32_t first,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int32_t last);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexSubTableFormat3(ReadableFontData* data,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int32_t first_glyph_index,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int32_t last_glyph_index);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t Loca(int32_t loca_index);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class Builder;
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef Ptr<IndexSubTableFormat3> IndexSubTableFormat3Ptr;
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef Ptr<IndexSubTableFormat3::Builder> IndexSubTableFormat3BuilderPtr;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sfntly
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_INDEX_SUBTABLE_FORMAT3_H_
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)