diff --git a/src/agg_pixfmt_bgra32_lcd.h b/src/agg_pixfmt_bgra32_lcd.h deleted file mode 100644 index a1cca6d8..00000000 --- a/src/agg_pixfmt_bgra32_lcd.h +++ /dev/null @@ -1,256 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_BGRA32_LCD_INCLUDED -#define AGG_PIXFMT_BGRA32_LCD_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -static int floor_div(int a, int b) { - int rem = a % b; - if (rem < 0) { - rem += b; - } - return (a - rem) / b; -} - -namespace agg -{ - - - //=====================================================lcd_distribution_lut - class lcd_distribution_lut - { - public: - lcd_distribution_lut(double prim, double second, double tert) - { - double norm = 1.0 / (prim + second*2 + tert*2); - prim *= norm; - second *= norm; - tert *= norm; - for(unsigned i = 0; i < 256; i++) - { - unsigned b = (i << 8); - unsigned s = round(second * b); - unsigned t = round(tert * b); - unsigned p = b - (2*s + 2*t); - - m_data[3*i + 1] = s; /* secondary */ - m_data[3*i + 2] = t; /* tertiary */ - m_data[3*i ] = p; /* primary */ - } - } - - unsigned convolution(const int8u* covers, int i0, int i_min, int i_max) const - { - unsigned sum = 0; - int k_min = (i0 >= i_min + 2 ? -2 : i_min - i0); - int k_max = (i0 <= i_max - 2 ? 2 : i_max - i0); - for (int k = k_min; k <= k_max; k++) - { - /* select the primary, secondary or tertiary channel */ - int channel = abs(k) % 3; - int8u c = covers[i0 + k]; - sum += m_data[3*c + channel]; - } - - return (sum + 128) >> 8; - } - - private: - unsigned short m_data[256*3]; - }; - - //========================================================pixfmt_bgra32_lcd - class pixfmt_bgra32_lcd - { - public: - typedef rgba8 color_type; - typedef rendering_buffer::row_data row_data; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - pixfmt_bgra32_lcd(rendering_buffer& rb, const lcd_distribution_lut& lut) - : m_rbuf(&rb), m_lut(&lut) - { - } - - //-------------------------------------------------------------------- - unsigned width() const { - return m_rbuf->width() * 3; - } - unsigned height() const { - return m_rbuf->height(); - } - - - // This method should never be called when using the scanline_u8. - // The use of scanline_p8 should be avoided because if does not works - // properly for rendering fonts because single hspan are split in many - // hline/hspan elements and pixel whitening happens. - void blend_hline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { } - - void copy_hline(int x, int y, unsigned len, const color_type& c) - { - int8u* p = m_rbuf->row_ptr(y) + (x / 3) * 4; - for (int ilen = len; ilen > 0; p += 4, ilen -= 3) - { - p[0] = c.b; - p[1] = c.g; - p[2] = c.r; - p[3] = 0xff; - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x_lcd, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - const int pixel_size = 4; - unsigned rowlen = width(); - int cx = (x_lcd - 2 >= 0 ? -2 : -x_lcd); - int cx_max = (len + 2 <= rowlen ? len + 1 : rowlen - 1); - - const int x_min = floor_div(x_lcd + cx, 3); - const int x_max = floor_div(x_lcd + cx_max, 3); - - const int8u rgb[3] = { c.r, c.g, c.b }; - int8u* p = m_rbuf->row_ptr(y) + x_min * pixel_size; - - const int pixel_index[3] = {2, 1, 0}; - for (int x = x_min; x <= x_max; x++) - { - for (int i = 0; i < 3; i++) { - int new_cx = x * 3 - x_lcd + i; - unsigned c_conv = m_lut->convolution(covers, new_cx, 0, len - 1); - unsigned alpha = (c_conv + 1) * (c.a + 1); - unsigned dst_col = rgb[i]; - unsigned src_col = *(p + pixel_index[i]); - *(p + pixel_index[i]) = (int8u)((((dst_col - src_col) * alpha) + (src_col << 16)) >> 16); - } - p[3] = 0xff; - p += 4; - } - } - - private: - rendering_buffer* m_rbuf; - const lcd_distribution_lut* m_lut; - }; - - template - class pixfmt_bgra32_lcd_gamma - { - public: - typedef rgba8 color_type; - typedef rendering_buffer::row_data row_data; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - pixfmt_bgra32_lcd_gamma(rendering_buffer& rb, const lcd_distribution_lut& lut, const Gamma& gamma) - : m_rbuf(&rb), m_lut(&lut), m_gamma(gamma) - { - } - - //-------------------------------------------------------------------- - unsigned width() const { - return m_rbuf->width() * 3; - } - unsigned height() const { - return m_rbuf->height(); - } - - - // This method should never be called when using the scanline_u8. - // The use of scanline_p8 should be avoided because if does not works - // properly for rendering fonts because single hspan are split in many - // hline/hspan elements and pixel whitening happens. - void blend_hline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { } - - void copy_hline(int x, int y, unsigned len, const color_type& c) - { - int8u* p = m_rbuf->row_ptr(y) + (x / 3) * 4; - for (int ilen = len; ilen > 0; p += 4, ilen -= 3) - { - p[0] = c.b; - p[1] = c.g; - p[2] = c.r; - p[3] = 0xff; - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x_lcd, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - const int pixel_size = 4; - unsigned rowlen = width(); - int cx = (x_lcd - 2 >= 0 ? -2 : -x_lcd); - int cx_max = (len + 2 <= rowlen ? len + 1 : rowlen - 1); - - const int x_min = floor_div(x_lcd + cx, 3); - const int x_max = floor_div(x_lcd + cx_max, 3); - - const int8u rgb[3] = { c.r, c.g, c.b }; - int8u* p = m_rbuf->row_ptr(y) + x_min * pixel_size; - - const int pixel_index[3] = {2, 1, 0}; - for (int x = x_min; x <= x_max; x++) - { - for (int i = 0; i < 3; i++) { - int new_cx = x * 3 - x_lcd + i; - unsigned c_conv = m_lut->convolution(covers, new_cx, 0, len - 1); - unsigned alpha = (c_conv + 1) * (c.a + 1); - unsigned dst_col = m_gamma.dir(rgb[i]); - unsigned src_col = m_gamma.dir(*(p + pixel_index[i])); - *(p + pixel_index[i]) = m_gamma.inv((((dst_col - src_col) * alpha) + (src_col << 16)) >> 16); - } - p[3] = 0xff; - p += 4; - } - } - - private: - rendering_buffer* m_rbuf; - const lcd_distribution_lut* m_lut; - const Gamma& m_gamma; - }; - -} - -#endif - diff --git a/src/agg_pixfmt_rgb24_lcd.h b/src/agg_pixfmt_rgb24_lcd.h deleted file mode 100644 index 0ce36645..00000000 --- a/src/agg_pixfmt_rgb24_lcd.h +++ /dev/null @@ -1,238 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_RGB24_LCD_INCLUDED -#define AGG_PIXFMT_RGB24_LCD_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - - //=====================================================lcd_distribution_lut - class lcd_distribution_lut - { - public: - lcd_distribution_lut(double prim, double second, double tert) - { - double norm = 1.0 / (prim + second*2 + tert*2); - prim *= norm; - second *= norm; - tert *= norm; - for(unsigned i = 0; i < 256; i++) - { - unsigned b = (i << 8); - unsigned s = round(second * b); - unsigned t = round(tert * b); - unsigned p = b - (2*s + 2*t); - - m_data[3*i + 1] = s; /* secondary */ - m_data[3*i + 2] = t; /* tertiary */ - m_data[3*i ] = p; /* primary */ - } - } - - unsigned convolution(const int8u* covers, int i0, int i_min, int i_max) const - { - unsigned sum = 0; - int k_min = (i0 >= i_min + 2 ? -2 : i_min - i0); - int k_max = (i0 <= i_max - 2 ? 2 : i_max - i0); - for (int k = k_min; k <= k_max; k++) - { - /* select the primary, secondary or tertiary channel */ - int channel = abs(k) % 3; - int8u c = covers[i0 + k]; - sum += m_data[3*c + channel]; - } - - return (sum + 128) >> 8; - } - - private: - unsigned short m_data[256*3]; - }; - - - //========================================================pixfmt_rgb24_lcd - class pixfmt_rgb24_lcd - { - public: - typedef rgba8 color_type; - typedef rendering_buffer::row_data row_data; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - pixfmt_rgb24_lcd(rendering_buffer& rb, const lcd_distribution_lut& lut) - : m_rbuf(&rb), m_lut(&lut) - { - } - - //-------------------------------------------------------------------- - unsigned width() const { - return m_rbuf->width() * 3; - } - unsigned height() const { - return m_rbuf->height(); - } - - - // This method should never be called when using the scanline_u8. - // The use of scanline_p8 should be avoided because if does not works - // properly for rendering fonts because single hspan are split in many - // hline/hspan elements and pixel whitening happens. - void blend_hline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { } - - void copy_hline(int x, int y, unsigned len, const color_type& c) - { - int xr = x - (x % 3); - int8u* p = m_rbuf->row_ptr(y) + xr; - for (int ilen = len; ilen > 0; p += 3, ilen -= 3) - { - p[0] = c.r; - p[1] = c.g; - p[2] = c.b; - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - unsigned rowlen = width(); - int cx = (x - 2 >= 0 ? -2 : -x); - int cx_max = (len + 2 <= rowlen ? len + 1 : rowlen - 1); - - int i = (x + cx) % 3; - - int8u rgb[3] = { c.r, c.g, c.b }; - int8u* p = m_rbuf->row_ptr(y) + (x + cx); - - for (/* */; cx <= cx_max; cx++) - { - unsigned c_conv = m_lut->convolution(covers, cx, 0, len - 1); - unsigned alpha = (c_conv + 1) * (c.a + 1); - unsigned dst_col = rgb[i], src_col = (*p); - *p = (int8u)((((dst_col - src_col) * alpha) + (src_col << 16)) >> 16); - - p ++; - i = (i + 1) % 3; - } - } - - private: - rendering_buffer* m_rbuf; - const lcd_distribution_lut* m_lut; - }; - - - template - class pixfmt_rgb24_lcd_gamma - { - public: - typedef rgba8 color_type; - typedef rendering_buffer::row_data row_data; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - pixfmt_rgb24_lcd_gamma(rendering_buffer& rb, const lcd_distribution_lut& lut, const Gamma& gamma) - : m_rbuf(&rb), m_lut(&lut), m_gamma(gamma) - { - } - - //-------------------------------------------------------------------- - unsigned width() const { - return m_rbuf->width() * 3; - } - unsigned height() const { - return m_rbuf->height(); - } - - - // This method should never be called when using the scanline_u8. - // The use of scanline_p8 should be avoided because if does not works - // properly for rendering fonts because single hspan are split in many - // hline/hspan elements and pixel whitening happens. - void blend_hline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { } - - void copy_hline(int x, int y, unsigned len, const color_type& c) - { - int xr = x - (x % 3); - int8u* p = m_rbuf->row_ptr(y) + xr; - for (int ilen = len; ilen > 0; p += 3, ilen -= 3) - { - p[0] = c.r; - p[1] = c.g; - p[2] = c.b; - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - unsigned rowlen = width(); - int cx = (x - 2 >= 0 ? -2 : -x); - int cx_max = (len + 2 <= rowlen ? len + 1 : rowlen - 1); - - int i = (x + cx) % 3; - - int8u rgb[3] = { c.r, c.g, c.b }; - int8u* p = m_rbuf->row_ptr(y) + (x + cx); - - for (/* */; cx <= cx_max; cx++) - { - unsigned c_conv = m_lut->convolution(covers, cx, 0, len - 1); - unsigned alpha = (c_conv + 1) * (c.a + 1); - unsigned dst_col = m_gamma.dir(rgb[i]), src_col = m_gamma.dir(*p); - *p = m_gamma.inv((((dst_col - src_col) * alpha) + (src_col << 16)) >> 16); - - p ++; - i = (i + 1) % 3; - } - } - - private: - rendering_buffer* m_rbuf; - const lcd_distribution_lut* m_lut; - const Gamma& m_gamma; - }; - -} - -#endif - diff --git a/src/font_render_lcd.h b/src/font_render_lcd.h deleted file mode 100644 index 072ebb7b..00000000 --- a/src/font_render_lcd.h +++ /dev/null @@ -1,187 +0,0 @@ -#pragma once - -#include "agg_basics.h" -#include "agg_conv_curve.h" -#include "agg_conv_transform.h" -#include "agg_gamma_lut.h" -#include "agg_font_freetype.h" -// #include "agg_pixfmt_rgb.h" -#include "agg_pixfmt_rgba.h" -// #include "agg_pixfmt_rgb24_lcd.h" -#include "agg_pixfmt_bgra32_lcd.h" -#include "agg_rasterizer_scanline_aa.h" -#include "agg_renderer_primitives.h" -#include "agg_renderer_scanline.h" -#include "agg_rendering_buffer.h" -#include "agg_scanline_u.h" - -// FIXME: the pixel type rgb24 of rgba32 is hard coded below -class font_renderer_lcd -{ - typedef agg::pixfmt_bgra32 pixfmt_type; - typedef agg::renderer_base base_ren_type; - typedef agg::renderer_scanline_aa_solid renderer_solid; - typedef agg::font_engine_freetype_int32 font_engine_type; - typedef agg::font_cache_manager font_manager_type; - - font_engine_type m_feng; - font_manager_type m_fman; - agg::gamma_lut<> m_gamma_lut; - - // Font rendering options. - bool m_hinting; - bool m_kerning; - bool m_grayscale; - double m_gamma; - - bool m_font_loaded; - - // Pipeline to process the vectors glyph paths (curves + contour) - agg::trans_affine m_mtx; - agg::conv_curve m_curves; - agg::conv_transform > m_trans; -public: - font_renderer_lcd(bool hinting, bool kerning, bool subpixel, double gamma): - m_feng(), - m_fman(m_feng), - m_hinting(hinting), - m_kerning(kerning), - m_grayscale(!subpixel), - m_gamma(gamma), - m_font_loaded(false), - m_curves(m_fman.path_adaptor()), - m_trans(m_curves, m_mtx) - { - m_gamma_lut.gamma(m_gamma); - } - - bool get_font_vmetrics(int& ascender, int& descender) { - int face_height = m_feng.face_height(); - if (face_height > 0) { - double current_height = m_feng.height(); - m_feng.height(1.0); - ascender = m_feng.ascender() * face_height; - descender = m_feng.descender() * face_height; - m_feng.height(current_height); - return true; - } - return false; - } - - float scale_for_em_to_pixels(float size) { - int units_per_em = m_feng.face_units_em(); - if (units_per_em > 0) { - return size / units_per_em; - } - return 0.0; - } - - bool load_font(const char *font_filename) { - if(m_feng.load_font(font_filename, 0, agg::glyph_ren_outline)) { - m_font_loaded = true; - } - return m_font_loaded; - } - - template - void draw_text(Rasterizer& ras, Scanline& sl, - RenSolid& ren_solid, const agg::rgba8 color, - const char* text, - double& x, double& y, double height, - unsigned subpixel_scale) - { - const double scale_x = 100; - - m_feng.height(height); - m_feng.width(height * scale_x * subpixel_scale); - m_feng.hinting(m_hinting); - - const char* p = text; - - // Represent the delta in x scaled by subpixel and scale_x. - double x_delta = 0; - double start_x_lcd = x * subpixel_scale; - - while(*p) - { - if(*p == '\n') - { - x_delta = 0; - y -= height * 1.25; - ++p; - continue; - } - - const agg::glyph_cache* glyph = m_fman.glyph(*p); - if(glyph) - { - if(m_kerning) - { - m_fman.add_kerning(&x_delta, &y); - } - - m_fman.init_embedded_adaptors(glyph, 0, 0); - if(glyph->data_type == agg::glyph_data_outline) - { - double ty = m_hinting ? floor(y + 0.5) : y; - ras.reset(); - m_mtx.reset(); - m_mtx *= agg::trans_affine_scaling(1.0 / scale_x, 1); - m_mtx *= agg::trans_affine_translation(start_x_lcd + x_delta / scale_x, ty); - ras.add_path(m_trans); - ren_solid.color(color); - agg::render_scanlines(ras, sl, ren_solid); - } - - // increment pen position - x_delta += glyph->advance_x; - y += glyph->advance_y; - } - ++p; - } - // Update x value befor returning. - x += x_delta / (scale_x * subpixel_scale); - } - - void clear(agg::rendering_buffer& ren_buf, const agg::rgba8 color) { - agg::pixfmt_bgra32 pf(ren_buf); - base_ren_type ren_base(pf); - ren_base.clear(color); - } - - void render_text(agg::rendering_buffer& ren_buf, - const double text_size, - const agg::rgba8 text_color, - double& x, double& y, - const char *text) - { - if (!m_font_loaded) { - return; - } - - agg::scanline_u8 sl; - agg::rasterizer_scanline_aa<> ras; - ras.clip_box(0, 0, ren_buf.width()*3, ren_buf.height()); - - //-------------------------------------- - if(m_grayscale) - { - agg::pixfmt_bgra32 pf(ren_buf); - base_ren_type ren_base(pf); - renderer_solid ren_solid(ren_base); - draw_text(ras, sl, ren_solid, text_color, text, x, y, text_size, 1); - } - else - { - // Conventional LUT values: (1./3., 2./9., 1./9.) - // The values below are fine tuned as in the Elementary Plot library. - // The primary weight should be 0.448 but is left adjustable. - agg::lcd_distribution_lut lut(0.448, 0.184, 0.092); - typedef agg::pixfmt_bgra32_lcd_gamma > pixfmt_lcd_type; - pixfmt_lcd_type pf_lcd(ren_buf, lut, m_gamma_lut); - agg::renderer_base ren_base_lcd(pf_lcd); - agg::renderer_scanline_aa_solid > ren_solid_lcd(ren_base_lcd); - draw_text(ras, sl, ren_solid_lcd, text_color, text, x, y, text_size, 3); - } - } -};