fixed window code to handle resizing and when layer image is not cached - gsl-shell.git - gsl-shell

index : gsl-shell.git
gsl-shell
summary refs log tree commit diff
path: root/agg-plot/window.cpp
diff options
context:
space:
mode:
authorfrancesco-ST <francesco.abbate@st.com>2010年09月14日 14:43:17 +0200
committerfrancesco-ST <francesco.abbate@st.com>2010年09月14日 14:43:17 +0200
commitb08f3d4033af5d7f2f5e715cef54a7e695de2a35 (patch)
tree3801d3ca6fe628fe7e3bd71840d7b66707dfff32 /agg-plot/window.cpp
parent6437833a3359390ce4126bb0934585e0345ccb32 (diff)
downloadgsl-shell-b08f3d4033af5d7f2f5e715cef54a7e695de2a35.tar.gz
fixed window code to handle resizing and when layer image is not cached
Diffstat (limited to 'agg-plot/window.cpp')
-rw-r--r--agg-plot/window.cpp 72
1 files changed, 51 insertions, 21 deletions
diff --git a/agg-plot/window.cpp b/agg-plot/window.cpp
index 72004a2b..51fe18d3 100644
--- a/agg-plot/window.cpp
+++ b/agg-plot/window.cpp
@@ -85,6 +85,27 @@ int window::ref::calculate(window::ref::node* t, const bmatrix& m, int id)
}
void
+window::ref::save_image (agg::rendering_buffer& win_buf,
+ agg::rect_base<int>& r,
+ int img_bpp, bool flip_y)
+{
+ int w = r.x2 - r.x1, h = r.y2 - r.y1;
+ int row_len = w * (img_bpp / 8);
+
+ if (layer_buf == 0)
+ {
+ unsigned int bufsize = row_len * h;
+ layer_buf = new(std::nothrow) unsigned char[bufsize];
+ }
+
+ if (layer_buf != 0)
+ {
+ layer_img.attach(layer_buf, w, h, flip_y ? -row_len : row_len);
+ rendering_buffer_get_region (layer_img, win_buf, r, img_bpp / 8);
+ }
+}
+
+void
window::draw_rec(ref::node *n)
{
ref::node::list *ls;
@@ -168,24 +189,7 @@ window::save_slot_image(int slot_id)
this->scale(mtx);
agg::rect_base<int> r = rect_of_slot_matrix(mtx);
- int w = r.x2 - r.x1, h = r.y2 - r.y1;
-
- unsigned img_bpp = this->bpp();
- int row_len = w * (img_bpp / 8);
-
- if (ref->layer_buf == 0)
- {
- unsigned int bufsize = row_len * h;
- ref->layer_buf = new(std::nothrow) unsigned char[bufsize];
- ref->layer_img.attach(ref->layer_buf, w, h, this->flip_y() ? -row_len : row_len);
- }
-
- if (ref->layer_buf != 0)
- {
- agg::rendering_buffer& img = ref->layer_img;
- agg::rendering_buffer& win = this->rbuf_window();
- rendering_buffer_get_region (img, win, r, img_bpp / 8);
- }
+ ref->save_image(this->rbuf_window(), r, this->bpp(), this->flip_y());
}
}
@@ -199,13 +203,18 @@ window::restore_slot_image(int slot_id)
this->scale(mtx);
agg::rect_base<int> r = rect_of_slot_matrix(mtx);
- unsigned img_bpp = this->bpp();
- if (ref->layer_buf != 0)
+ if (ref->layer_buf == 0)
+ {
+ m_canvas->clear_box(r);
+ draw_slot_by_ref (*ref, false);
+ ref->save_image(this->rbuf_window(), r, this->bpp(), this->flip_y());
+ }
+ else
{
agg::rendering_buffer& img = ref->layer_img;
agg::rendering_buffer& win = this->rbuf_window();
- rendering_buffer_put_region (win, img, r, img_bpp / 8);
+ rendering_buffer_put_region (win, img, r, this->bpp() / 8);
}
}
}
@@ -239,6 +248,27 @@ window::on_draw()
draw_rec(m_tree);
}
+struct dispose_buffer {
+ static void func (window::ref& ref)
+ {
+ if (ref.layer_buf)
+ {
+ delete [] ref.layer_buf;
+ ref.layer_buf = 0;
+ }
+ }
+};
+
+void
+window::on_resize(int sx, int sy)
+{
+ this->canvas_window::on_resize(sx, sy);
+ if (m_tree)
+ {
+ tree::walk_rec<window::ref, direction_e, dispose_buffer>(m_tree);
+ }
+}
+
void
window::cleanup_tree_rec (lua_State *L, int window_index, ref::node* n)
{
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月16日 05:18:02 +0000

AltStyle によって変換されたページ (->オリジナル) /