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/bitmap/composite_bitmap_glyph.h"
18
19 namespace sfntly {
20 /******************************************************************************
21 * CompositeBitmapGlyph class
22 ******************************************************************************/
CompositeBitmapGlyph(ReadableFontData * data,int32_t format)23 CompositeBitmapGlyph::CompositeBitmapGlyph(ReadableFontData* data,
24 int32_t format)
25 : BitmapGlyph(data, format) {
26 Initialize(format);
27 }
28
~CompositeBitmapGlyph()29 CompositeBitmapGlyph::~CompositeBitmapGlyph() {
30 }
31
NumComponents()32 int32_t CompositeBitmapGlyph::NumComponents() {
33 return data_->ReadUShort(num_components_offset_);
34 }
35
GetComponent(int32_t component_num) const36 CompositeBitmapGlyph::Component CompositeBitmapGlyph::GetComponent(
37 int32_t component_num) const {
38 int32_t component_offset = component_array_offset_ +
39 component_num * Offset::kEbdtComponentLength;
40 return CompositeBitmapGlyph::Component(
41 data_->ReadUShort(component_offset + Offset::kEbdtComponent_glyphCode),
42 data_->ReadChar(component_offset + Offset::kEbdtComponent_xOffset),
43 data_->ReadChar(component_offset + Offset::kEbdtComponent_yOffset));
44 }
45
Initialize(int32_t format)46 void CompositeBitmapGlyph::Initialize(int32_t format) {
47 if (format == 8) {
48 num_components_offset_ = Offset::kGlyphFormat8_numComponents;
49 component_array_offset_ = Offset::kGlyphFormat8_componentArray;
50 } else if (format == 9) {
51 num_components_offset_ = Offset::kGlyphFormat9_numComponents;
52 component_array_offset_ = Offset::kGlyphFormat9_componentArray;
53 } else {
54 #if !defined (SFNTLY_NO_EXCEPTION)
55 throw IllegalStateException("Attempt to create a Composite Bitmap Glyph "
56 "with a non-composite format.");
57 #endif
58 }
59 }
60
61 /******************************************************************************
62 * CompositeBitmapGlyph::Component class
63 ******************************************************************************/
Component(const Component & rhs)64 CompositeBitmapGlyph::Component::Component(const Component& rhs)
65 : glyph_code_(rhs.glyph_code_),
66 x_offset_(rhs.x_offset_),
67 y_offset_(rhs.y_offset_) {
68 }
69
operator ==(const CompositeBitmapGlyph::Component & rhs)70 bool CompositeBitmapGlyph::Component::operator==(
71 const CompositeBitmapGlyph::Component& rhs) {
72 return glyph_code_ == rhs.glyph_code_;
73 }
74
operator =(const CompositeBitmapGlyph::Component & rhs)75 CompositeBitmapGlyph::Component& CompositeBitmapGlyph::Component::operator=(
76 const CompositeBitmapGlyph::Component& rhs) {
77 glyph_code_ = rhs.glyph_code_;
78 x_offset_ = rhs.x_offset_;
79 y_offset_ = rhs.y_offset_;
80 return *this;
81 }
82
Component(int32_t glyph_code,int32_t x_offset,int32_t y_offset)83 CompositeBitmapGlyph::Component::Component(int32_t glyph_code,
84 int32_t x_offset,
85 int32_t y_offset)
86 : glyph_code_(glyph_code), x_offset_(x_offset), y_offset_(y_offset) {
87 }
88
89 /******************************************************************************
90 * CompositeBitmapGlyph::Builder class
91 ******************************************************************************/
Builder(ReadableFontData * data,int32_t format)92 CompositeBitmapGlyph::Builder::Builder(ReadableFontData* data, int32_t format)
93 : BitmapGlyph::Builder(data, format) {
94 }
95
Builder(WritableFontData * data,int32_t format)96 CompositeBitmapGlyph::Builder::Builder(WritableFontData* data, int32_t format)
97 : BitmapGlyph::Builder(data, format) {
98 }
99
~Builder()100 CompositeBitmapGlyph::Builder::~Builder() {
101 }
102
103 CALLER_ATTACH FontDataTable*
SubBuildTable(ReadableFontData * data)104 CompositeBitmapGlyph::Builder::SubBuildTable(ReadableFontData* data) {
105 Ptr<CompositeBitmapGlyph> glyph = new CompositeBitmapGlyph(data, format());
106 return glyph.Detach();
107 }
108
109 } // namespace sfntly
110