Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

gamma_ctrl.cpp

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include "agg_rendering_buffer.h"
00004 #include "agg_rasterizer_scanline_aa.h"
00005 #include "agg_scanline_p.h"
00006 #include "agg_renderer_scanline.h"
00007 #include "agg_gsv_text.h"
00008 #include "agg_conv_stroke.h"
00009 #include "agg_path_storage.h"
00010 #include "ctrl/agg_gamma_ctrl.h"
00011 #include "platform/agg_platform_support.h"
00012 
00013 #define AGG_BGR24 
00014 //#define AGG_RGB24
00015 //#define AGG_BGRA32 
00016 //#define AGG_RGBA32 
00017 //#define AGG_ARGB32 
00018 //#define AGG_ABGR32
00019 //#define AGG_RGB565
00020 //#define AGG_RGB555
00021 #include "pixel_formats.h"
00022 
00023 enum flip_y_e { flip_y = true };
00024 
00025 
00026 agg::gamma_ctrl<agg::rgba8> g_ctrl(10.0, 10.0, 300.0, 200.0, !flip_y);
00027 
00028 void read_gamma(const char* fname)
00029 {
00030     FILE* fd = fopen(fname, "rb");
00031     if(fd)
00032     {
00033         char buf[32];
00034         double kx1, ky1, kx2, ky2;
00035         fgets(buf, 30, fd); kx1 = atof(buf);
00036         fgets(buf, 30, fd); ky1 = atof(buf);
00037         fgets(buf, 30, fd); kx2 = atof(buf);
00038         fgets(buf, 30, fd); ky2 = atof(buf);
00039         g_ctrl.values(kx1, ky1, kx2, ky2);
00040         fclose(fd);
00041     }
00042 }
00043 
00044 
00045 
00046 void write_gamma_bin(const char* fname)
00047 {
00048     const unsigned char* gamma = g_ctrl.gamma();
00049     FILE* fd = fopen(fname, "wb");
00050     if(fd)
00051     {
00052         fwrite(gamma, 256, 1, fd);
00053         fclose(fd);
00054     }
00055 }
00056 
00057 
00058 void write_gamma_txt(const char* fname)
00059 {
00060     const unsigned char* gamma = g_ctrl.gamma();
00061     FILE* fd = fopen(fname, "w");
00062     if(fd)
00063     {
00064         double kx1, ky1, kx2, ky2;
00065         g_ctrl.values(&kx1, &ky1, &kx2, &ky2);
00066         fprintf(fd, "%5.3f\n", kx1);
00067         fprintf(fd, "%5.3f\n", ky1);
00068         fprintf(fd, "%5.3f\n", kx2);
00069         fprintf(fd, "%5.3f\n", ky2);
00070         for(int i = 0; i < 16; i++)
00071         {
00072             for(int j = 0; j < 16; j++)
00073             {
00074                 fprintf(fd, "%3d,", gamma[i*16 + j]);
00075             }
00076             fprintf(fd, "\n");
00077         }
00078         fclose(fd);
00079     }
00080 }
00081 
00082 
00083 
00084 class the_application : public agg::platform_support
00085 {
00086 public:
00087     the_application(agg::pix_format_e format, bool flip_y) :
00088         agg::platform_support(format, flip_y)        
00089     {
00090         add_ctrl(g_ctrl);
00091     }
00092 
00093     virtual void on_init()
00094     {
00095         read_gamma(full_file_name("gamma.txt"));
00096     }
00097 
00098     virtual ~the_application()
00099     {
00100         write_gamma_txt(full_file_name("gamma.txt"));
00101         write_gamma_bin(full_file_name("gamma.bin"));
00102     }
00103 
00104     virtual void on_draw()
00105     {
00106         double ewidth = initial_width() / 2 - 10;
00107         double ecenter = initial_width() / 2;
00108 
00109         typedef agg::renderer_base<pixfmt> ren_base;
00110 
00111         pixfmt pixf(rbuf_window());
00112         ren_base rb(pixf);
00113         agg::rgba8 color;
00114         rb.clear(agg::rgba(1, 1, 1));
00115 
00116         g_ctrl.text_size(10.0, 12.0);
00117 
00118         agg::rasterizer_scanline_aa<> ras;
00119         agg::scanline_p8 sl;
00120 
00121         agg::render_ctrl(ras, sl, rb, g_ctrl);
00122 
00123         ras.gamma(g_ctrl);
00124 
00125         agg::ellipse ellipse;
00126         agg::conv_stroke<agg::ellipse> poly(ellipse);
00127         agg::conv_transform<agg::conv_stroke<agg::ellipse> > tpoly(poly, trans_affine_resizing());
00128         color = agg::rgba8(0, 0, 0);
00129 
00130         ellipse.init(ecenter, 220, ewidth, 15, 100);
00131         poly.width(2.0);
00132         ras.add_path(tpoly, 0);
00133         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00134 
00135         ellipse.init(ecenter, 220, 11, 11, 100);
00136         poly.width(2.0);
00137         ras.add_path(tpoly, 0);
00138         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00139 
00140         color = agg::rgba8(127, 127, 127);
00141 
00142         ellipse.init(ecenter, 260, ewidth, 15, 100);
00143         poly.width(2.0);
00144         ras.add_path(tpoly, 0);
00145         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00146 
00147         ellipse.init(ecenter, 260, 11, 11, 100);
00148         poly.width(2.0);
00149         ras.add_path(tpoly, 0);
00150         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00151 
00152         color = agg::rgba8(192, 192, 192);
00153 
00154         ellipse.init(ecenter, 300, ewidth, 15, 100);
00155         poly.width(2.0);
00156         ras.add_path(tpoly, 0);
00157         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00158 
00159         ellipse.init(ecenter, 300, 11, 11, 100);
00160         poly.width(2.0);
00161         ras.add_path(tpoly, 0);
00162         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00163 
00164         color = agg::rgba(0.0, 0.0, 0.4);
00165 
00166         ellipse.init(ecenter, 340, ewidth, 15.5, 100);
00167         poly.width(1.0);
00168         ras.add_path(tpoly, 0);
00169         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00170 
00171         ellipse.init(ecenter, 340, 10.5, 10.5, 100);
00172         poly.width(1.0);
00173         ras.add_path(tpoly, 0);
00174         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00175 
00176         ellipse.init(ecenter, 380, ewidth, 15.5, 100);
00177         poly.width(0.4);
00178         ras.add_path(tpoly, 0);
00179         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00180 
00181         ellipse.init(ecenter, 380, 10.5, 10.5, 100);
00182         poly.width(0.4);
00183         ras.add_path(tpoly, 0);
00184         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00185 
00186         ellipse.init(ecenter, 420, ewidth, 15.5, 100);
00187         poly.width(0.1);
00188         ras.add_path(tpoly, 0);
00189         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00190 
00191         ellipse.init(ecenter, 420, 10.5, 10.5, 100);
00192         poly.width(0.1);
00193         ras.add_path(tpoly, 0);
00194         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00195 
00196         agg::trans_affine mtx;
00197         mtx *= agg::trans_affine_skewing(0.15, 0.0);
00198         mtx *= trans_affine_resizing();
00199         agg::gsv_text text;
00200         agg::gsv_text_outline<agg::trans_affine> text1(text, mtx);
00201         text.text("Text 2345");
00202         text.size(50, 20);
00203         text1.width(2.0);
00204         text.start_point(320, 10);
00205 
00206         color = agg::rgba(0.0, 0.5, 0.0);
00207         ras.add_path(text1, 0);
00208         agg::render_scanlines_aa_solid(ras, sl, rb, color);
00209 
00210 
00211         color = agg::rgba(0.5, 0.0, 0.0);
00212         agg::path_storage path;
00213         path.move_to(30, -1.0);
00214         path.line_to(60, 0.0);
00215         path.line_to(30, 1.0);
00216 
00217         path.move_to(27, -1.0);
00218         path.line_to(10, 0.0);
00219         path.line_to(27, 1.0);
00220 
00221         agg::conv_transform<agg::path_storage>  trans(path, mtx);
00222 
00223         for(int i = 0; i < 35; i++)
00224         {
00225             mtx.reset();
00226             mtx *= agg::trans_affine_rotation(double(i) / 35.0 * agg::pi * 2.0);
00227             mtx *= agg::trans_affine_translation(400, 130);
00228             mtx *= trans_affine_resizing();
00229             ras.add_path(trans, 0);
00230             agg::render_scanlines_aa_solid(ras, sl, rb, color);
00231         }
00232     }
00233 };
00234 
00235 
00236 
00237 int agg_main(int argc, char* argv[])
00238 {
00239     the_application app(pix_format, flip_y);
00240     app.caption("Anti-Aliasing Gamma Correction");
00241 
00242     if(app.init(500, 400, agg::window_resize))
00243     {
00244         return app.run();
00245     }
00246     return 1;
00247 }
00248 
00249 

© sourcejam.com 2005-2008