Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages | Examples

agg_pixfmt_gray8.h

00001 //----------------------------------------------------------------------------
00002 // Anti-Grain Geometry - Version 2.2
00003 // Copyright (C) 2002-2004 Maxim Shemanarev (http://www.antigrain.com)
00004 //
00005 // Permission to copy, use, modify, sell and distribute this software 
00006 // is granted provided this copyright notice appears in all copies. 
00007 // This software is provided "as is" without express or implied
00008 // warranty, and with no claim as to its suitability for any purpose.
00009 //
00010 //----------------------------------------------------------------------------
00011 // Contact: mcseem@antigrain.com
00012 //          mcseemagg@yahoo.com
00013 //          http://www.antigrain.com
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     //======================================================pixfmt_gray8_base
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;         //----pixfmt_gray8
00289 
00290     typedef pixfmt_gray8_base<3, 0> pixfmt_gray8_rgb24r;  //----pixfmt_gray8_rgb24r
00291     typedef pixfmt_gray8_base<3, 1> pixfmt_gray8_rgb24g;  //----pixfmt_gray8_rgb24g
00292     typedef pixfmt_gray8_base<3, 2> pixfmt_gray8_rgb24b;  //----pixfmt_gray8_rgb24b
00293 
00294     typedef pixfmt_gray8_base<3, 2> pixfmt_gray8_bgr24r;  //----pixfmt_gray8_bgr24r
00295     typedef pixfmt_gray8_base<3, 1> pixfmt_gray8_bgr24g;  //----pixfmt_gray8_bgr24g
00296     typedef pixfmt_gray8_base<3, 0> pixfmt_gray8_bgr24b;  //----pixfmt_gray8_bgr24b
00297 
00298     typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_rgba32r; //----pixfmt_gray8_rgba32r
00299     typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_rgba32g; //----pixfmt_gray8_rgba32g
00300     typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_rgba32b; //----pixfmt_gray8_rgba32b
00301     typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_rgba32a; //----pixfmt_gray8_rgba32a
00302 
00303     typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_argb32r; //----pixfmt_gray8_argb32r
00304     typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_argb32g; //----pixfmt_gray8_argb32g
00305     typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_argb32b; //----pixfmt_gray8_argb32b
00306     typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_argb32a; //----pixfmt_gray8_argb32a
00307 
00308     typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_bgra32r; //----pixfmt_gray8_bgra32r
00309     typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_bgra32g; //----pixfmt_gray8_bgra32g
00310     typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_bgra32b; //----pixfmt_gray8_bgra32b
00311     typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_bgra32a; //----pixfmt_gray8_bgra32a
00312 
00313     typedef pixfmt_gray8_base<4, 3> pixfmt_gray8_abgr32r; //----pixfmt_gray8_abgr32r
00314     typedef pixfmt_gray8_base<4, 2> pixfmt_gray8_abgr32g; //----pixfmt_gray8_abgr32g
00315     typedef pixfmt_gray8_base<4, 1> pixfmt_gray8_abgr32b; //----pixfmt_gray8_abgr32b
00316     typedef pixfmt_gray8_base<4, 0> pixfmt_gray8_abgr32a; //----pixfmt_gray8_abgr32a
00317 
00318 }
00319 
00320 #endif
00321 

Generated on Wed Feb 9 11:31:34 2005 for OpenGUI by  doxygen 1.4.0