agg: Pull in updated scanline + basics header from 2.4

* Resolves #13382
This commit is contained in:
Alexander von Gluck IV
2017-03-18 18:59:30 -05:00
parent ad05d1f087
commit 8cc5325ad5
2 changed files with 78 additions and 22 deletions
+69 -6
View File
@@ -143,10 +143,18 @@ namespace agg
__asm mov eax, dword ptr [t] __asm mov eax, dword ptr [t]
} }
#pragma warning(pop) #pragma warning(pop)
AGG_INLINE int ifloor(double v)
{
return int(floor(v));
}
AGG_INLINE unsigned ufloor(double v) //-------ufloor AGG_INLINE unsigned ufloor(double v) //-------ufloor
{ {
return unsigned(floor(v)); return unsigned(floor(v));
} }
AGG_INLINE int iceil(double v)
{
return int(ceil(v));
}
AGG_INLINE unsigned uceil(double v) //--------uceil AGG_INLINE unsigned uceil(double v) //--------uceil
{ {
return unsigned(ceil(v)); return unsigned(ceil(v));
@@ -160,10 +168,18 @@ namespace agg
{ {
return unsigned(v); return unsigned(v);
} }
AGG_INLINE int ifloor(double v)
{
return int(floor(v));
}
AGG_INLINE unsigned ufloor(double v) AGG_INLINE unsigned ufloor(double v)
{ {
return unsigned(floor(v)); return unsigned(floor(v));
} }
AGG_INLINE int iceil(double v)
{
return int(ceil(v));
}
AGG_INLINE unsigned uceil(double v) AGG_INLINE unsigned uceil(double v)
{ {
return unsigned(ceil(v)); return unsigned(ceil(v));
@@ -177,10 +193,19 @@ namespace agg
{ {
return unsigned(v + 0.5); return unsigned(v + 0.5);
} }
AGG_INLINE int ifloor(double v)
{
int i = int(v);
return i - (i > v);
}
AGG_INLINE unsigned ufloor(double v) AGG_INLINE unsigned ufloor(double v)
{ {
return unsigned(v); return unsigned(v);
} }
AGG_INLINE int iceil(double v)
{
return int(ceil(v));
}
AGG_INLINE unsigned uceil(double v) AGG_INLINE unsigned uceil(double v)
{ {
return unsigned(ceil(v)); return unsigned(ceil(v));
@@ -203,7 +228,7 @@ namespace agg
{ {
AGG_INLINE static unsigned mul(unsigned a, unsigned b) AGG_INLINE static unsigned mul(unsigned a, unsigned b)
{ {
register unsigned q = a * b + (1 << (Shift-1)); unsigned q = a * b + (1 << (Shift-1));
return (q + (q >> Shift)) >> Shift; return (q + (q >> Shift)) >> Shift;
} }
}; };
@@ -229,7 +254,7 @@ namespace agg
{ {
poly_subpixel_shift = 8, //----poly_subpixel_shift poly_subpixel_shift = 8, //----poly_subpixel_shift
poly_subpixel_scale = 1<<poly_subpixel_shift, //----poly_subpixel_scale poly_subpixel_scale = 1<<poly_subpixel_shift, //----poly_subpixel_scale
poly_subpixel_mask = poly_subpixel_scale-1, //----poly_subpixel_mask poly_subpixel_mask = poly_subpixel_scale-1 //----poly_subpixel_mask
}; };
//----------------------------------------------------------filling_rule_e //----------------------------------------------------------filling_rule_e
@@ -257,16 +282,19 @@ namespace agg
//----------------------------------------------------------------rect_base //----------------------------------------------------------------rect_base
template<class T> struct rect_base template<class T> struct rect_base
{ {
typedef T value_type;
typedef rect_base<T> self_type; typedef rect_base<T> self_type;
T x1; T x1, y1, x2, y2;
T y1;
T x2;
T y2;
rect_base() {} rect_base() {}
rect_base(T x1_, T y1_, T x2_, T y2_) : rect_base(T x1_, T y1_, T x2_, T y2_) :
x1(x1_), y1(y1_), x2(x2_), y2(y2_) {} x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
void init(T x1_, T y1_, T x2_, T y2_)
{
x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_;
}
const self_type& normalize() const self_type& normalize()
{ {
T t; T t;
@@ -288,6 +316,17 @@ namespace agg
{ {
return x1 <= x2 && y1 <= y2; return x1 <= x2 && y1 <= y2;
} }
bool hit_test(T x, T y) const
{
return (x >= x1 && x <= x2 && y >= y1 && y <= y2);
}
bool overlaps(const self_type& r) const
{
return !(r.x1 > x2 || r.x2 < x1
|| r.y1 > y2 || r.y2 < y1);
}
}; };
//-----------------------------------------------------intersect_rectangles //-----------------------------------------------------intersect_rectangles
@@ -490,6 +529,30 @@ namespace agg
typedef vertex_base<float> vertex_f; //-----vertex_f typedef vertex_base<float> vertex_f; //-----vertex_f
typedef vertex_base<double> vertex_d; //-----vertex_d typedef vertex_base<double> vertex_d; //-----vertex_d
//----------------------------------------------------------------row_info
template<class T> struct row_info
{
int x1, x2;
T* ptr;
row_info() {}
row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {}
};
//----------------------------------------------------------const_row_info
template<class T> struct const_row_info
{
int x1, x2;
const T* ptr;
const_row_info() {}
const_row_info(int x1_, int x2_, const T* ptr_) :
x1(x1_), x2(x2_), ptr(ptr_) {}
};
//------------------------------------------------------------is_equal_eps
template<class T> inline bool is_equal_eps(T v1, T v2, T epsilon)
{
return fabs(v1 - v2) <= double(epsilon);
}
} }
+9 -16
View File
@@ -252,7 +252,7 @@ namespace agg
typedef base_type::coord_type coord_type; typedef base_type::coord_type coord_type;
scanline_u8_am() : base_type(), m_alpha_mask(0) {} scanline_u8_am() : base_type(), m_alpha_mask(0) {}
scanline_u8_am(const AlphaMask& am) : base_type(), m_alpha_mask(&am) {} scanline_u8_am(AlphaMask& am) : base_type(), m_alpha_mask(&am) {}
//-------------------------------------------------------------------- //--------------------------------------------------------------------
void finalize(int span_y) void finalize(int span_y)
@@ -275,7 +275,7 @@ namespace agg
} }
private: private:
const AlphaMask* m_alpha_mask; AlphaMask* m_alpha_mask;
}; };
@@ -464,28 +464,21 @@ namespace agg
typedef base_type::coord_type coord_type; typedef base_type::coord_type coord_type;
scanline32_u8_am() : m_alpha_mask(0) scanline32_u8_am() : base_type(), m_alpha_mask(0) {}
{ scanline32_u8_am(AlphaMask& am) : base_type(), m_alpha_mask(&am) {}
this->base_type();
}
scanline32_u8_am(const AlphaMask& am) : m_alpha_mask(&am)
{
this->base_type();
}
//-------------------------------------------------------------------- //--------------------------------------------------------------------
void finalize(int span_y) void finalize(int span_y)
{ {
this->base_type::finalize(span_y); base_type::finalize(span_y);
if(m_alpha_mask) if(m_alpha_mask)
{ {
typename base_type::iterator span = this->base_type::begin(); typename base_type::iterator span = base_type::begin();
unsigned count = this->base_type::num_spans(); unsigned count = base_type::num_spans();
do do
{ {
m_alpha_mask->combine_hspan(span->x, m_alpha_mask->combine_hspan(span->x,
this->base_type::y(), base_type::y(),
span->covers, span->covers,
span->len); span->len);
++span; ++span;
@@ -495,7 +488,7 @@ namespace agg
} }
private: private:
const AlphaMask* m_alpha_mask; AlphaMask* m_alpha_mask;
}; };