// 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)
    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)
    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;
}
