Anti-Grain Geometry Tutorial
agg_pattern_filters_rgba.h
1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.4
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
4 //
5 // Permission to copy, use, modify, sell and distribute this software
6 // is granted provided this copyright notice appears in all copies.
7 // This software is provided "as is" without express or implied
8 // warranty, and with no claim as to its suitability for any purpose.
9 //
10 //----------------------------------------------------------------------------
11 // Contact: mcseem@antigrain.com
12 // mcseemagg@yahoo.com
13 // http://www.antigrain.com
14 //----------------------------------------------------------------------------
15 #ifndef AGG_PATTERN_FILTERS_RGBA8_INCLUDED
16 #define AGG_PATTERN_FILTERS_RGBA8_INCLUDED
17 
18 #include "agg_basics.h"
19 #include "agg_line_aa_basics.h"
20 #include "agg_color_rgba.h"
21 
22 
23 namespace agg
24 {
25 
26  //=======================================================pattern_filter_nn
27  template<class ColorT> struct pattern_filter_nn
28  {
29  typedef ColorT color_type;
30  static unsigned dilation() { return 0; }
31 
32  static void AGG_INLINE pixel_low_res(color_type const* const* buf,
33  color_type* p, int x, int y)
34  {
35  *p = buf[y][x];
36  }
37 
38  static void AGG_INLINE pixel_high_res(color_type const* const* buf,
39  color_type* p, int x, int y)
40  {
41  *p = buf[y >> line_subpixel_shift]
42  [x >> line_subpixel_shift];
43  }
44  };
45 
48 
49 
50  //===========================================pattern_filter_bilinear_rgba
51  template<class ColorT> struct pattern_filter_bilinear_rgba
52  {
53  typedef ColorT color_type;
54  typedef typename color_type::value_type value_type;
55  typedef typename color_type::calc_type calc_type;
56 
57 
58  static unsigned dilation() { return 1; }
59 
60  static AGG_INLINE void pixel_low_res(color_type const* const* buf,
61  color_type* p, int x, int y)
62  {
63  *p = buf[y][x];
64  }
65 
66  static AGG_INLINE void pixel_high_res(color_type const* const* buf,
67  color_type* p, int x, int y)
68  {
69  calc_type r, g, b, a;
70  r = g = b = a = 0;
71 
72  calc_type weight;
73  int x_lr = x >> line_subpixel_shift;
74  int y_lr = y >> line_subpixel_shift;
75 
76  x &= line_subpixel_mask;
77  y &= line_subpixel_mask;
78  const color_type* ptr = buf[y_lr] + x_lr;
79 
80  weight = (line_subpixel_scale - x) *
81  (line_subpixel_scale - y);
82  r += weight * ptr->r;
83  g += weight * ptr->g;
84  b += weight * ptr->b;
85  a += weight * ptr->a;
86 
87  ++ptr;
88 
89  weight = x * (line_subpixel_scale - y);
90  r += weight * ptr->r;
91  g += weight * ptr->g;
92  b += weight * ptr->b;
93  a += weight * ptr->a;
94 
95  ptr = buf[y_lr + 1] + x_lr;
96 
97  weight = (line_subpixel_scale - x) * y;
98  r += weight * ptr->r;
99  g += weight * ptr->g;
100  b += weight * ptr->b;
101  a += weight * ptr->a;
102 
103  ++ptr;
104 
105  weight = x * y;
106  r += weight * ptr->r;
107  g += weight * ptr->g;
108  b += weight * ptr->b;
109  a += weight * ptr->a;
110 
111  p->r = (value_type)color_type::downshift(r, line_subpixel_shift * 2);
112  p->g = (value_type)color_type::downshift(g, line_subpixel_shift * 2);
113  p->b = (value_type)color_type::downshift(b, line_subpixel_shift * 2);
114  p->a = (value_type)color_type::downshift(a, line_subpixel_shift * 2);
115  }
116  };
117 
121 }
122 
123 #endif
Definition: agg_arc.cpp:24