// Copyright 2016 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "core/fpdfdoc/cpdf_iconfit.h"

#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fxcrt/fx_string.h"

CPDF_IconFit::CPDF_IconFit(const CPDF_Dictionary* pDict) : m_pDict(pDict) {}

CPDF_IconFit::CPDF_IconFit(const CPDF_IconFit& that) = default;

CPDF_IconFit::~CPDF_IconFit() {}

CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod() {
  if (!m_pDict)
    return Always;

  CFX_ByteString csSW = m_pDict->GetStringFor("SW", "A");
  if (csSW == "B")
    return Bigger;
  if (csSW == "S")
    return Smaller;
  if (csSW == "N")
    return Never;
  return Always;
}

bool CPDF_IconFit::IsProportionalScale() {
  return m_pDict ? m_pDict->GetStringFor("S", "P") != "A" : true;
}

void CPDF_IconFit::GetIconPosition(float& fLeft, float& fBottom) {
  fLeft = fBottom = 0.5;
  if (!m_pDict)
    return;

  CPDF_Array* pA = m_pDict->GetArrayFor("A");
  if (pA) {
    uint32_t dwCount = pA->GetCount();
    if (dwCount > 0)
      fLeft = pA->GetNumberAt(0);
    if (dwCount > 1)
      fBottom = pA->GetNumberAt(1);
  }
}

bool CPDF_IconFit::GetFittingBounds() {
  return m_pDict ? m_pDict->GetBooleanFor("FB") : false;
}
