blob: 2329e9b4c21355e045d1f61e3953cb78e018f9d8 [file] [log] [blame]
// Copyright 2017 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_FXGE_DIB_CFX_IMAGETRANSFORMER_H_
#define CORE_FXGE_DIB_CFX_IMAGETRANSFORMER_H_
#include <memory>
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr_exclusion.h"
#include "core/fxge/dib/cfx_bitmapstorer.h"
class CFX_DIBBase;
class CFX_DIBitmap;
class CFX_ImageStretcher;
class PauseIndicatorIface;
class CFX_ImageTransformer {
public:
struct BilinearData {
int res_x;
int res_y;
int src_col_l;
int src_row_l;
int src_col_r;
int src_row_r;
int row_offset_l;
int row_offset_r;
};
struct CalcData {
UNOWNED_PTR_EXCLUSION CFX_DIBitmap* bitmap; // POD struct.
const CFX_Matrix& matrix;
const uint8_t* buf;
uint32_t pitch;
};
CFX_ImageTransformer(const RetainPtr<const CFX_DIBBase>& pSrc,
const CFX_Matrix& matrix,
const FXDIB_ResampleOptions& options,
const FX_RECT* pClip);
~CFX_ImageTransformer();
bool Continue(PauseIndicatorIface* pPause);
const FX_RECT& result() const { return m_result; }
RetainPtr<CFX_DIBitmap> DetachBitmap();
private:
enum class StretchType {
kNone,
kNormal,
kRotate,
kOther,
};
void ContinueRotate(PauseIndicatorIface* pPause);
void ContinueOther(PauseIndicatorIface* pPause);
void CalcAlpha(const CalcData& calc_data);
void CalcMono(const CalcData& calc_data);
void CalcColor(const CalcData& calc_data, FXDIB_Format format, int Bpp);
RetainPtr<const CFX_DIBBase> const m_pSrc;
const CFX_Matrix m_matrix;
FX_RECT m_StretchClip;
FX_RECT m_result;
CFX_Matrix m_dest2stretch;
std::unique_ptr<CFX_ImageStretcher> m_Stretcher;
CFX_BitmapStorer m_Storer;
const FXDIB_ResampleOptions m_ResampleOptions;
StretchType m_type = StretchType::kNone;
};
#endif // CORE_FXGE_DIB_CFX_IMAGETRANSFORMER_H_