// Copyright 2014 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 "../../public/fpdf_edit.h"
#include "../include/fsdk_define.h"

DLLEXPORT FPDF_PAGEOBJECT STDCALL
FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document) {
  if (!document)
    return NULL;
  CPDF_ImageObject* pImageObj = new CPDF_ImageObject;
  CPDF_Image* pImg = new CPDF_Image((CPDF_Document*)document);
  pImageObj->m_pImage = pImg;
  return pImageObj;
}

DLLEXPORT FPDF_BOOL STDCALL
FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages,
                          int nCount,
                          FPDF_PAGEOBJECT image_object,
                          FPDF_FILEACCESS* fileAccess) {
  if (!image_object || !fileAccess || !pages)
    return FALSE;

  IFX_FileRead* pFile = new CPDF_CustomAccess(fileAccess);
  CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;
  pImgObj->m_GeneralState.GetModify();
  for (int index = 0; index < nCount; index++) {
    CPDF_Page* pPage = (CPDF_Page*)pages[index];
    pImgObj->m_pImage->ResetCache(pPage, NULL);
  }
  pImgObj->m_pImage->SetJpegImage(pFile);

  return TRUE;
}

DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,
                                                   double a,
                                                   double b,
                                                   double c,
                                                   double d,
                                                   double e,
                                                   double f) {
  if (!image_object)
    return FALSE;
  CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;
  pImgObj->m_Matrix.a = (FX_FLOAT)a;
  pImgObj->m_Matrix.b = (FX_FLOAT)b;
  pImgObj->m_Matrix.c = (FX_FLOAT)c;
  pImgObj->m_Matrix.d = (FX_FLOAT)d;
  pImgObj->m_Matrix.e = (FX_FLOAT)e;
  pImgObj->m_Matrix.f = (FX_FLOAT)f;
  pImgObj->CalcBoundingBox();
  return TRUE;
}

DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,
                                                   int nCount,
                                                   FPDF_PAGEOBJECT image_object,
                                                   FPDF_BITMAP bitmap) {
  if (!image_object || !bitmap || !pages)
    return FALSE;
  CFX_DIBitmap* pBmp = NULL;
  pBmp = (CFX_DIBitmap*)bitmap;
  CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;
  pImgObj->m_GeneralState.GetModify();
  for (int index = 0; index < nCount; index++) {
    CPDF_Page* pPage = (CPDF_Page*)pages[index];
    pImgObj->m_pImage->ResetCache(pPage, NULL);
  }
  pImgObj->m_pImage->SetImage(pBmp, FALSE);
  pImgObj->CalcBoundingBox();
  return TRUE;
}
