/*
 * Copyright 2011 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "sfntly/table/bitmap/bitmap_glyph_info.h"

namespace sfntly {

BitmapGlyphInfo::BitmapGlyphInfo(int32_t glyph_id,
                                 int32_t block_offset,
                                 int32_t start_offset,
                                 int32_t length,
                                 int32_t format)
    : glyph_id_(glyph_id),
      relative_(true),
      block_offset_(block_offset),
      start_offset_(start_offset),
      length_(length),
      format_(format) {
}

BitmapGlyphInfo::BitmapGlyphInfo(int32_t glyph_id,
                                 int32_t start_offset,
                                 int32_t length,
                                 int32_t format)
    : glyph_id_(glyph_id),
      relative_(false),
      block_offset_(0),
      start_offset_(start_offset),
      length_(length),
      format_(format) {
}

bool BitmapGlyphInfo::operator==(const BitmapGlyphInfo& rhs) const {
  return (format_ == rhs.format_ &&
          glyph_id_ == rhs.glyph_id_ &&
          length_ == rhs.length_ &&
          offset() == rhs.offset());
}

bool BitmapGlyphInfo::operator==(BitmapGlyphInfo* rhs) {
  if (rhs == NULL) {
    return false;  // Well defined C++ code's this is always not null.
  }
  return (format_ == rhs->format() &&
          glyph_id_ == rhs->glyph_id() &&
          length_ == rhs->length() &&
          offset() == rhs->offset());
}

bool StartOffsetComparator::operator()(BitmapGlyphInfo* lhs,
                                       BitmapGlyphInfo* rhs) {
  return lhs->start_offset() > rhs->start_offset();
}

}  // namespace sfntly
