summaryrefslogtreecommitdiff
path: root/core/src/fxge/dib/dib_int.h
blob: 19dc3581334ee5cd4b665c1d75214334d169fff1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// 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

#ifndef _DIB_INT_H_
#define _DIB_INT_H_

class CPDF_FixedMatrix : public CFX_Object
{
public:
    CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)
    {
        base = 1 << bits;
        a = FXSYS_round(src.a * base);
        b = FXSYS_round(src.b * base);
        c = FXSYS_round(src.c * base);
        d = FXSYS_round(src.d * base);
        e = FXSYS_round(src.e * base);
        f = FXSYS_round(src.f * base);
    }
    inline void	Transform(int x, int y, int& x1, int& y1)
    {
        x1 = (a * x + c * y + e + base / 2) / base;
        y1 = (b * x + d * y + f + base / 2) / base;
    }
    int		a, b, c, d, e, f;
    int		base;
};
#define FPDF_HUGE_IMAGE_SIZE	60000000
struct PixelWeight {
    int		m_SrcStart;
    int		m_SrcEnd;
    int		m_Weights[1];
};
class CWeightTable : public CFX_Object
{
public:
    CWeightTable()
    {
        m_pWeightTables = NULL;
    }
    ~CWeightTable()
    {
        if(m_pWeightTables) {
            FX_Free(m_pWeightTables);
        }
        m_pWeightTables = NULL;
    }
    void			Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);
    PixelWeight*	GetPixelWeight(int pixel)
    {
        return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
    }
    int				m_DestMin, m_ItemSize;
    FX_LPBYTE		m_pWeightTables;
};
class CStretchEngine : public CFX_Object
{
public:
    CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
                   int dest_width, int dest_height, const FX_RECT& clip_rect,
                   const CFX_DIBSource* pSrcBitmap, int flags);
    ~CStretchEngine();
    FX_BOOL		Continue(IFX_Pause* pPause);
public:
    FXDIB_Format m_DestFormat;
    int		m_DestBpp, m_SrcBpp, m_bHasAlpha;
    IFX_ScanlineComposer*	m_pDestBitmap;
    int		m_DestWidth, m_DestHeight;
    FX_RECT	m_DestClip;
    FX_LPBYTE	m_pDestScanline;
    FX_LPBYTE   m_pDestMaskScanline;
    FX_RECT	m_SrcClip;
    const CFX_DIBSource*	m_pSource;
    FX_DWORD*	m_pSrcPalette;
    int		m_SrcWidth, m_SrcHeight;
    int		m_SrcPitch, m_InterPitch;
    int m_ExtraMaskPitch;
    unsigned char*	m_pInterBuf;
    unsigned char*	m_pExtraAlphaBuf;
    int		m_TransMethod;
    int 	m_Flags;
    CWeightTable	m_WeightTable;
    int		m_CurRow;
    FX_BOOL	StartStretchHorz();
    FX_BOOL	ContinueStretchHorz(IFX_Pause* pPause);
    void	StretchVert();
    int		m_State;
};

#endif  // _DIB_INT_H_