/* * Copyright 2011 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_HORIZONTAL_METRICS_TABLE_H_ #define SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_HORIZONTAL_METRICS_TABLE_H_ #include "sfntly/table/table.h" #include "sfntly/table/table_based_table_builder.h" namespace sfntly { // A Horizontal Metrics table - 'hmtx'. class HorizontalMetricsTable : public Table, public RefCounted { public: // Builder for a Horizontal Metrics Table - 'hmtx'. class Builder : public TableBasedTableBuilder, public RefCounted { public: // Constructor scope altered to public because C++ does not allow base // class to instantiate derived class with protected constructors. Builder(Header* header, WritableFontData* data); Builder(Header* header, ReadableFontData* data); virtual ~Builder(); virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data); static CALLER_ATTACH Builder* CreateBuilder(Header* header, WritableFontData* data); void SetNumberOfHMetrics(int32_t num_hmetrics); void SetNumGlyphs(int32_t num_glyphs); private: int32_t num_hmetrics_; int32_t num_glyphs_; }; virtual ~HorizontalMetricsTable(); int32_t NumberOfHMetrics(); int32_t NumberOfLSBs(); int32_t HMetricAdvanceWidth(int32_t entry); int32_t HMetricLSB(int32_t entry); int32_t LsbTableEntry(int32_t entry); int32_t AdvanceWidth(int32_t glyph_id); int32_t LeftSideBearing(int32_t glyph_id); private: struct Offset { enum { // hMetrics kHMetricsStart = 0, kHMetricsSize = 4, // Offset within an hMetric kHMetricsAdvanceWidth = 0, kHMetricsLeftSideBearing = 2, kLeftSideBearingSize = 2 }; }; HorizontalMetricsTable(Header* header, ReadableFontData* data, int32_t num_hmetrics, int32_t num_glyphs); int32_t num_hmetrics_; int32_t num_glyphs_; }; typedef Ptr HorizontalMetricsTablePtr; typedef Ptr HorizontalMetricsTableBuilderPtr; } // namespace sfntly #endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_HORIZONTAL_METRICS_TABLE_H_