-rw-r--r-- | agg-plot/plot.h | 147 |
diff --git a/agg-plot/plot.h b/agg-plot/plot.h index 53348c1b..67507494 100644 --- a/agg-plot/plot.h +++ b/agg-plot/plot.h @@ -25,12 +25,16 @@ #include "utils.h" #include "my_list.h" +#include "strpp.h" #include "drawable.h" #include "canvas.h" #include "units.h" #include "resource-manager.h" #include "colors.h" #include "rect.h" +#include "canvas_svg.h" +#include "trans.h" +#include "text.h" #include "agg_array.h" #include "agg_bounding_rect.h" @@ -72,14 +76,10 @@ public: m_root_layer(), m_layers(), m_current_layer(&m_root_layer), m_drawing_queue(0), m_clip_flag(true), m_need_redraw(true), m_rect(), - m_use_units(use_units), m_pad_units(false), m_title_buf(), + m_use_units(use_units), m_pad_units(false), m_title(), m_sync_mode(true) { compute_user_trans(); - - m_title_buf.capacity(32); - m_title = m_title_buf.data(); - m_title[0] = '0円'; }; virtual ~plot() @@ -94,7 +94,7 @@ public: }; void set_title(const char *text); - const char *title() const { return m_title; }; + const char *title() const { return m_title.cstr(); }; void set_units(bool use_units); bool use_units() const { return m_use_units; }; @@ -104,7 +104,8 @@ public: virtual void add(vertex_source* vs, agg::rgba8& color, bool outline); virtual void before_draw() { }; - void draw(canvas &canvas, agg::trans_affine& m); + template <class Canvas> + void draw(Canvas &canvas, agg::trans_affine& m); virtual bool push_layer(); virtual bool pop_layer(); @@ -139,14 +140,21 @@ public: bool pad_mode() { return m_pad_units; }; protected: - void draw_elements(canvas &canvas, agg::trans_affine& m); - void draw_element(item& c, canvas &canvas, agg::trans_affine& m); - void draw_title(canvas& canvas, agg::trans_affine& m); - void draw_axis(canvas& can, agg::trans_affine& m); + template <typename Canvas> + void draw_elements(Canvas &canvas, agg::trans_affine& m); + + template <typename Canvas> + void draw_element(item& c, Canvas &canvas, agg::trans_affine& m); + + template <typename Canvas> + void draw_title(Canvas& canvas, agg::trans_affine& m); + + template <typename Canvas> + void draw_axis(Canvas& can, agg::trans_affine& m); agg::trans_affine get_scaled_matrix(agg::trans_affine& canvas_mtx); - void clip_plot_area(canvas &canvas, agg::trans_affine& canvas_mtx); + template <class Canvas> void clip_plot_area(Canvas &canvas, agg::trans_affine& canvas_mtx); void compute_user_trans(); @@ -176,15 +184,14 @@ protected: private: bool m_pad_units; - agg::pod_vector<char> m_title_buf; - char *m_title; + str m_title; bool m_sync_mode; }; static double compute_scale(agg::trans_affine& m) { - return min(m.sy, m.sx) / 480.0; + return min(fabs(m.sy), fabs(m.sx)) / 480.0; } static double @@ -218,10 +225,7 @@ void plot<VS,RM>::add(VS* vs, agg::rgba8& color, bool outline) template <class VS, class RM> void plot<VS,RM>::set_title(const char *text) { - unsigned int len = strlen(text); - m_title_buf.resize(len+1); - m_title = m_title_buf.data(); - memcpy (m_title, text, len+1); + str_copy_c(&m_title, text); } template <class VS, class RM> @@ -248,7 +252,7 @@ void plot<VS,RM>::clear_drawing_queue() } template <class VS, class RM> -void plot<VS,RM>::draw(canvas &canvas, agg::trans_affine& canvas_mtx) +template <class Canvas> void plot<VS,RM>::draw(Canvas &canvas, agg::trans_affine& canvas_mtx) { before_draw(); draw_title(canvas, canvas_mtx); @@ -258,9 +262,9 @@ void plot<VS,RM>::draw(canvas &canvas, agg::trans_affine& canvas_mtx) }; template <class VS, class RM> -void plot<VS,RM>::draw_title(canvas &canvas, agg::trans_affine& canvas_mtx) +template <class Canvas> void plot<VS,RM>::draw_title(Canvas &canvas, agg::trans_affine& canvas_mtx) { - double xt = 0.5, yt = 1; + double xt = 0.5, yt = 1.05; agg::trans_affine m; this->viewport_scale(m); @@ -268,27 +272,17 @@ void plot<VS,RM>::draw_title(canvas &canvas, agg::trans_affine& canvas_mtx) double scale = compute_scale(canvas_mtx); - agg::gsv_text title; - agg::conv_stroke<agg::gsv_text> titlestroke(title); - - title.size(12.0 * scale); - title.text(m_title); - - titlestroke.width(std_line_width(scale)); - titlestroke.line_cap(agg::round_cap); - titlestroke.line_join(agg::round_join); + draw::text title(12.0 * scale, std_line_width(scale)); + title.set_text(m_title.cstr()); + title.hjustif(0.5); + title.set_point(xt, yt); + title.apply_transform(m, 1.0); - m.transform(&xt, &yt); - - xt += -title.text_width() / 2; - yt += 10.0 * scale; - - title.start_point(xt, yt); - canvas.draw(titlestroke, agg::rgba(0, 0, 0)); + canvas.draw(*(drawable *) &title, agg::rgba(0, 0, 0)); } template<class VS, class RM> -void plot<VS,RM>::draw_element(item& c, canvas &canvas, agg::trans_affine& m) +template <class Canvas> void plot<VS,RM>::draw_element(item& c, Canvas &canvas, agg::trans_affine& m) { VS& vs = c.vertex_source(); vs.apply_transform(m, 1.0); @@ -309,7 +303,7 @@ agg::trans_affine plot<VS,RM>::get_scaled_matrix(agg::trans_affine& canvas_mtx) } template<class VS, class RM> -void plot<VS,RM>::clip_plot_area(canvas &canvas, agg::trans_affine& canvas_mtx) +template <class Canvas> void plot<VS,RM>::clip_plot_area(Canvas &canvas, agg::trans_affine& canvas_mtx) { if (this->clip_is_active()) { @@ -322,7 +316,7 @@ void plot<VS,RM>::clip_plot_area(canvas &canvas, agg::trans_affine& canvas_mtx) } template<class VS, class RM> -void plot<VS,RM>::draw_elements(canvas &canvas, agg::trans_affine& canvas_mtx) +template <class Canvas> void plot<VS,RM>::draw_elements(Canvas &canvas, agg::trans_affine& canvas_mtx) { agg::trans_affine m = get_scaled_matrix(canvas_mtx); @@ -400,7 +394,7 @@ void plot<VS,RM>::compute_user_trans() } template <class VS, class RM> -void plot<VS,RM>::draw_axis(canvas &canvas, agg::trans_affine& canvas_mtx) +template <class Canvas> void plot<VS,RM>::draw_axis(Canvas &canvas, agg::trans_affine& canvas_mtx) { typedef agg::path_storage path_type; typedef agg::conv_dash<agg::conv_transform<path_type>, agg::vcgen_markers_term> dash_type; @@ -420,12 +414,15 @@ void plot<VS,RM>::draw_axis(canvas &canvas, agg::trans_affine& canvas_mtx) agg::path_storage ln; agg::conv_transform<path_type> lntr(ln, m); - dash_type lndash(lntr); - agg::conv_stroke<dash_type> lns(lndash); + svg_proxy<agg::conv_transform<path_type> > lntrsvg(&lntr); + trans<svg_context>::dash lndashsvg(&lntrsvg); + trans<svg_context>::stroke lns(&lndashsvg); const double yeps = 1.0e-3; const double xeps = 1.0e-3; + double line_width = std_line_width(scale); + { int jinf = m_uy.begin(), jsup = m_uy.end(); for (int j = jinf; j <= jsup; j++) @@ -434,32 +431,26 @@ void plot<VS,RM>::draw_axis(canvas &canvas, agg::trans_affine& canvas_mtx) this->m_trans.transform(&x, &y); if (y >= - yeps && y <= 1.0 + yeps) { - agg::gsv_text lab; - agg::conv_stroke<agg::gsv_text> labs(lab); + draw::text label(12.0 * scale, line_width); char lab_text[32]; - double xlab = 0, ylab = y; - lab.size(12.0 * scale); m_uy.mark_label(lab_text, 32, j); - lab.text(lab_text); - labs.width(std_line_width(scale)); + label.set_text(lab_text); - m.transform(&xlab, &ylab); + label.hjustif(1.0); + label.vjustif(0.5); + label.set_point(-0.02, y); + label.apply_transform(m, 1.0); - xlab += -lab.text_width() - 10.0 * scale; - ylab += -5.0 * scale; - - lab.start_point(xlab, ylab); - canvas.draw(labs, agg::rgba(0, 0, 0)); + canvas.draw(*(drawable *) &label, agg::rgba(0, 0, 0)); mark.move_to(0.0, y); mark.line_to(-0.01, y); - if (j > jinf && j < jsup) - { - ln.move_to(0.0, y); - ln.line_to(1.0, y); - } + if (j > jinf && j < jsup) { + ln.move_to(0.0, y); + ln.line_to(1.0, y); + } } } } @@ -468,44 +459,38 @@ void plot<VS,RM>::draw_axis(canvas &canvas, agg::trans_affine& canvas_mtx) int jinf = m_ux.begin(), jsup = m_ux.end(); for (int j = jinf; j <= jsup; j++) { - double x = m_ux.mark_value(j), y = m_uy.mark_value(j); + double x = m_ux.mark_value(j), y = 0.0; this->m_trans.transform(&x, &y); if (x >= - xeps && x <= 1.0 + xeps) { - agg::gsv_text lab; - agg::conv_stroke<agg::gsv_text> labs(lab); + draw::text label(12.0 * scale, line_width); char lab_text[32]; - double xlab = x, ylab = 0; - lab.size(12.0 * scale); m_ux.mark_label(lab_text, 32, j); - lab.text(lab_text); - labs.width(std_line_width(scale)); - - m.transform(&xlab, &ylab); + label.set_text(lab_text); - xlab += -lab.text_width()/2.0; - ylab += -24.0 * scale; + label.hjustif(0.5); + label.vjustif(1.6); + label.set_point(x, 0); + label.apply_transform(m, 1.0); - lab.start_point(xlab, ylab); - canvas.draw(labs, agg::rgba(0, 0, 0)); + canvas.draw(*(drawable *) &label, agg::rgba(0, 0, 0)); mark.move_to(x, 0.0); mark.line_to(x, -0.01); - if (j > jinf && j < jsup) - { - ln.move_to(x, 0.0); - ln.line_to(x, 1.0); - } + if (j > jinf && j < jsup) { + ln.move_to(x, 0.0); + ln.line_to(x, 1.0); + } } } } - lndash.add_dash(7.0, 3.0); + lndashsvg.add_dash(7.0, 3.0); lns.width(std_line_width(scale, 0.25)); - canvas.draw(lns, colors::black); + canvas.draw(*(svg_vs *) &lns, colors::black); mark_stroke.width(std_line_width(scale, 0.75)); canvas.draw(mark_stroke, colors::black); |