# HG changeset patch # User "David Bryant " # Date 1247488698 -34200 # Node ID 22abbf4cde96419083c7dfcfa9a59bf6756cc82b # Parent df8d81d9f499edf9cb2d6806428462be9d1a2f2b Checkpoint diff -r df8d81d9f499 -r 22abbf4cde96 canvas.d --- 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 { diff -r df8d81d9f499 -r 22abbf4cde96 icanvas.d --- 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; diff -r df8d81d9f499 -r 22abbf4cde96 page_layer.d --- 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; { diff -r df8d81d9f499 -r 22abbf4cde96 standard_tools.d --- 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; } } diff -r df8d81d9f499 -r 22abbf4cde96 tk/geometry.d --- 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); } diff -r df8d81d9f499 -r 22abbf4cde96 tool.d --- 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 { } } diff -r df8d81d9f499 -r 22abbf4cde96 tool_layer.d --- 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); } }