changeset 778:61c217f8cec8

Fix bug of transformation from user space to image space.
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 30 Aug 2010 13:07:49 +0800
parents 72b5bb88979f
children 8e9481bf1cc0
files nodejs/coord.cc nodejs/mbfly_njs.cc nodejs/testcase.js src/shape_image.c
diffstat 4 files changed, 31 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/nodejs/coord.cc	Mon Aug 30 08:57:31 2010 +0800
+++ b/nodejs/coord.cc	Mon Aug 30 13:07:49 2010 +0800
@@ -212,6 +212,7 @@
     shape_hdl = (Persistent<Object> *)mb_prop_get(&shape->obj.props,
 						  PROP_JSOBJ);
     shape_hdl->ClearWeak();
+    rdman_shape_changed(rdman, shape);
 }
 
 static void
--- a/nodejs/mbfly_njs.cc	Mon Aug 30 08:57:31 2010 +0800
+++ b/nodejs/mbfly_njs.cc	Mon Aug 30 13:07:49 2010 +0800
@@ -26,6 +26,7 @@
         *err = "Can not allocate a redraw_man_t";
 	return NULL;
     }
+    rdman_coord_changed(rdman, coord);
 
     return coord;
 }
--- a/nodejs/testcase.js	Mon Aug 30 08:57:31 2010 +0800
+++ b/nodejs/testcase.js	Mon Aug 30 13:07:49 2010 +0800
@@ -22,8 +22,9 @@
 var ldr = mbfly.img_ldr_new(".");
 var img_data = ldr.load("sample.png");
 var paint = mb_rt.paint_image_new(img_data);
+var img_coord = mb_rt.coord_new(root);
 paint.fill(img);
-root.add_shape(img);
+img_coord.add_shape(img);
 
 /* test linear paint and rectangle */
 var rect = mb_rt.rect_new(100, 100, 50, 50, 10, 10);
@@ -143,6 +144,23 @@
 	mb_rt.flush();
     });
 
+var resize_sw = 0;
+setInterval(function() {
+	var sz;
+	
+	resize_sw++;
+	
+	sz = (resize_sw % 20) - 10;
+	if(sz < 0)
+	    sz = -sz;
+	sz = 2 - sz / 10;
+	
+	img_coord[0] = sz;
+	img_coord[4] = sz;
+	mb_rt.redraw_changed();
+	mb_rt.flush();
+    }, 50);
+
 var kbobserver;
 /* Keyboard event */
 kbobserver = mb_rt.kbevents.add_event_observer(6, function(evt) {
--- a/src/shape_image.c	Mon Aug 30 08:57:31 2010 +0800
+++ b/src/shape_image.c	Mon Aug 30 13:07:49 2010 +0800
@@ -104,6 +104,7 @@
     paint_t *paint;
     co_aix (*poses)[2];
     co_aix img_matrix[6];
+    co_aix rev_matrix[6];
     co_aix x_factor, y_factor;
     int img_w, img_h;
     int i;
@@ -130,26 +131,25 @@
     
     paint_image_get_size(paint, &img_w, &img_h);
     
-    /* Transformation from user space to image space */
+    /* Transformation from image space to user space */
     img_matrix[0] = (poses[1][0] - poses[0][0]) / img->w;
-    img_matrix[1] = (poses[1][1] - poses[0][1]) / img->w;
-    img_matrix[2] = -poses[0][0];
-    img_matrix[3] = (poses[3][0] - poses[0][0]) / img->h;
+    img_matrix[1] = (poses[3][0] - poses[3][0]) / img->h;
+    img_matrix[2] = poses[0][0];
+    img_matrix[3] = (poses[1][1] - poses[0][1]) / img->w;
     img_matrix[4] = (poses[3][1] - poses[0][1]) / img->h;
-    img_matrix[5] = -poses[0][1];
+    img_matrix[5] = poses[0][1];
     if(img->w != img_w ||
        img->h != img_h) {
 	/* Resize image */
-	x_factor = img_w / img->w;
+	x_factor = img->w / img_w;
 	img_matrix[0] *= x_factor;
 	img_matrix[1] *= x_factor;
-	img_matrix[2] *= x_factor;
-	y_factor = img_h / img->h;
+	y_factor = img->h / img_h;
 	img_matrix[3] *= y_factor;
 	img_matrix[4] *= y_factor;
-	img_matrix[5] *= y_factor;
     }
-    paint_image_set_matrix(sh_get_fill(shape), img_matrix);
+    compute_reverse(img_matrix, rev_matrix);
+    paint_image_set_matrix(sh_get_fill(shape), rev_matrix);
 }
 
 /*! \brief Draw image for an image shape.