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_CORE_HORIZONTAL_HEADER_TABLE_H_
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_HORIZONTAL_HEADER_TABLE_H_
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/table.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/table_based_table_builder.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// A Horizontal Header table - 'hhea'.
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass HorizontalHeaderTable : public Table,
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                              public RefCounted<HorizontalHeaderTable> {
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Builder for a Horizontal Header table - 'hhea'.
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  class Builder : public TableBasedTableBuilder, public RefCounted<Builder> {
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   public:
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Constructor scope altered to public because C++ does not allow base
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // class to instantiate derived class with protected constructors.
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    Builder(Header* header, WritableFontData* data);
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    Builder(Header* header, ReadableFontData* data);
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual ~Builder();
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    static CALLER_ATTACH Builder* CreateBuilder(Header* header,
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                                WritableFontData* data);
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t TableVersion();
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetTableVersion(int32_t version);
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t Ascender();
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetAscender(int32_t ascender);
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t Descender();
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetDescender(int32_t descender);
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t LineGap();
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetLineGap(int32_t line_gap);
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t AdvanceWidthMax();
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetAdvanceWidthMax(int32_t value);
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t MinLeftSideBearing();
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetMinLeftSideBearing(int32_t value);
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t MinRightSideBearing();
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetMinRightSideBearing(int32_t value);
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t XMaxExtent();
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetXMaxExtent(int32_t value);
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t CaretSlopeRise();
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetCaretSlopeRise(int32_t value);
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t CaretSlopeRun();
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetCaretSlopeRun(int32_t value);
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t CaretOffset();
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetCaretOffset(int32_t value);
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t MetricDataFormat();
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetMetricDataFormat(int32_t value);
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t NumberOfHMetrics();
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    void SetNumberOfHMetrics(int32_t value);
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  };
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~HorizontalHeaderTable();
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t TableVersion();
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t Ascender();
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t Descender();
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t LineGap();
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t AdvanceWidthMax();
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t MinLeftSideBearing();
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t MinRightSideBearing();
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t XMaxExtent();
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t CaretSlopeRise();
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t CaretSlopeRun();
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t CaretOffset();
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t MetricDataFormat();
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t NumberOfHMetrics();
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private:
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  struct Offset {
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    enum {
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kVersion = 0,
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kAscender = 4,
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kDescender = 6,
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kLineGap = 8,
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kAdvanceWidthMax = 10,
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kMinLeftSideBearing = 12,
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kMinRightSideBearing = 14,
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kXMaxExtent = 16,
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kCaretSlopeRise = 18,
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kCaretSlopeRun = 20,
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kCaretOffset = 22,
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kMetricDataFormat = 32,
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      kNumberOfHMetrics = 34,
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    };
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  };
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  HorizontalHeaderTable(Header* header, ReadableFontData* data);
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<HorizontalHeaderTable> HorizontalHeaderTablePtr;
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<HorizontalHeaderTable::Builder> HorizontalHeaderTableBuilderPtr;
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_HORIZONTAL_HEADER_TABLE_H_
112