// Copyright 2016 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

#ifndef CORE_FPDFAPI_RENDER_CPDF_SCALEDRENDERBUFFER_H_
#define CORE_FPDFAPI_RENDER_CPDF_SCALEDRENDERBUFFER_H_

#include <memory>

#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/unowned_ptr.h"

class CFX_RenderDevice;
class CPDF_PageObject;
class CPDF_RenderContext;
class CPDF_RenderOptions;

class CPDF_ScaledRenderBuffer {
 public:
  CPDF_ScaledRenderBuffer(CFX_RenderDevice* device, const FX_RECT& rect);
  ~CPDF_ScaledRenderBuffer();

  bool Initialize(CPDF_RenderContext* context,
                  const CPDF_PageObject* pObj,
                  const CPDF_RenderOptions& options,
                  int max_dpi);

  CFX_RenderDevice* GetDevice();
  const CFX_Matrix& GetMatrix() const { return matrix_; }
  void OutputToDevice();

 private:
  UnownedPtr<CFX_RenderDevice> const device_;
  std::unique_ptr<CFX_RenderDevice> bitmap_device_;
  const FX_RECT rect_;
  CFX_Matrix matrix_;
};

#endif  // CORE_FPDFAPI_RENDER_CPDF_SCALEDRENDERBUFFER_H_
