// Copyright 2017 The PDFium Authors
// 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/fpdfapi/page/cpdf_expintfunc.h"

#include <math.h>

#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/fx_memory.h"
#include "core/fxcrt/fx_safe_types.h"
#include "core/fxcrt/stl_util.h"

CPDF_ExpIntFunc::CPDF_ExpIntFunc()
    : CPDF_Function(Type::kType2ExponentialInterpolation) {}

CPDF_ExpIntFunc::~CPDF_ExpIntFunc() = default;

bool CPDF_ExpIntFunc::v_Init(const CPDF_Object* pObj, VisitedSet* pVisited) {
  RetainPtr<const CPDF_Dictionary> pDict = pObj->GetDict();
  if (!pDict)
    return false;

  RetainPtr<const CPDF_Number> pExponent = pDict->GetNumberFor("N");
  if (!pExponent)
    return false;

  m_Exponent = pExponent->GetNumber();

  RetainPtr<const CPDF_Array> pArray0 = pDict->GetArrayFor("C0");
  if (pArray0 && m_nOutputs == 0)
    m_nOutputs = fxcrt::CollectionSize<uint32_t>(*pArray0);
  if (m_nOutputs == 0)
    m_nOutputs = 1;

  RetainPtr<const CPDF_Array> pArray1 = pDict->GetArrayFor("C1");
  m_BeginValues = DataVector<float>(Fx2DSizeOrDie(m_nOutputs, 2));
  m_EndValues = DataVector<float>(m_BeginValues.size());
  for (uint32_t i = 0; i < m_nOutputs; i++) {
    m_BeginValues[i] = pArray0 ? pArray0->GetFloatAt(i) : 0.0f;
    m_EndValues[i] = pArray1 ? pArray1->GetFloatAt(i) : 1.0f;
  }

  FX_SAFE_UINT32 nOutputs = m_nOutputs;
  nOutputs *= m_nInputs;
  if (!nOutputs.IsValid())
    return false;

  m_nOrigOutputs = m_nOutputs;
  m_nOutputs = nOutputs.ValueOrDie();
  return true;
}

bool CPDF_ExpIntFunc::v_Call(pdfium::span<const float> inputs,
                             pdfium::span<float> results) const {
  for (uint32_t i = 0; i < m_nInputs; i++) {
    for (uint32_t j = 0; j < m_nOrigOutputs; j++) {
      results[i * m_nOrigOutputs + j] =
          m_BeginValues[j] +
          powf(inputs[i], m_Exponent) * (m_EndValues[j] - m_BeginValues[j]);
    }
  }
  return true;
}
