1464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/* 2464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved. 3464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 4464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 5464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * you may not use this file except in compliance with the License. 6464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * You may obtain a copy of the License at 7464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 8464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * http://www.apache.org/licenses/LICENSE-2.0 9464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * 10464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software 11464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS, 12464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * See the License for the specific language governing permissions and 14464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * limitations under the License. 15464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com */ 16464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 175af34fd773f8cfee82321393504f558ddf67c628arthurhsu@google.com#include "sfntly/table/core/horizontal_metrics_table.h" 18464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/port/exception_type.h" 19464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 20464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comnamespace sfntly { 21464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/****************************************************************************** 22464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * HorizontalMetricsTable class 23464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com ******************************************************************************/ 24464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comHorizontalMetricsTable::~HorizontalMetricsTable() {} 25464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 26246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint32_t HorizontalMetricsTable::NumberOfHMetrics() { 27464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com return num_hmetrics_; 28464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 29464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 30246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint32_t HorizontalMetricsTable::NumberOfLSBs() { 31464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com return num_glyphs_ - num_hmetrics_; 32464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 33464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 34246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint32_t HorizontalMetricsTable::HMetricAdvanceWidth(int32_t entry) { 35464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com if (entry > num_hmetrics_) { 36b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com#if !defined (SFNTLY_NO_EXCEPTION) 37464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com throw IndexOutOfBoundException(); 380e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com#endif 39b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com return 0; 40464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 41464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) + 42464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Offset::kHMetricsAdvanceWidth; 43246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com return data_->ReadUShort(offset); 44464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 45464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 46246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint32_t HorizontalMetricsTable::HMetricLSB(int32_t entry) { 47464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com if (entry > num_hmetrics_) { 48b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com#if !defined (SFNTLY_NO_EXCEPTION) 49464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com throw IndexOutOfBoundException(); 500e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com#endif 51b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com return 0; 52464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 53464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) + 54464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Offset::kHMetricsLeftSideBearing; 55246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com return data_->ReadShort(offset); 56464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 57464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 58246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint32_t HorizontalMetricsTable::LsbTableEntry(int32_t entry) { 59464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com if (entry > num_hmetrics_) { 60b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com#if !defined (SFNTLY_NO_EXCEPTION) 61464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com throw IndexOutOfBoundException(); 620e411afcef9fc211b3f8f70d31bc1dfa4c0f85d3arthurhsu@google.com#endif 63b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com return 0; 64464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 65464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) + 66464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com Offset::kLeftSideBearingSize; 67246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com return data_->ReadShort(offset); 68464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 69464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 70246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint32_t HorizontalMetricsTable::AdvanceWidth(int32_t glyph_id) { 71464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com if (glyph_id < num_hmetrics_) { 72246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com return HMetricAdvanceWidth(glyph_id); 73464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com } 74246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com return HMetricAdvanceWidth(glyph_id - num_hmetrics_); 75246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com} 76246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com 77f7c13bf6ff210e3c018971a6f219bb626ae00378arthurhsu@google.comint32_t HorizontalMetricsTable::LeftSideBearing(int32_t glyph_id) { 78f7c13bf6ff210e3c018971a6f219bb626ae00378arthurhsu@google.com if (glyph_id < num_hmetrics_) { 79f7c13bf6ff210e3c018971a6f219bb626ae00378arthurhsu@google.com return HMetricLSB(glyph_id); 80f7c13bf6ff210e3c018971a6f219bb626ae00378arthurhsu@google.com } 81f7c13bf6ff210e3c018971a6f219bb626ae00378arthurhsu@google.com return LsbTableEntry(glyph_id - num_hmetrics_); 82f7c13bf6ff210e3c018971a6f219bb626ae00378arthurhsu@google.com} 83f7c13bf6ff210e3c018971a6f219bb626ae00378arthurhsu@google.com 84246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comHorizontalMetricsTable::HorizontalMetricsTable(Header* header, 85246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com ReadableFontData* data, 86246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com int32_t num_hmetrics, 87246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com int32_t num_glyphs) 88246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com : Table(header, data), 89246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com num_hmetrics_(num_hmetrics), 90246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com num_glyphs_(num_glyphs) { 91464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 92464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 93464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/****************************************************************************** 94464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * HorizontalMetricsTable::Builder class 95464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com ******************************************************************************/ 96b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comHorizontalMetricsTable::Builder::Builder(Header* header, WritableFontData* data) 976b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com : TableBasedTableBuilder(header, data), num_hmetrics_(-1), num_glyphs_(-1) { 98464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 99464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 100b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comHorizontalMetricsTable::Builder::Builder(Header* header, ReadableFontData* data) 1016b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com : TableBasedTableBuilder(header, data), num_hmetrics_(-1), num_glyphs_(-1) { 102464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 103464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 104464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comHorizontalMetricsTable::Builder::~Builder() {} 105464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 106246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comCALLER_ATTACH FontDataTable* 107246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com HorizontalMetricsTable::Builder::SubBuildTable(ReadableFontData* data) { 108464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com FontDataTablePtr table = 109464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com new HorizontalMetricsTable(header(), data, num_hmetrics_, num_glyphs_); 110246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com return table.Detach(); 111464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 112464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 113b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.comCALLER_ATTACH HorizontalMetricsTable::Builder* 114b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com HorizontalMetricsTable::Builder::CreateBuilder(Header* header, 115b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com WritableFontData* data) { 116b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com Ptr<HorizontalMetricsTable::Builder> builder; 117b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com builder = new HorizontalMetricsTable::Builder(header, data); 118b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com return builder.Detach(); 119b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com} 120b54cce09c1fc2b09e2adae43d7eb017b47b0cccfarthurhsu@google.com 121246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comvoid HorizontalMetricsTable::Builder::SetNumberOfHMetrics( 122246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com int32_t num_hmetrics) { 123464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com assert(num_hmetrics >= 0); 124464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com num_hmetrics_ = num_hmetrics; 125246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com HorizontalMetricsTable* table = 126246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com down_cast<HorizontalMetricsTable*>(this->GetTable()); 127464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com table->num_hmetrics_ = num_hmetrics; 128464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 129464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 130246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comvoid HorizontalMetricsTable::Builder::SetNumGlyphs(int32_t num_glyphs) { 131464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com assert(num_glyphs >= 0); 132464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com num_glyphs_ = num_glyphs; 133246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com HorizontalMetricsTable* table = 134246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com down_cast<HorizontalMetricsTable*>(this->GetTable()); 135464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com table->num_glyphs_ = num_glyphs; 136464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} 137464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com 138464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com} // namespace sfntly 139