|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | // Anti-Grain Geometry - Version 2.3 | 
|  | // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) | 
|  | // | 
|  | // Permission to copy, use, modify, sell and distribute this software | 
|  | // is granted provided this copyright notice appears in all copies. | 
|  | // This software is provided "as is" without express or implied | 
|  | // warranty, and with no claim as to its suitability for any purpose. | 
|  | // | 
|  | //---------------------------------------------------------------------------- | 
|  | // Contact: mcseem@antigrain.com | 
|  | //          mcseemagg@yahoo.com | 
|  | //          http://www.antigrain.com | 
|  | //---------------------------------------------------------------------------- | 
|  | #ifndef AGG_BASICS_INCLUDED | 
|  | #define AGG_BASICS_INCLUDED | 
|  | #ifndef AGG_INT8 | 
|  | #define AGG_INT8 signed char | 
|  | #endif | 
|  | #ifndef AGG_INT8U | 
|  | #define AGG_INT8U unsigned char | 
|  | #endif | 
|  | #ifndef AGG_INT16 | 
|  | #define AGG_INT16 short | 
|  | #endif | 
|  | #ifndef AGG_INT16U | 
|  | #define AGG_INT16U unsigned short | 
|  | #endif | 
|  | #ifndef AGG_INT32 | 
|  | #define AGG_INT32 int | 
|  | #endif | 
|  | #ifndef AGG_INT32U | 
|  | #define AGG_INT32U unsigned | 
|  | #endif | 
|  | #ifndef AGG_INT64 | 
|  | #define AGG_INT64 signed long long | 
|  | #endif | 
|  | #ifndef AGG_INT64U | 
|  | #define AGG_INT64U unsigned long long | 
|  | #endif | 
|  | #define AGG_INLINE inline | 
|  |  | 
|  | #include <math.h> | 
|  | #include "core/fxcrt/fx_system.h" | 
|  |  | 
|  | namespace pdfium | 
|  | { | 
|  | namespace agg | 
|  | { | 
|  | typedef AGG_INT8   int8; | 
|  | typedef AGG_INT8U  int8u; | 
|  | typedef AGG_INT16  int16; | 
|  | typedef AGG_INT16U int16u; | 
|  | typedef AGG_INT32  int32; | 
|  | typedef AGG_INT32U int32u; | 
|  | typedef AGG_INT64  int64; | 
|  | typedef AGG_INT64U int64u; | 
|  | typedef unsigned char cover_type; | 
|  | enum cover_scale_e { | 
|  | cover_shift = 8, | 
|  | cover_size  = 1 << cover_shift, | 
|  | cover_mask  = cover_size - 1, | 
|  | cover_none  = 0, | 
|  | cover_full  = cover_mask | 
|  | }; | 
|  | template<class T> struct rect_base  { | 
|  | typedef rect_base<T> self_type; | 
|  | T x1; | 
|  | T y1; | 
|  | T x2; | 
|  | T y2; | 
|  | rect_base() {} | 
|  | rect_base(T x1_, T y1_, T x2_, T y2_) : | 
|  | x1(x1_), y1(y1_), x2(x2_), y2(y2_) {} | 
|  | const self_type& normalize() | 
|  | { | 
|  | T t; | 
|  | if(x1 > x2) { | 
|  | t = x1; | 
|  | x1 = x2; | 
|  | x2 = t; | 
|  | } | 
|  | if(y1 > y2) { | 
|  | t = y1; | 
|  | y1 = y2; | 
|  | y2 = t; | 
|  | } | 
|  | return *this; | 
|  | } | 
|  | bool clip(const self_type& r) | 
|  | { | 
|  | if(x2 > r.x2) { | 
|  | x2 = r.x2; | 
|  | } | 
|  | if(y2 > r.y2) { | 
|  | y2 = r.y2; | 
|  | } | 
|  | if(x1 < r.x1) { | 
|  | x1 = r.x1; | 
|  | } | 
|  | if(y1 < r.y1) { | 
|  | y1 = r.y1; | 
|  | } | 
|  | return x1 <= x2 && y1 <= y2; | 
|  | } | 
|  | bool is_valid() const | 
|  | { | 
|  | return x1 <= x2 && y1 <= y2; | 
|  | } | 
|  | }; | 
|  | template<class Rect> | 
|  | inline Rect intersect_rectangles(const Rect& r1, const Rect& r2) | 
|  | { | 
|  | Rect r = r1; | 
|  | if(r.x2 > r2.x2) { | 
|  | r.x2 = r2.x2; | 
|  | } | 
|  | if(r.y2 > r2.y2) { | 
|  | r.y2 = r2.y2; | 
|  | } | 
|  | if(r.x1 < r2.x1) { | 
|  | r.x1 = r2.x1; | 
|  | } | 
|  | if(r.y1 < r2.y1) { | 
|  | r.y1 = r2.y1; | 
|  | } | 
|  | return r; | 
|  | } | 
|  | template<class Rect> | 
|  | inline Rect unite_rectangles(const Rect& r1, const Rect& r2) | 
|  | { | 
|  | Rect r = r1; | 
|  | if(r.x2 < r2.x2) { | 
|  | r.x2 = r2.x2; | 
|  | } | 
|  | if(r.y2 < r2.y2) { | 
|  | r.y2 = r2.y2; | 
|  | } | 
|  | if(r.x1 > r2.x1) { | 
|  | r.x1 = r2.x1; | 
|  | } | 
|  | if(r.y1 > r2.y1) { | 
|  | r.y1 = r2.y1; | 
|  | } | 
|  | return r; | 
|  | } | 
|  | typedef rect_base<int>    rect; | 
|  | typedef rect_base<float> rect_d; | 
|  | enum path_commands_e { | 
|  | path_cmd_stop     = 0, | 
|  | path_cmd_move_to  = 1, | 
|  | path_cmd_line_to  = 2, | 
|  | path_cmd_curve3   = 3, | 
|  | path_cmd_curve4   = 4, | 
|  | path_cmd_curveN   = 5, | 
|  | path_cmd_catrom   = 6, | 
|  | path_cmd_ubspline = 7, | 
|  | path_cmd_end_poly = 0x0F, | 
|  | path_cmd_mask     = 0x0F | 
|  | }; | 
|  | enum path_flags_e { | 
|  | path_flags_none  = 0, | 
|  | path_flags_ccw   = 0x10, | 
|  | path_flags_cw    = 0x20, | 
|  | path_flags_close = 0x40, | 
|  | path_flags_jr	 = 0x80, | 
|  | path_flags_mask  = 0xF0 | 
|  | }; | 
|  | inline bool is_vertex(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c >= path_cmd_move_to && c < path_cmd_end_poly; | 
|  | } | 
|  | inline bool is_drawing(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c >= path_cmd_line_to && c < path_cmd_end_poly; | 
|  | } | 
|  | inline bool is_stop(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c == path_cmd_stop; | 
|  | } | 
|  | inline bool is_move_to(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c == path_cmd_move_to; | 
|  | } | 
|  | inline bool is_line_to(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c == path_cmd_line_to; | 
|  | } | 
|  | inline bool is_curve(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c == path_cmd_curve3 || c == path_cmd_curve4; | 
|  | } | 
|  | inline bool is_curve3(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c == path_cmd_curve3; | 
|  | } | 
|  | inline bool is_curve4(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c == path_cmd_curve4; | 
|  | } | 
|  | inline bool is_end_poly(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return (c & path_cmd_mask) == path_cmd_end_poly; | 
|  | } | 
|  | inline bool is_close(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return (c & ~(path_flags_cw | path_flags_ccw)) == | 
|  | (unsigned{path_cmd_end_poly} | path_flags_close); | 
|  | } | 
|  | inline bool is_next_poly(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return is_stop(c) || is_move_to(c) || is_end_poly(c); | 
|  | } | 
|  | inline bool is_cw(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return (c & path_flags_cw) != 0; | 
|  | } | 
|  | inline bool is_ccw(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return (c & path_flags_ccw) != 0; | 
|  | } | 
|  | inline bool is_oriented(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return (c & (path_flags_cw | path_flags_ccw)) != 0; | 
|  | } | 
|  | inline bool is_closed(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return (c & path_flags_close) != 0; | 
|  | } | 
|  | inline unsigned get_close_flag(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c & path_flags_close; | 
|  | } | 
|  | inline unsigned clear_orientation(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c & ~(path_flags_cw | path_flags_ccw); | 
|  | } | 
|  | inline unsigned get_orientation(unsigned c) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return c & (path_flags_cw | path_flags_ccw); | 
|  | } | 
|  | inline unsigned set_orientation(unsigned c, unsigned o) | 
|  | { | 
|  | c &= ~path_flags_jr; | 
|  | return clear_orientation(c) | o; | 
|  | } | 
|  | struct point_type  { | 
|  | float x, y; | 
|  | unsigned flag; | 
|  | point_type() {} | 
|  | point_type(float x_, float y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {} | 
|  | }; | 
|  | struct vertex_type  { | 
|  | float   x, y; | 
|  | unsigned cmd; | 
|  | vertex_type() {} | 
|  | vertex_type(float x_, float y_, unsigned cmd_) : | 
|  | x(x_), y(y_), cmd(cmd_) {} | 
|  | }; | 
|  | } | 
|  | }  // namespace pdfium | 
|  | #endif |