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
00015
00016
00017
00018
00019
00020
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