Line data Source code
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 : #include "sfntly/table/core/horizontal_metrics_table.h"
18 : #include "sfntly/port/exception_type.h"
19 :
20 : namespace sfntly {
21 : /******************************************************************************
22 : * HorizontalMetricsTable class
23 : ******************************************************************************/
24 0 : HorizontalMetricsTable::~HorizontalMetricsTable() {}
25 :
26 0 : int32_t HorizontalMetricsTable::NumberOfHMetrics() {
27 0 : return num_hmetrics_;
28 : }
29 :
30 0 : int32_t HorizontalMetricsTable::NumberOfLSBs() {
31 0 : return num_glyphs_ - num_hmetrics_;
32 : }
33 :
34 0 : int32_t HorizontalMetricsTable::HMetricAdvanceWidth(int32_t entry) {
35 0 : if (entry > num_hmetrics_) {
36 : #if !defined (SFNTLY_NO_EXCEPTION)
37 : throw IndexOutOfBoundException();
38 : #endif
39 0 : return 0;
40 : }
41 : int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
42 0 : Offset::kHMetricsAdvanceWidth;
43 0 : return data_->ReadUShort(offset);
44 : }
45 :
46 0 : int32_t HorizontalMetricsTable::HMetricLSB(int32_t entry) {
47 0 : if (entry > num_hmetrics_) {
48 : #if !defined (SFNTLY_NO_EXCEPTION)
49 : throw IndexOutOfBoundException();
50 : #endif
51 0 : return 0;
52 : }
53 0 : int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
54 0 : Offset::kHMetricsLeftSideBearing;
55 0 : return data_->ReadShort(offset);
56 : }
57 :
58 0 : int32_t HorizontalMetricsTable::LsbTableEntry(int32_t entry) {
59 0 : if (entry > num_hmetrics_) {
60 : #if !defined (SFNTLY_NO_EXCEPTION)
61 : throw IndexOutOfBoundException();
62 : #endif
63 0 : return 0;
64 : }
65 0 : int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
66 0 : Offset::kLeftSideBearingSize;
67 0 : return data_->ReadShort(offset);
68 : }
69 :
70 0 : int32_t HorizontalMetricsTable::AdvanceWidth(int32_t glyph_id) {
71 0 : if (glyph_id < num_hmetrics_) {
72 0 : return HMetricAdvanceWidth(glyph_id);
73 : }
74 0 : return HMetricAdvanceWidth(glyph_id - num_hmetrics_);
75 : }
76 :
77 0 : int32_t HorizontalMetricsTable::LeftSideBearing(int32_t glyph_id) {
78 0 : if (glyph_id < num_hmetrics_) {
79 0 : return HMetricLSB(glyph_id);
80 : }
81 0 : return LsbTableEntry(glyph_id - num_hmetrics_);
82 : }
83 :
84 0 : HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
85 : ReadableFontData* data,
86 : int32_t num_hmetrics,
87 0 : int32_t num_glyphs)
88 : : Table(header, data),
89 : num_hmetrics_(num_hmetrics),
90 0 : num_glyphs_(num_glyphs) {
91 0 : }
92 :
93 : /******************************************************************************
94 : * HorizontalMetricsTable::Builder class
95 : ******************************************************************************/
96 0 : HorizontalMetricsTable::Builder::Builder(Header* header, WritableFontData* data)
97 0 : : TableBasedTableBuilder(header, data), num_hmetrics_(-1), num_glyphs_(-1) {
98 0 : }
99 :
100 0 : HorizontalMetricsTable::Builder::Builder(Header* header, ReadableFontData* data)
101 0 : : TableBasedTableBuilder(header, data), num_hmetrics_(-1), num_glyphs_(-1) {
102 0 : }
103 :
104 0 : HorizontalMetricsTable::Builder::~Builder() {}
105 :
106 : CALLER_ATTACH FontDataTable*
107 0 : HorizontalMetricsTable::Builder::SubBuildTable(ReadableFontData* data) {
108 : FontDataTablePtr table =
109 0 : new HorizontalMetricsTable(header(), data, num_hmetrics_, num_glyphs_);
110 0 : return table.Detach();
111 : }
112 :
113 : CALLER_ATTACH HorizontalMetricsTable::Builder*
114 0 : HorizontalMetricsTable::Builder::CreateBuilder(Header* header,
115 : WritableFontData* data) {
116 0 : Ptr<HorizontalMetricsTable::Builder> builder;
117 0 : builder = new HorizontalMetricsTable::Builder(header, data);
118 0 : return builder.Detach();
119 : }
120 :
121 0 : void HorizontalMetricsTable::Builder::SetNumberOfHMetrics(
122 : int32_t num_hmetrics) {
123 0 : assert(num_hmetrics >= 0);
124 0 : num_hmetrics_ = num_hmetrics;
125 : HorizontalMetricsTable* table =
126 0 : down_cast<HorizontalMetricsTable*>(this->GetTable());
127 0 : table->num_hmetrics_ = num_hmetrics;
128 0 : }
129 :
130 0 : void HorizontalMetricsTable::Builder::SetNumGlyphs(int32_t num_glyphs) {
131 0 : assert(num_glyphs >= 0);
132 0 : num_glyphs_ = num_glyphs;
133 : HorizontalMetricsTable* table =
134 0 : down_cast<HorizontalMetricsTable*>(this->GetTable());
135 0 : table->num_glyphs_ = num_glyphs;
136 0 : }
137 :
138 : } // namespace sfntly
|