// Copyright (c) 2018 The OTS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "hvar.h"

#include "variations.h"

namespace ots {

// -----------------------------------------------------------------------------
// OpenTypeHVAR
// -----------------------------------------------------------------------------

bool OpenTypeHVAR::Parse(const uint8_t* data, size_t length) {
  Buffer table(data, length);

  uint16_t majorVersion;
  uint16_t minorVersion;
  uint32_t itemVariationStoreOffset;
  uint32_t advanceWidthMappingOffset;
  uint32_t lsbMappingOffset;
  uint32_t rsbMappingOffset;

  if (!table.ReadU16(&majorVersion) ||
      !table.ReadU16(&minorVersion) ||
      !table.ReadU32(&itemVariationStoreOffset) ||
      !table.ReadU32(&advanceWidthMappingOffset) ||
      !table.ReadU32(&lsbMappingOffset) ||
      !table.ReadU32(&rsbMappingOffset)) {
    return DropVariations("Failed to read table header");
  }

  if (majorVersion != 1) {
    return DropVariations("Unknown table version");
  }

  if (itemVariationStoreOffset > length ||
      advanceWidthMappingOffset > length ||
      lsbMappingOffset > length ||
      rsbMappingOffset > length) {
    return DropVariations("Invalid subtable offset");
  }

  if (!ParseItemVariationStore(GetFont(), data + itemVariationStoreOffset,
                               length - itemVariationStoreOffset)) {
    return DropVariations("Failed to parse item variation store");
  }

  if (advanceWidthMappingOffset) {
    if (!ParseDeltaSetIndexMap(GetFont(), data + advanceWidthMappingOffset,
                               length - advanceWidthMappingOffset)) {
      return DropVariations("Failed to parse advance width mappings");
    }
  }

  if (lsbMappingOffset) {
    if (!ParseDeltaSetIndexMap(GetFont(), data + lsbMappingOffset,
                               length - lsbMappingOffset)) {
      return DropVariations("Failed to parse LSB mappings");
    }
  }

  if (rsbMappingOffset) {
    if (!ParseDeltaSetIndexMap(GetFont(), data + rsbMappingOffset,
                               length - rsbMappingOffset)) {
      return DropVariations("Failed to parse RSB mappings");
    }
  }

  this->m_data = data;
  this->m_length = length;

  return true;
}

bool OpenTypeHVAR::Serialize(OTSStream* out) {
  if (!out->Write(this->m_data, this->m_length)) {
    return Error("Failed to write HVAR table");
  }

  return true;
}

}  // namespace ots
