| Index: xfa/include/fxgraphics/fx_graphics.h
 | 
| diff --git a/xfa/include/fxgraphics/fx_graphics.h b/xfa/include/fxgraphics/fx_graphics.h
 | 
| index c22d00995eee7e0b6ca41f0e285058d1b2778ddc..c2d22719d9f98137529f25cf8f197d7225230308 100644
 | 
| --- a/xfa/include/fxgraphics/fx_graphics.h
 | 
| +++ b/xfa/include/fxgraphics/fx_graphics.h
 | 
| @@ -101,115 +101,96 @@ class CFX_DIBitmap;
 | 
|  class CFX_Font;
 | 
|  class CFX_WideString;
 | 
|  class CFX_PathGenerator;
 | 
| -class CAGG_Graphics;
 | 
|  class CFX_Graphics;
 | 
|  class CFX_Color;
 | 
|  class CFX_Path;
 | 
|  class CFX_Pattern;
 | 
|  class CFX_Shading;
 | 
| +
 | 
| +class CAGG_Graphics {
 | 
| + public:
 | 
| +  CAGG_Graphics();
 | 
| +  virtual ~CAGG_Graphics();
 | 
| +
 | 
| +  FX_ERR Create(CFX_Graphics* owner,
 | 
| +                int32_t width,
 | 
| +                int32_t height,
 | 
| +                FXDIB_Format format);
 | 
| +
 | 
| + private:
 | 
| +  CFX_Graphics* m_owner;
 | 
| +};
 | 
| +
 | 
|  class CFX_Graphics {
 | 
|   public:
 | 
|    CFX_Graphics();
 | 
| +  virtual ~CFX_Graphics();
 | 
|  
 | 
|    FX_ERR Create(CFX_RenderDevice* renderDevice, FX_BOOL isAntialiasing = TRUE);
 | 
| -
 | 
|    FX_ERR Create(int32_t width,
 | 
|                  int32_t height,
 | 
|                  FXDIB_Format format,
 | 
|                  FX_BOOL isNative = TRUE,
 | 
|                  FX_BOOL isAntialiasing = TRUE);
 | 
|  
 | 
| -  virtual ~CFX_Graphics();
 | 
| -
 | 
|    FX_ERR GetDeviceCap(const int32_t capID, FX_DeviceCap& capVal);
 | 
|    FX_ERR IsPrinterDevice(FX_BOOL& isPrinter);
 | 
|    FX_ERR EnableAntialiasing(FX_BOOL isAntialiasing);
 | 
|  
 | 
|    FX_ERR SaveGraphState();
 | 
| -
 | 
|    FX_ERR RestoreGraphState();
 | 
|  
 | 
| -  FX_ERR GetLineCap(CFX_GraphStateData::LineCap& lineCap);
 | 
| +  FX_ERR GetLineCap(CFX_GraphStateData::LineCap& lineCap) const;
 | 
| +  FX_ERR GetDashCount(int32_t& dashCount) const;
 | 
| +  FX_ERR GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray) const;
 | 
| +  FX_ERR GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin) const;
 | 
| +  FX_ERR GetMiterLimit(FX_FLOAT& miterLimit) const;
 | 
| +  FX_ERR GetLineWidth(FX_FLOAT& lineWidth) const;
 | 
| +  FX_ERR GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment) const;
 | 
| +  FX_ERR GetClipRect(CFX_RectF& rect) const;
 | 
| +  CFX_Matrix* GetMatrix();
 | 
| +  CFX_RenderDevice* GetRenderDevice();
 | 
|  
 | 
|    FX_ERR SetLineCap(CFX_GraphStateData::LineCap lineCap);
 | 
| -
 | 
| -  FX_ERR GetDashCount(int32_t& dashCount);
 | 
| -
 | 
| -  FX_ERR GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray);
 | 
| -
 | 
|    FX_ERR SetLineDash(FX_FLOAT dashPhase,
 | 
|                       FX_FLOAT* dashArray,
 | 
|                       int32_t dashCount);
 | 
| -
 | 
|    FX_ERR SetLineDash(FX_DashStyle dashStyle);
 | 
| -
 | 
| -  FX_ERR GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin);
 | 
| -
 | 
|    FX_ERR SetLineJoin(CFX_GraphStateData::LineJoin lineJoin);
 | 
| -
 | 
| -  FX_ERR GetMiterLimit(FX_FLOAT& miterLimit);
 | 
| -
 | 
|    FX_ERR SetMiterLimit(FX_FLOAT miterLimit);
 | 
| -
 | 
| -  FX_ERR GetLineWidth(FX_FLOAT& lineWidth);
 | 
| -
 | 
|    FX_ERR SetLineWidth(FX_FLOAT lineWidth, FX_BOOL isActOnDash = FALSE);
 | 
| -
 | 
| -  FX_ERR GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment);
 | 
| -
 | 
|    FX_ERR SetStrokeAlignment(FX_StrokeAlignment strokeAlignment);
 | 
| -
 | 
|    FX_ERR SetStrokeColor(CFX_Color* color);
 | 
| -
 | 
|    FX_ERR SetFillColor(CFX_Color* color);
 | 
| +  FX_ERR SetClipRect(const CFX_RectF& rect);
 | 
| +  FX_ERR SetFont(CFX_Font* font);
 | 
| +  FX_ERR SetFontSize(const FX_FLOAT size);
 | 
| +  FX_ERR SetFontHScale(const FX_FLOAT scale);
 | 
| +  FX_ERR SetCharSpacing(const FX_FLOAT spacing);
 | 
| +  FX_ERR SetTextDrawingMode(const int32_t mode);
 | 
|  
 | 
|    FX_ERR StrokePath(CFX_Path* path, CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR FillPath(CFX_Path* path,
 | 
|                    FX_FillMode fillMode = FXFILL_WINDING,
 | 
|                    CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR ClipPath(CFX_Path* path,
 | 
|                    FX_FillMode fillMode = FXFILL_WINDING,
 | 
|                    CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR DrawImage(CFX_DIBSource* source,
 | 
|                     const CFX_PointF& point,
 | 
|                     CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR StretchImage(CFX_DIBSource* source,
 | 
|                        const CFX_RectF& rect,
 | 
|                        CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR ConcatMatrix(const CFX_Matrix* matrix);
 | 
| -
 | 
| -  CFX_Matrix* GetMatrix();
 | 
| -
 | 
| -  FX_ERR GetClipRect(CFX_RectF& rect);
 | 
| -
 | 
| -  FX_ERR SetClipRect(const CFX_RectF& rect);
 | 
| -
 | 
|    FX_ERR ClearClip();
 | 
| -
 | 
| -  FX_ERR SetFont(CFX_Font* font);
 | 
| -
 | 
| -  FX_ERR SetFontSize(const FX_FLOAT size);
 | 
| -
 | 
| -  FX_ERR SetFontHScale(const FX_FLOAT scale);
 | 
| -
 | 
| -  FX_ERR SetCharSpacing(const FX_FLOAT spacing);
 | 
| -
 | 
| -  FX_ERR SetTextDrawingMode(const int32_t mode);
 | 
| -
 | 
|    FX_ERR ShowText(const CFX_PointF& point,
 | 
|                    const CFX_WideString& text,
 | 
|                    CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR CalcTextRect(CFX_RectF& rect,
 | 
|                        const CFX_WideString& text,
 | 
|                        FX_BOOL isMultiline = FALSE,
 | 
|                        CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR Transfer(CFX_Graphics* graphics, const CFX_Matrix* matrix);
 | 
|    FX_ERR Transfer(CFX_Graphics* graphics,
 | 
|                    FX_FLOAT srcLeft,
 | 
| @@ -217,44 +198,36 @@ class CFX_Graphics {
 | 
|                    const CFX_RectF& dstRect,
 | 
|                    const CFX_Matrix* matrix);
 | 
|  
 | 
| -  CFX_RenderDevice* GetRenderDevice();
 | 
| -
 | 
|    FX_ERR InverseRect(const CFX_RectF& rect);
 | 
|    FX_ERR XorDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect);
 | 
|    FX_ERR EqvDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect);
 | 
|  
 | 
|   private:
 | 
|    FX_ERR RenderDeviceSetLineDash(FX_DashStyle dashStyle);
 | 
| -
 | 
|    FX_ERR RenderDeviceStrokePath(CFX_Path* path, CFX_Matrix* matrix);
 | 
| -
 | 
|    FX_ERR RenderDeviceFillPath(CFX_Path* path,
 | 
|                                FX_FillMode fillMode,
 | 
|                                CFX_Matrix* matrix);
 | 
| -
 | 
|    FX_ERR RenderDeviceDrawImage(CFX_DIBSource* source,
 | 
|                                 const CFX_PointF& point,
 | 
|                                 CFX_Matrix* matrix);
 | 
| -
 | 
|    FX_ERR RenderDeviceStretchImage(CFX_DIBSource* source,
 | 
|                                    const CFX_RectF& rect,
 | 
|                                    CFX_Matrix* matrix);
 | 
| -
 | 
|    FX_ERR RenderDeviceShowText(const CFX_PointF& point,
 | 
|                                const CFX_WideString& text,
 | 
|                                CFX_Matrix* matrix);
 | 
|  
 | 
|    FX_ERR StrokePathWithPattern(CFX_Path* path, CFX_Matrix* matrix);
 | 
| -
 | 
|    FX_ERR StrokePathWithShading(CFX_Path* path, CFX_Matrix* matrix);
 | 
|  
 | 
|    FX_ERR FillPathWithPattern(CFX_Path* path,
 | 
|                               FX_FillMode fillMode,
 | 
|                               CFX_Matrix* matrix);
 | 
| -
 | 
|    FX_ERR FillPathWithShading(CFX_Path* path,
 | 
|                               FX_FillMode fillMode,
 | 
|                               CFX_Matrix* matrix);
 | 
| +
 | 
|    FX_ERR SetDIBitsWithMatrix(CFX_DIBSource* source, CFX_Matrix* matrix);
 | 
|    FX_ERR CalcTextInfo(const CFX_WideString& text,
 | 
|                        FX_DWORD* charCodes,
 | 
| @@ -262,57 +235,64 @@ class CFX_Graphics {
 | 
|                        CFX_RectF& rect);
 | 
|  
 | 
|   protected:
 | 
| -  int32_t _type;
 | 
| +  int32_t m_type;
 | 
|  
 | 
|   private:
 | 
|    struct TInfo {
 | 
| -    CFX_GraphStateData _graphState;
 | 
| -    FX_BOOL _isAntialiasing;
 | 
| -    FX_StrokeAlignment _strokeAlignment;
 | 
| -    CFX_Matrix _CTM;
 | 
| -    FX_BOOL _isActOnDash;
 | 
| -    CFX_Color* _strokeColor;
 | 
| -    CFX_Color* _fillColor;
 | 
| -    CFX_Font* _font;
 | 
| -    FX_FLOAT _fontSize;
 | 
| -    FX_FLOAT _fontHScale;
 | 
| -    FX_FLOAT _fontSpacing;
 | 
| -  } _info;
 | 
| -  CFX_RenderDevice* _renderDevice;
 | 
| -  CFX_PtrArray _infoStack;
 | 
| -  CAGG_Graphics* _aggGraphics;
 | 
| +    TInfo()
 | 
| +        : isAntialiasing(TRUE),
 | 
| +          strokeAlignment(FX_STROKEALIGNMENT_Center),
 | 
| +          isActOnDash(FALSE),
 | 
| +          strokeColor(nullptr),
 | 
| +          fillColor(nullptr),
 | 
| +          font(nullptr),
 | 
| +          fontSize(40.0),
 | 
| +          fontHScale(1.0),
 | 
| +          fontSpacing(0.0) {}
 | 
| +    explicit TInfo(const TInfo& info);
 | 
| +    TInfo& operator=(const TInfo& other);
 | 
| +
 | 
| +    CFX_GraphStateData graphState;
 | 
| +    FX_BOOL isAntialiasing;
 | 
| +    FX_StrokeAlignment strokeAlignment;
 | 
| +    CFX_Matrix CTM;
 | 
| +    FX_BOOL isActOnDash;
 | 
| +    CFX_Color* strokeColor;
 | 
| +    CFX_Color* fillColor;
 | 
| +    CFX_Font* font;
 | 
| +    FX_FLOAT fontSize;
 | 
| +    FX_FLOAT fontHScale;
 | 
| +    FX_FLOAT fontSpacing;
 | 
| +  } m_info;
 | 
| +  CFX_RenderDevice* m_renderDevice;
 | 
| +  CFX_PtrArray m_infoStack;
 | 
| +  CAGG_Graphics* m_aggGraphics;
 | 
|    friend class CAGG_Graphics;
 | 
|  };
 | 
| +
 | 
|  class CFX_Path {
 | 
|   public:
 | 
|    CFX_Path();
 | 
| -
 | 
| -  FX_ERR Create();
 | 
| -
 | 
|    virtual ~CFX_Path();
 | 
|  
 | 
| +  FX_ERR Create();
 | 
|    FX_ERR MoveTo(FX_FLOAT x, FX_FLOAT y);
 | 
| -
 | 
|    FX_ERR LineTo(FX_FLOAT x, FX_FLOAT y);
 | 
| -
 | 
|    FX_ERR BezierTo(FX_FLOAT ctrlX1,
 | 
|                    FX_FLOAT ctrlY1,
 | 
|                    FX_FLOAT ctrlX2,
 | 
|                    FX_FLOAT ctrlY2,
 | 
|                    FX_FLOAT toX,
 | 
|                    FX_FLOAT toY);
 | 
| -
 | 
|    FX_ERR ArcTo(FX_FLOAT left,
 | 
|                 FX_FLOAT top,
 | 
|                 FX_FLOAT width,
 | 
|                 FX_FLOAT height,
 | 
|                 FX_FLOAT startAngle,
 | 
|                 FX_FLOAT sweepAngle);
 | 
| -
 | 
|    FX_ERR Close();
 | 
|  
 | 
|    FX_ERR AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
 | 
| -
 | 
|    FX_ERR AddBezier(FX_FLOAT startX,
 | 
|                     FX_FLOAT startY,
 | 
|                     FX_FLOAT ctrlX1,
 | 
| @@ -321,116 +301,105 @@ class CFX_Path {
 | 
|                     FX_FLOAT ctrlY2,
 | 
|                     FX_FLOAT endX,
 | 
|                     FX_FLOAT endY);
 | 
| -
 | 
|    FX_ERR AddRectangle(FX_FLOAT left,
 | 
|                        FX_FLOAT top,
 | 
|                        FX_FLOAT width,
 | 
|                        FX_FLOAT height);
 | 
| -
 | 
|    FX_ERR AddEllipse(FX_FLOAT left,
 | 
|                      FX_FLOAT top,
 | 
|                      FX_FLOAT width,
 | 
|                      FX_FLOAT height);
 | 
| -
 | 
|    FX_ERR AddEllipse(const CFX_RectF& rect);
 | 
| -
 | 
|    FX_ERR AddArc(FX_FLOAT left,
 | 
|                  FX_FLOAT top,
 | 
|                  FX_FLOAT width,
 | 
|                  FX_FLOAT height,
 | 
|                  FX_FLOAT startAngle,
 | 
|                  FX_FLOAT sweepAngle);
 | 
| -
 | 
|    FX_ERR AddPie(FX_FLOAT left,
 | 
|                  FX_FLOAT top,
 | 
|                  FX_FLOAT width,
 | 
|                  FX_FLOAT height,
 | 
|                  FX_FLOAT startAngle,
 | 
|                  FX_FLOAT sweepAngle);
 | 
| -
 | 
|    FX_ERR AddSubpath(CFX_Path* path);
 | 
| -
 | 
|    FX_ERR Clear();
 | 
|  
 | 
|    FX_BOOL IsEmpty();
 | 
| -
 | 
|    CFX_PathData* GetPathData();
 | 
|  
 | 
|   private:
 | 
| -  CFX_PathGenerator* _generator;
 | 
| +  CFX_PathGenerator* m_generator;
 | 
|  };
 | 
| +
 | 
|  class CFX_Color {
 | 
|   public:
 | 
|    CFX_Color();
 | 
| -
 | 
| +  // TODO(weili): Remove implicit conversions. Make this explicit.
 | 
|    CFX_Color(const FX_ARGB argb);
 | 
| -
 | 
| -  CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb = 0x0);
 | 
| -
 | 
| -  CFX_Color(CFX_Shading* shading);
 | 
| -
 | 
| +  explicit CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb = 0x0);
 | 
| +  explicit CFX_Color(CFX_Shading* shading);
 | 
|    virtual ~CFX_Color();
 | 
|  
 | 
|    FX_ERR Set(const FX_ARGB argb);
 | 
| -
 | 
|    FX_ERR Set(CFX_Pattern* pattern, const FX_ARGB argb = 0x0);
 | 
| -
 | 
|    FX_ERR Set(CFX_Shading* shading);
 | 
|  
 | 
|   private:
 | 
| -  int32_t _type;
 | 
| +  int32_t m_type;
 | 
|    union {
 | 
|      struct {
 | 
| -      FX_ARGB _argb;
 | 
| -      CFX_Pattern* _pattern;
 | 
| -    };
 | 
| -    CFX_Shading* _shading;
 | 
| +      FX_ARGB argb;
 | 
| +      CFX_Pattern* pattern;
 | 
| +    } m_info;
 | 
| +    CFX_Shading* m_shading;
 | 
|    };
 | 
|  
 | 
|    friend class CFX_Graphics;
 | 
|  };
 | 
| +
 | 
|  class CFX_Pattern {
 | 
|   public:
 | 
|    CFX_Pattern();
 | 
| +  virtual ~CFX_Pattern();
 | 
|  
 | 
|    FX_ERR Create(CFX_DIBitmap* bitmap,
 | 
|                  const FX_FLOAT xStep,
 | 
|                  const FX_FLOAT yStep,
 | 
|                  CFX_Matrix* matrix = NULL);
 | 
| -
 | 
|    FX_ERR Create(FX_HatchStyle hatchStyle,
 | 
|                  const FX_ARGB foreArgb,
 | 
|                  const FX_ARGB backArgb,
 | 
|                  CFX_Matrix* matrix = NULL);
 | 
|  
 | 
| -  virtual ~CFX_Pattern();
 | 
| -
 | 
|   private:
 | 
| -  int32_t _type;
 | 
| -  CFX_Matrix _matrix;
 | 
| +  int32_t m_type;
 | 
| +  CFX_Matrix m_matrix;
 | 
|    union {
 | 
|      struct {
 | 
| -      CFX_RectF _rect;
 | 
| -      FX_FLOAT _xStep;
 | 
| -      FX_FLOAT _yStep;
 | 
| -      FX_BOOL _isColored;
 | 
| -    };
 | 
| +      CFX_RectF rect;
 | 
| +      FX_FLOAT xStep;
 | 
| +      FX_FLOAT yStep;
 | 
| +      FX_BOOL isColored;
 | 
| +    } m_rectInfo;
 | 
|      struct {
 | 
| -      CFX_DIBitmap* _bitmap;
 | 
| -      FX_FLOAT _x1Step;
 | 
| -      FX_FLOAT _y1Step;
 | 
| -    };
 | 
| +      CFX_DIBitmap* bitmap;
 | 
| +      FX_FLOAT x1Step;
 | 
| +      FX_FLOAT y1Step;
 | 
| +    } m_bitmapInfo;
 | 
|      struct {
 | 
| -      FX_HatchStyle _hatchStyle;
 | 
| -      FX_ARGB _foreArgb;
 | 
| -      FX_ARGB _backArgb;
 | 
| -    };
 | 
| +      FX_HatchStyle hatchStyle;
 | 
| +      FX_ARGB foreArgb;
 | 
| +      FX_ARGB backArgb;
 | 
| +    } m_hatchInfo;
 | 
|    };
 | 
|    friend class CFX_Graphics;
 | 
|  };
 | 
| +
 | 
|  class CFX_Shading {
 | 
|   public:
 | 
|    CFX_Shading();
 | 
| +  virtual ~CFX_Shading();
 | 
|  
 | 
|    FX_ERR CreateAxial(const CFX_PointF& beginPoint,
 | 
|                       const CFX_PointF& endPoint,
 | 
| @@ -438,7 +407,6 @@ class CFX_Shading {
 | 
|                       FX_BOOL isExtendedEnd,
 | 
|                       const FX_ARGB beginArgb,
 | 
|                       const FX_ARGB endArgb);
 | 
| -
 | 
|    FX_ERR CreateRadial(const CFX_PointF& beginPoint,
 | 
|                        const CFX_PointF& endPoint,
 | 
|                        const FX_FLOAT beginRadius,
 | 
| @@ -448,22 +416,19 @@ class CFX_Shading {
 | 
|                        const FX_ARGB beginArgb,
 | 
|                        const FX_ARGB endArgb);
 | 
|  
 | 
| -  virtual ~CFX_Shading();
 | 
| -
 | 
|   private:
 | 
|    FX_ERR InitArgbArray();
 | 
|  
 | 
| - private:
 | 
| -  int32_t _type;
 | 
| -  CFX_PointF _beginPoint;
 | 
| -  CFX_PointF _endPoint;
 | 
| -  FX_FLOAT _beginRadius;
 | 
| -  FX_FLOAT _endRadius;
 | 
| -  FX_BOOL _isExtendedBegin;
 | 
| -  FX_BOOL _isExtendedEnd;
 | 
| -  FX_ARGB _beginArgb;
 | 
| -  FX_ARGB _endArgb;
 | 
| -  FX_ARGB _argbArray[FX_SHADING_Steps];
 | 
| +  int32_t m_type;
 | 
| +  CFX_PointF m_beginPoint;
 | 
| +  CFX_PointF m_endPoint;
 | 
| +  FX_FLOAT m_beginRadius;
 | 
| +  FX_FLOAT m_endRadius;
 | 
| +  FX_BOOL m_isExtendedBegin;
 | 
| +  FX_BOOL m_isExtendedEnd;
 | 
| +  FX_ARGB m_beginArgb;
 | 
| +  FX_ARGB m_endArgb;
 | 
| +  FX_ARGB m_argbArray[FX_SHADING_Steps];
 | 
|    friend class CFX_Graphics;
 | 
|  };
 | 
|  
 | 
| 
 |