// 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/fxge/include/ifx_renderdevicedriver.h"

#include "core/fxcrt/include/fx_coordinates.h"
#include "core/fxge/include/cfx_pathdata.h"
#include "core/fxge/include/cfx_renderdevice.h"

IFX_RenderDeviceDriver::~IFX_RenderDeviceDriver() {}

CFX_Matrix IFX_RenderDeviceDriver::GetCTM() const {
  return CFX_Matrix();
}

FX_BOOL IFX_RenderDeviceDriver::StartRendering() {
  return TRUE;
}

void IFX_RenderDeviceDriver::EndRendering() {}

FX_BOOL IFX_RenderDeviceDriver::SetClip_PathStroke(
    const CFX_PathData* pPathData,
    const CFX_Matrix* pObject2Device,
    const CFX_GraphStateData* pGraphState) {
  return FALSE;
}

FX_BOOL IFX_RenderDeviceDriver::SetPixel(int x, int y, uint32_t color) {
  return FALSE;
}

FX_BOOL IFX_RenderDeviceDriver::FillRectWithBlend(const FX_RECT* pRect,
                                                  uint32_t fill_color,
                                                  int blend_type) {
  return FALSE;
}

FX_BOOL IFX_RenderDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
                                                 FX_FLOAT y1,
                                                 FX_FLOAT x2,
                                                 FX_FLOAT y2,
                                                 uint32_t color,
                                                 int blend_type) {
  return FALSE;
}

FX_BOOL IFX_RenderDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap,
                                          int left,
                                          int top) {
  return FALSE;
}

CFX_DIBitmap* IFX_RenderDeviceDriver::GetBackDrop() {
  return nullptr;
}

FX_BOOL IFX_RenderDeviceDriver::ContinueDIBits(void* handle,
                                               IFX_Pause* pPause) {
  return FALSE;
}

void IFX_RenderDeviceDriver::CancelDIBits(void* handle) {}

FX_BOOL IFX_RenderDeviceDriver::DrawDeviceText(int nChars,
                                               const FXTEXT_CHARPOS* pCharPos,
                                               CFX_Font* pFont,
                                               const CFX_Matrix* pObject2Device,
                                               FX_FLOAT font_size,
                                               uint32_t color) {
  return FALSE;
}

void* IFX_RenderDeviceDriver::GetPlatformSurface() const {
  return nullptr;
}

int IFX_RenderDeviceDriver::GetDriverType() const {
  return 0;
}

void IFX_RenderDeviceDriver::ClearDriver() {}

FX_BOOL IFX_RenderDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern,
                                            const CFX_Matrix* pMatrix,
                                            const FX_RECT& clip_rect,
                                            int alpha,
                                            FX_BOOL bAlphaMode) {
  return false;
}

bool IFX_RenderDeviceDriver::SetBitsWithMask(const CFX_DIBSource* pBitmap,
                                             const CFX_DIBSource* pMask,
                                             int left,
                                             int top,
                                             int bitmap_alpha,
                                             int blend_type) {
  return false;
}
