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