// 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 <algorithm>

#include "../../include/formfiller/FormFiller.h"
#include "../../include/formfiller/FFL_Utils.h"

CPDF_Rect CFFL_Utils::MaxRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2) {
  CPDF_Rect rcRet;

  rcRet.left = std::min(rect1.left, rect2.left);
  rcRet.bottom = std::min(rect1.bottom, rect2.bottom);
  rcRet.right = std::max(rect1.right, rect2.right);
  rcRet.top = std::max(rect1.top, rect2.top);

  return rcRet;
}

CPDF_Rect CFFL_Utils::InflateRect(const CPDF_Rect& crRect,
                                  const FX_FLOAT& fSize) {
  CPDF_Rect crNew(crRect.left - fSize, crRect.bottom - fSize,
                  crRect.right + fSize, crRect.top + fSize);
  crNew.Normalize();
  return crNew;
}

CPDF_Rect CFFL_Utils::DeflateRect(const CPDF_Rect& crRect,
                                  const FX_FLOAT& fSize) {
  CPDF_Rect crNew(crRect.left + fSize, crRect.bottom + fSize,
                  crRect.right - fSize, crRect.top - fSize);
  crNew.Normalize();
  return crNew;
}

FX_BOOL CFFL_Utils::TraceObject(CPDF_Object* pObj) {
  if (!pObj)
    return FALSE;

  FX_DWORD dwObjNum = pObj->GetObjNum();
  switch (pObj->GetType()) {
    case PDFOBJ_ARRAY: {
      CPDF_Array* pArray = (CPDF_Array*)pObj;
      for (FX_DWORD i = 0; i < pArray->GetCount(); i++) {
        CPDF_Object* pElement = pArray->GetElementValue(i);
        TraceObject(pElement);
      }
    } break;

    case PDFOBJ_DICTIONARY: {
      CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;

      FX_POSITION fPos = pDict->GetStartPos();
      CFX_ByteString csKey;
      do {
        CPDF_Object* pElement = pDict->GetNextElement(fPos, csKey);
        // TRACE(csKey + "\n");
        if (!pElement)
          break;
        TraceObject(pElement);
      } while (TRUE);
    } break;

    case PDFOBJ_STREAM: {
      CPDF_Stream* pStream = (CPDF_Stream*)pObj;
      CPDF_Dictionary* pDict = pStream->GetDict();
      TraceObject(pDict);
    } break;

    case PDFOBJ_REFERENCE: {
      CPDF_Object* pDirectObj = pObj->GetDirect();
      TraceObject(pDirectObj);
    } break;

    case PDFOBJ_BOOLEAN:
      break;
    case PDFOBJ_NUMBER:
      // TRACE("%d\n",(int32_t)pObj);
      break;
    case PDFOBJ_STRING:
      // TRACE(((CPDF_String*)pObj)->GetString() + "\n");
      break;
    case PDFOBJ_NAME:
      // TRACE(((CPDF_Name*)pObj)->GetString() + "\n");
      break;
    case PDFOBJ_NULL:
    //	case PDFOBJ_KEYWORD:
    //	case PDFOBJ_EOF:
    default:
      break;
  }
  if (dwObjNum == 0)
    return FALSE;

  return TRUE;
}
