16b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/*
26b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved.
36b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
46b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Licensed under the Apache License, Version 2.0  = the "License");
56b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * you may not use this file except in compliance with the License.
66b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * You may obtain a copy of the License at
76b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
86b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *      http://www.apache.org/licenses/LICENSE-2.0
96b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com *
106b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * Unless required by applicable law or agreed to in writing, software
116b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS,
126b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * See the License for the specific language governing permissions and
146b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * limitations under the License.
156b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com */
166b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
176b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#include "sfntly/table/bitmap/composite_bitmap_glyph.h"
186b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
196b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comnamespace sfntly {
206b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/******************************************************************************
216b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * CompositeBitmapGlyph class
226b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com ******************************************************************************/
236b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCompositeBitmapGlyph::CompositeBitmapGlyph(ReadableFontData* data,
246b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                           int32_t format)
256b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    : BitmapGlyph(data, format) {
266b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  Initialize(format);
276b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
286b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
296b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCompositeBitmapGlyph::~CompositeBitmapGlyph() {
306b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
316b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
326b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comint32_t CompositeBitmapGlyph::NumComponents() {
336b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return data_->ReadUShort(num_components_offset_);
346b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
356b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
366b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCompositeBitmapGlyph::Component CompositeBitmapGlyph::GetComponent(
376b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    int32_t component_num) const {
386b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  int32_t component_offset = component_array_offset_ +
396b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                             component_num * Offset::kEbdtComponentLength;
406b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return CompositeBitmapGlyph::Component(
416b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      data_->ReadUShort(component_offset + Offset::kEbdtComponent_glyphCode),
426b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      data_->ReadChar(component_offset + Offset::kEbdtComponent_xOffset),
436b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      data_->ReadChar(component_offset + Offset::kEbdtComponent_yOffset));
446b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
456b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
466b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comvoid CompositeBitmapGlyph::Initialize(int32_t format) {
476b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  if (format == 8) {
486b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    num_components_offset_ = Offset::kGlyphFormat8_numComponents;
496b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    component_array_offset_ = Offset::kGlyphFormat8_componentArray;
506b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  } else if (format == 9) {
516b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    num_components_offset_ = Offset::kGlyphFormat9_numComponents;
526b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    component_array_offset_ = Offset::kGlyphFormat9_componentArray;
536b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  } else {
546b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#if !defined (SFNTLY_NO_EXCEPTION)
556b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    throw IllegalStateException("Attempt to create a Composite Bitmap Glyph "
566b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                "with a non-composite format.");
576b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com#endif
586b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  }
596b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
606b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
616b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com/******************************************************************************
626b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com * CompositeBitmapGlyph::Component class
636b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com ******************************************************************************/
646b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCompositeBitmapGlyph::Component::Component(const Component& rhs)
656b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    : glyph_code_(rhs.glyph_code_),
666b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      x_offset_(rhs.x_offset_),
676b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com      y_offset_(rhs.y_offset_) {
686b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
696b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
706b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.combool CompositeBitmapGlyph::Component::operator==(
716b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    const CompositeBitmapGlyph::Component& rhs) {
726b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return glyph_code_ == rhs.glyph_code_;
736b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
746b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
756b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCompositeBitmapGlyph::Component& CompositeBitmapGlyph::Component::operator=(
766b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    const CompositeBitmapGlyph::Component& rhs) {
776b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  glyph_code_ = rhs.glyph_code_;
786b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  x_offset_ = rhs.x_offset_;
796b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  y_offset_ = rhs.y_offset_;
806b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com  return *this;
816b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
826b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
836b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.comCompositeBitmapGlyph::Component::Component(int32_t glyph_code,
846b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                           int32_t x_offset,
856b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com                                           int32_t y_offset)
866b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com    : glyph_code_(glyph_code), x_offset_(x_offset), y_offset_(y_offset) {
876b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}
886b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com
89333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/******************************************************************************
90333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * CompositeBitmapGlyph::Builder class
91333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com ******************************************************************************/
92333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCompositeBitmapGlyph::Builder::Builder(ReadableFontData* data, int32_t format)
93333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    : BitmapGlyph::Builder(data, format) {
94333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
95333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
96333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCompositeBitmapGlyph::Builder::Builder(WritableFontData* data, int32_t format)
97333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    : BitmapGlyph::Builder(data, format) {
98333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
99333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
100333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCompositeBitmapGlyph::Builder::~Builder() {
101333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
102333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
103333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCALLER_ATTACH FontDataTable*
104333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comCompositeBitmapGlyph::Builder::SubBuildTable(ReadableFontData* data) {
105333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Ptr<CompositeBitmapGlyph> glyph = new CompositeBitmapGlyph(data, format());
106333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  return glyph.Detach();
107333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}
108333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
1096b8e073e978eed96605da6f92d6db740a39864baarthurhsu@google.com}  // namespace sfntly
110