C++程序  |  413行  |  18.55 KB

// 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 FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_

#include "PWL_Wnd.h"
#include "core/include/fpdfapi/fpdf_parser.h"  // For CPDF_Point.
#include "core/include/fpdfdoc/fpdf_vt.h"      // For CPVT_WordRange.
#include "fpdfsdk/include/fxedit/fx_edit.h"

class CFX_PathData;
struct CPWL_Color;

template <class T>
T PWL_MIN(const T& i, const T& j) {
  return ((i < j) ? i : j);
}
template <class T>
T PWL_MAX(const T& i, const T& j) {
  return ((i > j) ? i : j);
}

#define PWL_PDF2WIN(color) (uint8_t(color * 255))
#define PWL_WIN2PDF(color) ((FX_FLOAT)((FX_FLOAT)color / 255.0f))

#define PWL_MAKEDWORD(low, high) \
  ((FX_DWORD)((FX_WORD)(low) | (FX_DWORD)(((FX_WORD)(high)) << 16)))
#define PWL_GETLOWWORD(dword) ((FX_WORD)(dword))
#define PWL_GETHIGHWORD(dword) ((FX_WORD)(dword >> 16))

#define PWL_ICONTYPE_CHECKMARK 0
#define PWL_ICONTYPE_CIRCLE 1
#define PWL_ICONTYPE_COMMENT 2
#define PWL_ICONTYPE_CROSS 3
#define PWL_ICONTYPE_HELP 4
#define PWL_ICONTYPE_INSERTTEXT 5
#define PWL_ICONTYPE_KEY 6
#define PWL_ICONTYPE_NEWPARAGRAPH 7
#define PWL_ICONTYPE_TEXTNOTE 8
#define PWL_ICONTYPE_PARAGRAPH 9
#define PWL_ICONTYPE_RIGHTARROW 10
#define PWL_ICONTYPE_RIGHTPOINTER 11
#define PWL_ICONTYPE_STAR 12
#define PWL_ICONTYPE_UPARROW 13
#define PWL_ICONTYPE_UPLEFTARROW 14

#define PWL_ICONTYPE_GRAPH 15
#define PWL_ICONTYPE_PAPERCLIP 16
#define PWL_ICONTYPE_ATTACHMENT 17
#define PWL_ICONTYPE_TAG 18

#define PWL_ICONTYPE_FOXIT 19

#define PWL_ICONTYPE_UNKNOWN -1

// checkbox & radiobutton style
#define PCS_CHECK 0
#define PCS_CIRCLE 1
#define PCS_CROSS 2
#define PCS_DIAMOND 3
#define PCS_SQUARE 4
#define PCS_STAR 5

#define PWL_PI 3.14159265358979f
#define PWL_BEZIER 0.5522847498308f

// pushbutton layout style
#define PPBL_LABEL 0
#define PPBL_ICON 1
#define PPBL_ICONTOPLABELBOTTOM 2
#define PPBL_LABELTOPICONBOTTOM 3
#define PPBL_ICONLEFTLABELRIGHT 4
#define PPBL_LABELLEFTICONRIGHT 5
#define PPBL_LABELOVERICON 6

class CPWL_Point : public CPDF_Point {
 public:
  CPWL_Point() : CPDF_Point(0.0f, 0.0f) {}
  CPWL_Point(FX_FLOAT fx, FX_FLOAT fy) : CPDF_Point(fx, fy) {}
  CPWL_Point(const CPWL_Point& point) : CPDF_Point(point.x, point.y) {}
};

enum PWL_PATHDATA_TYPE {
  PWLPT_MOVETO,
  PWLPT_LINETO,
  PWLPT_BEZIERTO,
  PWLPT_UNKNOWN
};

enum PWL_PATH_TYPE { PWLPT_PATHDATA, PWLPT_STREAM };

class CPWL_PathData {
 public:
  CPWL_PathData() : point(), type(PWLPT_UNKNOWN) {}
  CPWL_PathData(const CPWL_Point& pt, PWL_PATHDATA_TYPE tp)
      : point(pt), type(tp) {}

  CPWL_Point point;
  PWL_PATHDATA_TYPE type;
};

class IPWL_SpellCheck;

class CPWL_Utils {
 public:
  static CPDF_Rect InflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
  static CPDF_Rect DeflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
  static FX_BOOL IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2);
  static FX_BOOL ContainsRect(const CPDF_Rect& rcParent,
                              const CPDF_Rect& rcChild);
  static CPDF_Rect ScaleRect(const CPDF_Rect& rcRect, FX_FLOAT fScale);
  static CPVT_WordRange OverlapWordRange(const CPVT_WordRange& wr1,
                                         const CPVT_WordRange& wr2);
  static CPDF_Rect GetCenterSquare(const CPDF_Rect& rect);
  static CPWL_Color SubstractColor(const CPWL_Color& sColor,
                                   FX_FLOAT fColorSub);
  static CPWL_Color DevideColor(const CPWL_Color& sColor,
                                FX_FLOAT fColorDevide);
  static CPDF_Rect MaxRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2);
  static CPDF_Rect OffsetRect(const CPDF_Rect& rect, FX_FLOAT x, FX_FLOAT y);
  static CPDF_Point OffsetPoint(const CPDF_Point& point,
                                FX_FLOAT x,
                                FX_FLOAT y);
  static FX_COLORREF PWLColorToFXColor(const CPWL_Color& color,
                                       int32_t nTransparancy = 255);
  static FX_BOOL IsBlackOrWhite(const CPWL_Color& color);
  static CPWL_Color GetReverseColor(const CPWL_Color& color);

  static CFX_ByteString GetColorAppStream(const CPWL_Color& color,
                                          const FX_BOOL& bFillOrStroke = TRUE);
  static CFX_ByteString GetBorderAppStream(const CPDF_Rect& rect,
                                           FX_FLOAT fWidth,
                                           const CPWL_Color& color,
                                           const CPWL_Color& crLeftTop,
                                           const CPWL_Color& crRightBottom,
                                           int32_t nStyle,
                                           const CPWL_Dash& dash);
  static CFX_ByteString GetCircleBorderAppStream(
      const CPDF_Rect& rect,
      FX_FLOAT fWidth,
      const CPWL_Color& color,
      const CPWL_Color& crLeftTop,
      const CPWL_Color& crRightBottom,
      int32_t nStyle,
      const CPWL_Dash& dash);
  static CFX_ByteString GetRectFillAppStream(const CPDF_Rect& rect,
                                             const CPWL_Color& color);
  static CFX_ByteString GetCircleFillAppStream(const CPDF_Rect& rect,
                                               const CPWL_Color& color);

  static CFX_ByteString GetPushButtonAppStream(const CPDF_Rect& rcBBox,
                                               IFX_Edit_FontMap* pFontMap,
                                               CPDF_Stream* pIconStream,
                                               CPDF_IconFit& IconFit,
                                               const CFX_WideString& sLabel,
                                               const CPWL_Color& crText,
                                               FX_FLOAT fFontSize,
                                               int32_t nLayOut);
  static CFX_ByteString GetCheckBoxAppStream(const CPDF_Rect& rcBBox,
                                             int32_t nStyle,
                                             const CPWL_Color& crText);
  static CFX_ByteString GetRadioButtonAppStream(const CPDF_Rect& rcBBox,
                                                int32_t nStyle,
                                                const CPWL_Color& crText);

  static CFX_ByteString GetEditAppStream(IFX_Edit* pEdit,
                                         const CPDF_Point& ptOffset,
                                         const CPVT_WordRange* pRange = NULL,
                                         FX_BOOL bContinuous = TRUE,
                                         FX_WORD SubWord = 0);
  static CFX_ByteString GetEditSelAppStream(
      IFX_Edit* pEdit,
      const CPDF_Point& ptOffset,
      const CPVT_WordRange* pRange = NULL);
  static CFX_ByteString GetSpellCheckAppStream(
      IFX_Edit* pEdit,
      IPWL_SpellCheck* pSpellCheck,
      const CPDF_Point& ptOffset,
      const CPVT_WordRange* pRange = NULL);
  static CFX_ByteString GetTextAppStream(const CPDF_Rect& rcBBox,
                                         IFX_Edit_FontMap* pFontMap,
                                         const CFX_WideString& sText,
                                         int32_t nAlignmentH,
                                         int32_t nAlignmentV,
                                         FX_FLOAT fFontSize,
                                         FX_BOOL bMultiLine,
                                         FX_BOOL bAutoReturn,
                                         const CPWL_Color& crText);
  static CFX_ByteString GetDropButtonAppStream(const CPDF_Rect& rcBBox);

  static void DrawFillRect(CFX_RenderDevice* pDevice,
                           CFX_Matrix* pUser2Device,
                           const CPDF_Rect& rect,
                           const CPWL_Color& color,
                           int32_t nTransparancy);
  static void DrawFillRect(CFX_RenderDevice* pDevice,
                           CFX_Matrix* pUser2Device,
                           const CPDF_Rect& rect,
                           const FX_COLORREF& color);
  static void DrawStrokeRect(CFX_RenderDevice* pDevice,
                             CFX_Matrix* pUser2Device,
                             const CPDF_Rect& rect,
                             const FX_COLORREF& color,
                             FX_FLOAT fWidth);
  static void DrawStrokeLine(CFX_RenderDevice* pDevice,
                             CFX_Matrix* pUser2Device,
                             const CPDF_Point& ptMoveTo,
                             const CPDF_Point& ptLineTo,
                             const FX_COLORREF& color,
                             FX_FLOAT fWidth);
  static void DrawBorder(CFX_RenderDevice* pDevice,
                         CFX_Matrix* pUser2Device,
                         const CPDF_Rect& rect,
                         FX_FLOAT fWidth,
                         const CPWL_Color& color,
                         const CPWL_Color& crLeftTop,
                         const CPWL_Color& crRightBottom,
                         int32_t nStyle,
                         int32_t nTransparancy);
  static void DrawFillArea(CFX_RenderDevice* pDevice,
                           CFX_Matrix* pUser2Device,
                           const CPDF_Point* pPts,
                           int32_t nCount,
                           const FX_COLORREF& color);
  static void DrawShadow(CFX_RenderDevice* pDevice,
                         CFX_Matrix* pUser2Device,
                         FX_BOOL bVertical,
                         FX_BOOL bHorizontal,
                         CPDF_Rect rect,
                         int32_t nTransparancy,
                         int32_t nStartGray,
                         int32_t nEndGray);
  static void DrawEditSpellCheck(CFX_RenderDevice* pDevice,
                                 CFX_Matrix* pUser2Device,
                                 IFX_Edit* pEdit,
                                 const CPDF_Rect& rcClip,
                                 const CPDF_Point& ptOffset,
                                 const CPVT_WordRange* pRange,
                                 IPWL_SpellCheck* pSpellCheck);

 public:
  static void ConvertCMYK2RGB(FX_FLOAT dC,
                              FX_FLOAT dM,
                              FX_FLOAT dY,
                              FX_FLOAT dK,
                              FX_FLOAT& dR,
                              FX_FLOAT& dG,
                              FX_FLOAT& dB);
  static void ConvertRGB2CMYK(FX_FLOAT dR,
                              FX_FLOAT dG,
                              FX_FLOAT dB,
                              FX_FLOAT& dC,
                              FX_FLOAT& dM,
                              FX_FLOAT& dY,
                              FX_FLOAT& dK);

  static void ConvertRGB2GRAY(FX_FLOAT dR,
                              FX_FLOAT dG,
                              FX_FLOAT dB,
                              FX_FLOAT& dGray);
  static void ConvertGRAY2RGB(FX_FLOAT dGray,
                              FX_FLOAT& dR,
                              FX_FLOAT& dG,
                              FX_FLOAT& dB);

  static void ConvertCMYK2GRAY(FX_FLOAT dC,
                               FX_FLOAT dM,
                               FX_FLOAT dY,
                               FX_FLOAT dK,
                               FX_FLOAT& dGray);
  static void ConvertGRAY2CMYK(FX_FLOAT dGray,
                               FX_FLOAT& dC,
                               FX_FLOAT& dM,
                               FX_FLOAT& dY,
                               FX_FLOAT& dK);

  static void PWLColorToARGB(const CPWL_Color& color,
                             int32_t& alpha,
                             FX_FLOAT& red,
                             FX_FLOAT& green,
                             FX_FLOAT& blue);

 public:
  static CFX_ByteString GetIconAppStream(
      int32_t nType,
      const CPDF_Rect& rect,
      const CPWL_Color& crFill,
      const CPWL_Color& crStroke = PWL_DEFAULT_BLACKCOLOR);
  static void DrawIconAppStream(CFX_RenderDevice* pDevice,
                                CFX_Matrix* pUser2Device,
                                int32_t nType,
                                const CPDF_Rect& rect,
                                const CPWL_Color& crFill,
                                const CPWL_Color& crStroke,
                                const int32_t nTransparancy);

 private:
  static CFX_ByteString GetAppStreamFromArray(const CPWL_PathData* pPathData,
                                              int32_t nCount);
  static void GetPathDataFromArray(CFX_PathData& path,
                                   const CPWL_PathData* pPathData,
                                   int32_t nCount);

  static CFX_ByteString GetAppStream_Check(const CPDF_Rect& rcBBox,
                                           const CPWL_Color& crText);
  static CFX_ByteString GetAppStream_Circle(const CPDF_Rect& rcBBox,
                                            const CPWL_Color& crText);
  static CFX_ByteString GetAppStream_Cross(const CPDF_Rect& rcBBox,
                                           const CPWL_Color& crText);
  static CFX_ByteString GetAppStream_Diamond(const CPDF_Rect& rcBBox,
                                             const CPWL_Color& crText);
  static CFX_ByteString GetAppStream_Square(const CPDF_Rect& rcBBox,
                                            const CPWL_Color& crText);
  static CFX_ByteString GetAppStream_Star(const CPDF_Rect& rcBBox,
                                          const CPWL_Color& crText);

  static CFX_ByteString GetAP_Check(const CPDF_Rect& crBBox);
  static CFX_ByteString GetAP_Circle(const CPDF_Rect& crBBox);
  static CFX_ByteString GetAP_Cross(const CPDF_Rect& crBBox);
  static CFX_ByteString GetAP_Diamond(const CPDF_Rect& crBBox);
  static CFX_ByteString GetAP_Square(const CPDF_Rect& crBBox);
  static CFX_ByteString GetAP_Star(const CPDF_Rect& crBBox);
  static CFX_ByteString GetAP_HalfCircle(const CPDF_Rect& crBBox,
                                         FX_FLOAT fRotate);

  static void GetGraphics_Checkmark(CFX_ByteString& sPathData,
                                    CFX_PathData& path,
                                    const CPDF_Rect& crBBox,
                                    const PWL_PATH_TYPE type);
  static void GetGraphics_Circle(CFX_ByteString& sPathData,
                                 CFX_PathData& path,
                                 const CPDF_Rect& crBBox,
                                 const PWL_PATH_TYPE type);
  static void GetGraphics_Comment(CFX_ByteString& sPathData,
                                  CFX_PathData& path,
                                  const CPDF_Rect& crBBox,
                                  const PWL_PATH_TYPE type);
  static void GetGraphics_Cross(CFX_ByteString& sPathData,
                                CFX_PathData& path,
                                const CPDF_Rect& crBBox,
                                const PWL_PATH_TYPE type);
  static void GetGraphics_Help(CFX_ByteString& sPathData,
                               CFX_PathData& path,
                               const CPDF_Rect& crBBox,
                               const PWL_PATH_TYPE type);
  static void GetGraphics_InsertText(CFX_ByteString& sPathData,
                                     CFX_PathData& path,
                                     const CPDF_Rect& crBBox,
                                     const PWL_PATH_TYPE type);
  static void GetGraphics_Key(CFX_ByteString& sPathData,
                              CFX_PathData& path,
                              const CPDF_Rect& crBBox,
                              const PWL_PATH_TYPE type);
  static void GetGraphics_NewParagraph(CFX_ByteString& sPathData,
                                       CFX_PathData& path,
                                       const CPDF_Rect& crBBox,
                                       const PWL_PATH_TYPE type);
  static void GetGraphics_TextNote(CFX_ByteString& sPathData,
                                   CFX_PathData& path,
                                   const CPDF_Rect& crBBox,
                                   const PWL_PATH_TYPE type);
  static void GetGraphics_Paragraph(CFX_ByteString& sPathData,
                                    CFX_PathData& path,
                                    const CPDF_Rect& crBBox,
                                    const PWL_PATH_TYPE type);
  static void GetGraphics_RightArrow(CFX_ByteString& sPathData,
                                     CFX_PathData& path,
                                     const CPDF_Rect& crBBox,
                                     const PWL_PATH_TYPE type);
  static void GetGraphics_RightPointer(CFX_ByteString& sPathData,
                                       CFX_PathData& path,
                                       const CPDF_Rect& crBBox,
                                       const PWL_PATH_TYPE type);
  static void GetGraphics_Star(CFX_ByteString& sPathData,
                               CFX_PathData& path,
                               const CPDF_Rect& crBBox,
                               const PWL_PATH_TYPE type);
  static void GetGraphics_UpArrow(CFX_ByteString& sPathData,
                                  CFX_PathData& path,
                                  const CPDF_Rect& crBBox,
                                  const PWL_PATH_TYPE type);
  static void GetGraphics_UpLeftArrow(CFX_ByteString& sPathData,
                                      CFX_PathData& path,
                                      const CPDF_Rect& crBBox,
                                      const PWL_PATH_TYPE type);
  static void GetGraphics_Graph(CFX_ByteString& sPathData,
                                CFX_PathData& path,
                                const CPDF_Rect& crBBox,
                                const PWL_PATH_TYPE type);
  static void GetGraphics_Paperclip(CFX_ByteString& sPathData,
                                    CFX_PathData& path,
                                    const CPDF_Rect& crBBox,
                                    const PWL_PATH_TYPE type);
  static void GetGraphics_Attachment(CFX_ByteString& sPathData,
                                     CFX_PathData& path,
                                     const CPDF_Rect& crBBox,
                                     const PWL_PATH_TYPE type);
  static void GetGraphics_Tag(CFX_ByteString& sPathData,
                              CFX_PathData& path,
                              const CPDF_Rect& crBBox,
                              const PWL_PATH_TYPE type);
  static void GetGraphics_Foxit(CFX_ByteString& sPathData,
                                CFX_PathData& path,
                                const CPDF_Rect& crBBox,
                                const PWL_PATH_TYPE type);
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_UTILS_H_