00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef AGG_PIXFMT_GRAY8_INCLUDED
00017 #define AGG_PIXFMT_GRAY8_INCLUDED
00018
00019 #include <string.h>
00020 #include "agg_basics.h"
00021 #include "agg_gray8.h"
00022 #include "agg_rendering_buffer.h"
00023
00024 namespace agg
00025 {
00026
00027
00028 template<unsigned Step=1, unsigned Offset=0>
00029 class pixfmt_gray8_base
00030 {
00031 public:
00032 typedef gray8 color_type;
00033 typedef bool order_type;
00034 typedef rendering_buffer::row_data row_data;
00035
00036
00037
00038 pixfmt_gray8_base(rendering_buffer& rb)
00039 : m_rbuf(&rb)
00040 {
00041 }
00042
00043
00044 unsigned width() const { return m_rbuf->width(); }
00045 unsigned height() const { return m_rbuf->height(); }
00046
00047
00048 color_type pixel(int x, int y) const
00049 {
00050 return color_type(m_rbuf->row(y)[x * Step + Offset]);
00051 }
00052
00053
00054 row_data span(int x, int y) const
00055 {
00056 return row_data(x, width() - 1, m_rbuf->row(y) + x);
00057 }
00058
00059
00060 void copy_pixel(int x, int y, const color_type& c)
00061 {
00062 m_rbuf->row(y)[x * Step + Offset] = (int8u)c.v;
00063 }
00064
00065
00066 void blend_pixel(int x, int y, const color_type& c, int8u cover)
00067 {
00068 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00069 int v = *p;
00070 int alpha = int(cover) * c.a;
00071 *p = (int8u)((((c.v - v) * alpha) + (v << 16)) >> 16);
00072 }
00073
00074
00075
00076 void copy_hline(int x, int y, unsigned len, const color_type& c)
00077 {
00078 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00079 do
00080 {
00081 *p = (int8u)c.v;
00082 p += Step;
00083 }
00084 while(--len);
00085 }
00086
00087
00088
00089 void copy_vline(int x, int y, unsigned len, const color_type& c)
00090 {
00091 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00092 do
00093 {
00094 *p = (int8u)c.v;
00095 p += m_rbuf->stride();
00096 }
00097 while(--len);
00098 }
00099
00100
00101
00102 void blend_hline(int x, int y, unsigned len,
00103 const color_type& c, int8u cover)
00104 {
00105 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00106 int alpha = int(cover) * c.a;
00107 if(alpha == 255*255)
00108 {
00109 do
00110 {
00111 *p = (int8u)c.v;
00112 p += Step;
00113 }
00114 while(--len);
00115 }
00116 else
00117 {
00118 do
00119 {
00120 int v = *p;
00121 *p = (int8u)((((c.v - v) * alpha) + (v << 16)) >> 16);
00122 p += Step;
00123 }
00124 while(--len);
00125 }
00126 }
00127
00128
00129
00130 void blend_vline(int x, int y, unsigned len,
00131 const color_type& c, int8u cover)
00132 {
00133 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00134 int alpha = int(cover) * c.a;
00135 if(alpha == 255*255)
00136 {
00137 do
00138 {
00139 *p = (int8u)c.v;
00140 p += m_rbuf->stride();
00141 }
00142 while(--len);
00143 }
00144 else
00145 {
00146 do
00147 {
00148 int v = *p;
00149 *p = (int8u)((((c.v - v) * alpha) + (v << 16)) >> 16);
00150 p += m_rbuf->stride();
00151 }
00152 while(--len);
00153 }
00154 }
00155
00156
00157
00158 void copy_from(const rendering_buffer& from,
00159 int xdst, int ydst,
00160 int xsrc, int ysrc,
00161 unsigned len)
00162 {
00163 memmove(m_rbuf->row(ydst) + xdst * Step + Offset,
00164 (const void*)(from.row(ysrc) + xsrc * Step + Offset),
00165 len * Step);
00166 }
00167
00168
00169
00170 void blend_solid_hspan(int x, int y, unsigned len,
00171 const color_type& c, const int8u* covers)
00172 {
00173 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00174 do
00175 {
00176 int alpha = int(*covers++) * c.a;
00177
00178 if(alpha)
00179 {
00180 if(alpha == 255*255)
00181 {
00182 *p = (int8u)c.v;
00183 }
00184 else
00185 {
00186 int v = *p;
00187 *p = (int8u)((((c.v - v) * alpha) + (v << 16)) >> 16);
00188 }
00189 }
00190 p += Step;
00191 }
00192 while(--len);
00193 }
00194
00195
00196
00197 void blend_solid_vspan(int x, int y, unsigned len,
00198 const color_type& c, const int8u* covers)
00199 {
00200 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00201 do
00202 {
00203 int alpha = int(*covers++) * c.a;
00204
00205 if(alpha)
00206 {
00207 if(alpha == 255*255)
00208 {
00209 *p = (int8u)c.v;
00210 }
00211 else
00212 {
00213 int v = *p;
00214 *p = (int8u)((((c.v - v) * alpha) + (v << 16)) >> 16);
00215 }
00216 }
00217 p += m_rbuf->stride();
00218 }
00219 while(--len);
00220 }
00221
00222
00223
00224 void blend_color_hspan(int x, int y, unsigned len,
00225 const color_type* colors,
00226 const int8u* covers,
00227 int8u cover)
00228 {
00229 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00230 do
00231 {
00232 int alpha = colors->a * (covers ? int(*covers++) : int(cover));
00233
00234 if(alpha)
00235 {
00236 if(alpha == 255*255)
00237 {
00238 *p = (int8u)colors->v;
00239 }
00240 else
00241 {
00242 int v = *p;
00243 *p = (int8u)((((colors->v - v) * alpha) + (v << 16)) >> 16);
00244 }
00245 }
00246 p += Step;
00247 ++colors;
00248 }
00249 while(--len);
00250 }
00251
00252
00253
00254
00255 void blend_color_vspan(int x, int y, unsigned len,
00256 const color_type* colors,
00257 const int8u* covers,
00258 int8u cover)
00259 {
00260 int8u* p = m_rbuf->row(y) + x * Step + Offset;
00261 do
00262 {
00263 int alpha = colors->a * (covers ? int(*covers++) : int(cover));
00264
00265 if(alpha)
00266 {
00267 if(alpha == 255*255)
00268 {
00269 *p = (int8u)colors->v;
00270 }
00271 else
00272 {
00273 int v = *p;
00274 *p = (int8u)((((colors->v - v) * alpha) + (v << 16)) >> 16);
00275 }
00276 }
00277 p += m_rbuf->stride();
00278 ++colors;
00279 }
00280 while(--len);
00281 }
00282
00283 private:
00284 rendering_buffer* m_rbuf;
00285 };
00286
00287
00288 typedef pixfmt_gray8_base<1, 0> pixfmt_gray8;
00289
00290 typedef pixfmt_gray8_base<3, 0> pixfmt_gray8_rgb24r;
00291 typedef pixfmt_gray8_base<3, 1> pixfmt_gray8_rgb24g;
00292 typedef pixfmt_gray8_base<3, 2> pixfmt_gray8_rgb24b;
00293
00294 typedef pixfmt_gray8_base<3, 2> pixfmt_gray8_bgr24r;
00295 typedef pixfmt_gray8_base<3, 1> pixfmt_gray8_bgr24g;
00296 typedef pixfmt_gray8_base<3, 0> pixfmt_gray8_bgr24b;
00297
00298 typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_rgba32r;
00299 typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_rgba32g;
00300 typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_rgba32b;
00301 typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_rgba32a;
00302
00303 typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_argb32r;
00304 typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_argb32g;
00305 typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_argb32b;
00306 typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_argb32a;
00307
00308 typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_bgra32r;
00309 typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_bgra32g;
00310 typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_bgra32b;
00311 typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_bgra32a;
00312
00313 typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_abgr32r;
00314 typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_abgr32g;
00315 typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_abgr32b;
00316 typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_abgr32a;
00317
00318 }
00319
00320 #endif
00321