Home | History | Annotate | Download | only in dib
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef CORE_SRC_FXGE_DIB_DIB_INT_H_
      8 #define CORE_SRC_FXGE_DIB_DIB_INT_H_
      9 
     10 #include <stdint.h>
     11 
     12 #include "core/include/fxcrt/fx_coordinates.h"
     13 #include "core/include/fxge/fx_dib.h"
     14 
     15 class IFX_ScanlineComposer;
     16 
     17 extern const int16_t SDP_Table[513];
     18 
     19 class CPDF_FixedMatrix {
     20  public:
     21   CPDF_FixedMatrix(const CFX_Matrix& src, int bits) {
     22     base = 1 << bits;
     23     a = FXSYS_round(src.a * base);
     24     b = FXSYS_round(src.b * base);
     25     c = FXSYS_round(src.c * base);
     26     d = FXSYS_round(src.d * base);
     27     e = FXSYS_round(src.e * base);
     28     f = FXSYS_round(src.f * base);
     29   }
     30   inline void Transform(int x, int y, int& x1, int& y1) {
     31     x1 = (a * x + c * y + e + base / 2) / base;
     32     y1 = (b * x + d * y + f + base / 2) / base;
     33   }
     34   int a, b, c, d, e, f;
     35   int base;
     36 };
     37 #define FPDF_HUGE_IMAGE_SIZE 60000000
     38 struct PixelWeight {
     39   int m_SrcStart;
     40   int m_SrcEnd;
     41   int m_Weights[1];
     42 };
     43 class CWeightTable {
     44  public:
     45   CWeightTable() { m_pWeightTables = NULL; }
     46   ~CWeightTable() {
     47     FX_Free(m_pWeightTables);
     48     m_pWeightTables = NULL;
     49   }
     50   void Calc(int dest_len,
     51             int dest_min,
     52             int dest_max,
     53             int src_len,
     54             int src_min,
     55             int src_max,
     56             int flags);
     57   PixelWeight* GetPixelWeight(int pixel) {
     58     return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
     59   }
     60   int m_DestMin, m_ItemSize;
     61   uint8_t* m_pWeightTables;
     62 };
     63 class CStretchEngine {
     64  public:
     65   CStretchEngine(IFX_ScanlineComposer* pDestBitmap,
     66                  FXDIB_Format dest_format,
     67                  int dest_width,
     68                  int dest_height,
     69                  const FX_RECT& clip_rect,
     70                  const CFX_DIBSource* pSrcBitmap,
     71                  int flags);
     72   ~CStretchEngine();
     73   FX_BOOL Continue(IFX_Pause* pPause);
     74 
     75  public:
     76   FXDIB_Format m_DestFormat;
     77   int m_DestBpp, m_SrcBpp, m_bHasAlpha;
     78   IFX_ScanlineComposer* m_pDestBitmap;
     79   int m_DestWidth, m_DestHeight;
     80   FX_RECT m_DestClip;
     81   uint8_t* m_pDestScanline;
     82   uint8_t* m_pDestMaskScanline;
     83   FX_RECT m_SrcClip;
     84   const CFX_DIBSource* m_pSource;
     85   FX_DWORD* m_pSrcPalette;
     86   int m_SrcWidth, m_SrcHeight;
     87   int m_SrcPitch, m_InterPitch;
     88   int m_ExtraMaskPitch;
     89   unsigned char* m_pInterBuf;
     90   unsigned char* m_pExtraAlphaBuf;
     91   int m_TransMethod;
     92   int m_Flags;
     93   CWeightTable m_WeightTable;
     94   int m_CurRow;
     95   FX_BOOL StartStretchHorz();
     96   FX_BOOL ContinueStretchHorz(IFX_Pause* pPause);
     97   void StretchVert();
     98   int m_State;
     99 };
    100 
    101 FX_RECT FXDIB_SwapClipBox(FX_RECT& clip,
    102                           int width,
    103                           int height,
    104                           FX_BOOL bFlipX,
    105                           FX_BOOL bFlipY);
    106 
    107 #endif  // CORE_SRC_FXGE_DIB_DIB_INT_H_
    108