changeset 19:22abbf4cde96

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Mon, 13 Jul 2009 22:08:18 +0930
parents df8d81d9f499
children d6e7a5a6f008
files canvas.d icanvas.d page_layer.d standard_tools.d tk/geometry.d tool.d tool_layer.d
diffstat 7 files changed, 50 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/canvas.d	Mon Jul 13 17:08:32 2009 +0930
+++ b/canvas.d	Mon Jul 13 22:08:18 2009 +0930
@@ -228,19 +228,18 @@
             scope model_cr = new Context(dr);
             scope pixel_cr = new Context(dr);
 
-            Rectangle damage =
+            Rectangle pixel_damage =
                 event is null ?
-                Rectangle(Point(0.0, 0.0), Vector(cast(double)width, cast(double)height)) :
-                Rectangle(Point(cast(double)event.area.x, cast(double)event.area.y),
+                Rectangle(Point(0.0, 0.0), mViewSize) :
+                Rectangle(Point(cast(double)event.area.x, mViewSize.y - cast(double)(event.area.y + event.area.height)),
                           Vector(cast(double)event.area.width, cast(double)event.area.height));
 
+            Rectangle model_damage = pixel_to_model(pixel_damage);
+
+            //writefln("Pixel damage: %s, model damage: %s", pixel_damage, model_damage);
+
             model_cr.save; pixel_cr.save; {
-                // FIXME restore clipping
-
-                // Setup model context
-
-                //rectangle(model_cr, damage);
-                //model_cr.clip;
+                // Setup model context and clip
 
                 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct;
                 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct;
@@ -249,19 +248,23 @@
                 model_cr.translate(-gtk_adjustment_get_value(h_gtkAdjustment),
                                    -gtk_adjustment_get_value(v_gtkAdjustment) - gtk_adjustment_get_page_size(v_gtkAdjustment));
 
-                // Setup pixel context
+                rectangle(model_cr, model_damage);
+                model_cr.clip;
+
+                // Setup pixel context and clip
 
                 pixel_cr.translate(0.0, mViewSize.y);
                 pixel_cr.scale(1.0, -1.0);
-                //rectangle(pixel_cr, damage);
-                //pixel_cr.clip;
+
+                rectangle(pixel_cr, pixel_damage);
+                pixel_cr.clip;
 
                 // Fill the background
 
                 pixel_cr.save; {
                     // Make the window light grey
                     pixel_cr.setSourceRgba(0.6, 0.6, 0.6, 1.0);
-                    rectangle(pixel_cr, damage);
+                    rectangle(pixel_cr, pixel_damage);
                     pixel_cr.fill;
                 } pixel_cr.restore;
 
@@ -269,7 +272,7 @@
 
                 foreach(ref layer; mLayers) {
                     model_cr.save; pixel_cr.save; {
-                        layer.draw(this, damage, model_cr, pixel_cr);
+                        layer.draw(this, pixel_damage, pixel_cr, model_damage, model_cr);
                     } pixel_cr.restore; model_cr.restore;
                 }
             } pixel_cr.restore; model_cr.restore;
@@ -379,7 +382,7 @@
 
             //writefln("%s", view_left_bottom);
             mViewCentre = view_left_top + model_size / 2.0;
-            writefln("onValueChanged mViewCentre: %s", mViewCentre);
+            //writefln("onValueChanged mViewCentre: %s", mViewCentre);
 
             update_rulers;
 
@@ -398,7 +401,6 @@
 
 
             mHRuler.getRange(lower, upper, position, max_size);
-            writefln("HRuler: %f %f %f", view_left_bottom.x, view_right_top.x, position);
             mHRuler.setRange(view_left_bottom.x,
                              view_right_top.x,
                              position,
@@ -454,9 +456,8 @@
                 //writefln("Quantised damage: %d %d %d %d", x, y, w, h);
                 y = cast(int)mViewSize.y - (y + h);
                 //writefln("Flipped Quantised damage: %d %d %d %d", x, y, w, h);
-                // FIXME only redraw the damaged area
-                //mDrawingArea.queueDrawArea(x, y, w, h);
-                mDrawingArea.queueDraw();
+                mDrawingArea.queueDrawArea(x, y, w, h);
+                //mDrawingArea.queueDraw();
                 mDamage = Rectangle.DEFAULT;
             }
             else {
--- a/icanvas.d	Mon Jul 13 17:08:32 2009 +0930
+++ b/icanvas.d	Mon Jul 13 22:08:18 2009 +0930
@@ -44,7 +44,9 @@
 
     Rectangle bounds() const;
     //void zoom_changed
-    void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const;
+    void draw(const Viewport viewport,
+              in Rectangle pixel_damage, scope Context pixel_cr,
+              in Rectangle model_damage, scope Context model_cr) const;
 
     private {
         invariant string mName;
--- a/page_layer.d	Mon Jul 13 17:08:32 2009 +0930
+++ b/page_layer.d	Mon Jul 13 22:08:18 2009 +0930
@@ -22,8 +22,9 @@
         return mPageGeometry;
     }
 
-    override void draw(const Viewport viewport, in Rectangle damage,
-                       Context model_cr, Context pixel_cr) const {
+    override void draw(const Viewport viewport,
+                       in Rectangle pixel_damage, scope Context pixel_cr,
+                       in Rectangle model_damage, scope Context model_cr) const {
         // Make the paper white, with a border
 
         model_cr.save; {
--- a/standard_tools.d	Mon Jul 13 17:08:32 2009 +0930
+++ b/standard_tools.d	Mon Jul 13 22:08:18 2009 +0930
@@ -92,7 +92,6 @@
 final class LassoTool : Tool {
     override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
         if (event.button_name == ButtonName.LEFT) {
-            writefln("Start lasso");
             mActive = true;
             mAnchorPoint = mCurrentPoint = event.pixel_point;
             return true;
@@ -104,9 +103,8 @@
 
     override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
         if (event.button_name == ButtonName.LEFT && mActive) {
-            writefln("End lasso");
             mActive = false;
-            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint));
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));
             return true;
         }
         else {
@@ -118,18 +116,23 @@
 
     override bool handle_motion(Viewport viewport, in MotionEvent event) {
         if (mActive) {
-            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint));
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));
             mCurrentPoint = event.pixel_point;
-            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint));
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));
         }
 
         return false;
     }
 
-    override void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const {
+    override void draw(const Viewport viewport,
+                       in Rectangle pixel_damage, scope Context pixel_cr,
+                       in Rectangle model_damage, scope Context model_cr) const {
         if (mActive) {
             pixel_cr.save; {
-                pixel_cr.setSourceRgba(1.0, 0.0, 0.0, 1.0);
+                double[] dashes = [ 4.0, 4.0 ];
+                pixel_cr.setDash(dashes, 0.0);
+                pixel_cr.setSourceRgba(0.0, 0.0, 0.5, 1.0);
+                pixel_cr.setLineWidth(LINE_WIDTH);
                 //writefln("Drawing rectangle: %s", Rectangle(mCurrentPoint, mAnchorPoint));
                 rectangle(pixel_cr, Rectangle(mCurrentPoint, mAnchorPoint));
                 pixel_cr.stroke;
@@ -141,5 +144,6 @@
         bool mActive;
         Point mCurrentPoint;
         Point mAnchorPoint;      // Pixel
+        static invariant double LINE_WIDTH = 1.0;
     }
 }
--- a/tk/geometry.d	Mon Jul 13 17:08:32 2009 +0930
+++ b/tk/geometry.d	Mon Jul 13 22:08:18 2009 +0930
@@ -186,6 +186,12 @@
         return Rectangle(_position, _size + expand_amount);
     }
 
+    Rectangle feathered(double amount) const {
+        assert(amount >= 0.0);
+        return Rectangle(Point(_position.x - amount, _position.y - amount),
+                         Vector(_size.x + 2.0 * amount, _size.y + 2.0 * amount));
+    }
+
     Rectangle shrunk(in Vector shrink_amount) const {
         return Rectangle(_position, _size - shrink_amount);
     }
--- a/tool.d	Mon Jul 13 17:08:32 2009 +0930
+++ b/tool.d	Mon Jul 13 22:08:18 2009 +0930
@@ -43,5 +43,7 @@
     bool handle_key_press(Viewport viewport, in KeyEvent event) { return false; }
     bool handle_key_release(Viewport viewport, in KeyEvent event) { return false; }
 
-    void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const { }
+    void draw(const Viewport viewport,
+              in Rectangle pixel_damage, scope Context pixel_cr,
+              in Rectangle model_damage, scope Context model_cr) const { }
 }
--- a/tool_layer.d	Mon Jul 13 17:08:32 2009 +0930
+++ b/tool_layer.d	Mon Jul 13 22:08:18 2009 +0930
@@ -98,11 +98,12 @@
         return Rectangle();
     }
 
-    override void draw(const Viewport viewport, in Rectangle damage,
-                       Context model_cr, Context screen_cr) const {
+    override void draw(const Viewport viewport,
+                       in Rectangle pixel_damage, scope Context pixel_cr,
+                       in Rectangle model_damage, scope Context model_cr) const {
         // FIXME this isn't how we will really draw the tools...
         foreach (const Tool tool; mTools) {
-            tool.draw(viewport, damage, model_cr, screen_cr);
+            tool.draw(viewport, pixel_damage, pixel_cr, model_damage, model_cr);
         }
     }