[Fresco-devel] Bogus traversals (and patch)
Nick Lewycky <[email protected]>
| Newsgroups | gmane.comp.video.fresco.devel |
|---|---|
| Message-ID | <[email protected]> |
I found something strange while writing a Traversal for myself: it wouldn't traverse through an RGBDecorator. With some investigation I found what may have been an optimization for performance, but it's caused some contention with correctness (at least, as far as I understand Fresco's design.) The Traversal system was doing the following: Traversal calls Graphic->draw Graphic->draw sets the foreground colour and calls child_graphic->traverse(Traversal) then restores the colour and returns. What's supposed to happen is: Traversal calls Graphic->draw Graphic->draw sets the foreground colour and returns Traversal calls Graphic->traverse Graphic->traverse calls Traversal->traverse_child for each child of the Traversal. The bug is that some graphics will go through their children instead of going back through the Traversal's traverse_child function. If the Traversal never calls draw or pick, then it will never be able to traverse that part of the tree! The catch with the correct method is that the Graphic never gets around to restoring the state of the DrawingKit, so the Traversal has to do it instead. This costs one DrawingKitState push and pop pair per Graphic. I don't notice any performance hit on my computer, of course. ;-) I've attached the patch which fixes the affected Graphics. Can anyone comment on whether the optimization is "too good to lose," or if my understanding of the visitor pattern is mistaken? (Does it cause any new bugs? I tested it against demo and minesweeper, but that's hardly exhaustive.) Or even if you can just comment on my code quality, I'd appreciate it. Thanks, Nick Lewycky
traversal.patch
(text/plain, 22.7 KB)
Index: Berlin/modules/Figures/FigureImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Figures/FigureImpl.cc,v
retrieving revision 1.21
diff -u -w -r1.21 FigureImpl.cc
--- Berlin/modules/Figures/FigureImpl.cc 29 May 2002 06:49:39 -0000 1.21
+++ Berlin/modules/Figures/FigureImpl.cc 26 Aug 2002 22:13:25 -0000
@@ -189,7 +189,6 @@
{
DrawingKit_var drawing = traversal->drawing();
Color color = drawing->foreground();
- drawing->save();
Transform_var tmp = drawing->transformation();
Lease_var<TransformImpl> cumulative(Provider<TransformImpl>::provide());
cumulative->copy(Transform_var(drawing->transformation()));
@@ -207,7 +206,6 @@
// drawing->surface_fillstyle(DrawingKit::outlined);
drawing->draw_path(_path);
// }
- drawing->restore();
}
}
}
Index: Berlin/modules/Figures/ImageImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Figures/ImageImpl.cc,v
retrieving revision 1.14
diff -u -w -r1.14 ImageImpl.cc
--- Berlin/modules/Figures/ImageImpl.cc 29 May 2002 06:49:39 -0000 1.14
+++ Berlin/modules/Figures/ImageImpl.cc 26 Aug 2002 22:13:25 -0000
@@ -68,18 +68,14 @@
Texture::Texture(Raster_ptr r) : raster(RefCount_var<Fresco::Raster>::increment(r)) {}
Texture::~Texture() {}
-void Texture::traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+void Texture::traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal);}
void Texture::draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
drawing->texture(raster);
drawing->surface_fillstyle(DrawingKit::textured);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
void Texture::pick(PickTraversal_ptr traversal)
{
- MonoGraphic::traverse(traversal);
}
Index: Berlin/modules/Gadgets/GadgetKitImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Gadgets/GadgetKitImpl.cc,v
retrieving revision 1.12
diff -u -w -r1.12 GadgetKitImpl.cc
--- Berlin/modules/Gadgets/GadgetKitImpl.cc 29 May 2002 06:49:39 -0000 1.12
+++ Berlin/modules/Gadgets/GadgetKitImpl.cc 26 Aug 2002 22:13:25 -0000
@@ -70,18 +70,15 @@
color.green = green->value();
color.blue = blue->value();
}
- virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+ virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal); }
virtual void draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Color tmp = drawing->foreground();
color.alpha = tmp.alpha;
drawing->foreground(color);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
- virtual void pick(PickTraversal_ptr traversal) { MonoGraphic::traverse(traversal);}
+ virtual void pick(PickTraversal_ptr traversal) {}
virtual void update(const CORBA::Any &)
{
@@ -100,18 +97,15 @@
{
public:
AlphaAdjuster(BoundedValue_ptr v) : alpha(v->value()) {}
- virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+ virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal);}
virtual void draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Color color = drawing->foreground();
color.alpha *= alpha;
drawing->foreground(color);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
- virtual void pick(PickTraversal_ptr traversal) { MonoGraphic::traverse(traversal);}
+ virtual void pick(PickTraversal_ptr traversal) {}
virtual void update(const CORBA::Any &any) { any >>= alpha; need_redraw();}
private:
@@ -131,11 +125,10 @@
color.green = green->value();
color.blue = blue->value();
}
- virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+ virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal);}
virtual void draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Color tmp = drawing->lighting();
/*
* how is the light attribute concatenated, subtractive, additive ? -stefan
@@ -144,10 +137,8 @@
tmp.green *= color.green;
tmp.blue *= color.blue;
drawing->lighting(tmp);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
- virtual void pick(PickTraversal_ptr traversal) { MonoGraphic::traverse(traversal);}
+ virtual void pick(PickTraversal_ptr traversal) {}
virtual void update(const CORBA::Any &)
{
Index: Berlin/modules/Layout/Backdrop.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Layout/Backdrop.cc,v
retrieving revision 1.5
diff -u -w -r1.5 Backdrop.cc
--- Berlin/modules/Layout/Backdrop.cc 29 May 2002 06:49:39 -0000 1.5
+++ Berlin/modules/Layout/Backdrop.cc 26 Aug 2002 22:13:25 -0000
@@ -94,11 +94,13 @@
void Backdrop::traverse(Traversal_ptr t)
{
+#if 0
if (t->op() == GraphicTraversal::draw)
{
if (!is_nil(offset->child))
draw(t);
}
else
+#endif
MonoGraphic::traverse(t);
}
Index: Berlin/modules/Layout/ViewportImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Layout/ViewportImpl.cc,v
retrieving revision 1.30
diff -u -w -r1.30 ViewportImpl.cc
--- Berlin/modules/Layout/ViewportImpl.cc 29 May 2002 06:49:39 -0000 1.30
+++ Berlin/modules/Layout/ViewportImpl.cc 26 Aug 2002 22:13:25 -0000
@@ -346,7 +346,6 @@
clipping->apply_transform(transformation);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
drawing->clipping(Region_var(clipping->_this()));
Lease_var<RegionImpl> region(Provider<RegionImpl>::provide());
@@ -361,7 +360,6 @@
try { traversal->traverse_child (_child.peer, _child.localId, Region_var(region->_this()), Transform_var(transform->_this()));}
catch (const CORBA::OBJECT_NOT_EXIST &) { body(Fresco::Graphic::_nil());}
catch (const CORBA::COMM_FAILURE &) { body(Fresco::Graphic::_nil());}
- drawing->restore();
}
void ViewportImpl::pick(PickTraversal_ptr traversal)
Index: Berlin/modules/Primitives/Light.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Primitives/Light.cc,v
retrieving revision 1.2
diff -u -w -r1.2 Light.cc
--- Berlin/modules/Primitives/Light.cc 29 May 2002 06:49:40 -0000 1.2
+++ Berlin/modules/Primitives/Light.cc 26 Aug 2002 22:13:25 -0000
@@ -32,22 +32,16 @@
Light::Light(const Color &color, double intensity) : _color(color), _intensity(intensity) {}
Light::~Light() {}
-void Light::traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+void Light::traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal);}
void Light::draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
DrawingKit3D_var d3d = DrawingKit3D::_narrow(drawing);
if (!CORBA::is_nil(d3d))
do_draw(d3d);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
-void Light::pick(Fresco::PickTraversal_ptr traversal)
-{
- MonoGraphic::traverse(traversal);
-}
+void Light::pick(Fresco::PickTraversal_ptr traversal) {}
DirectionalLight::DirectionalLight(const Fresco::Color &color, double intensity, const Fresco::Vertex &direction)
: Light(color, intensity), _direction(direction) {}
Index: Berlin/modules/Tools/Beveler.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Tools/Beveler.cc,v
retrieving revision 1.14
diff -u -w -r1.14 Beveler.cc
--- Berlin/modules/Tools/Beveler.cc 29 May 2002 06:49:40 -0000 1.14
+++ Berlin/modules/Tools/Beveler.cc 26 Aug 2002 22:13:25 -0000
@@ -42,7 +42,6 @@
Coord topi = top + thickness;
Coord bottomi = bottom - thickness;
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Path path;
path.nodes.length(5);
path.shape = convex;
@@ -103,8 +102,6 @@
path.nodes[3].x = righti, path.nodes[3].y = bottomi, path.nodes[3].z = 0.;
path.nodes[4].x = right, path.nodes[4].y = bottom, path.nodes[4].z = 0.;
drawing->draw_path(path);
-
- drawing->restore();
}
void leftArrow(DrawTraversal_ptr traversal, Coord thickness, const Color &medium, const Color &light, const Color &dark,
@@ -118,7 +115,6 @@
Coord dy = thickness * (1 + slope);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Path path;
path.shape = convex;
@@ -162,7 +158,6 @@
path.nodes[3].x = left + dx, path.nodes[3].y = center.y, path.nodes[3].z = 0;
path.nodes[4] = path.nodes[0];
drawing->draw_path(path);
- drawing->restore();
}
void rightArrow(DrawTraversal_ptr traversal, Coord thickness, const Color &medium, const Color &light, const Color &dark,
@@ -175,7 +170,6 @@
Coord dy = thickness * (1 + slope);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Path path;
path.shape = convex;
@@ -219,7 +213,6 @@
path.nodes[3].x = right - dx, path.nodes[3].y = center.y, path.nodes[3].z = 0;
path.nodes[4] = path.nodes[0];
drawing->draw_path(path);
- drawing->restore();
}
void upArrow(DrawTraversal_ptr traversal, Coord thickness, const Color &medium, const Color &light, const Color &dark,
@@ -232,7 +225,6 @@
Coord dx = thickness * (1 + 1 / slope);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Path path;
path.shape = convex;
@@ -276,7 +268,6 @@
path.nodes[3].x = left + dx, path.nodes[3].y = bottom - thickness, path.nodes[3].z = 0;
path.nodes[4] = path.nodes[0];
drawing->draw_path(path);
- drawing->restore();
}
void downArrow(DrawTraversal_ptr traversal, Coord thickness, const Color &medium, const Color &light, const Color &dark,
@@ -289,7 +280,6 @@
Coord dx = thickness * (1 + 1 / slope);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Path path;
path.shape = convex;
@@ -333,7 +323,6 @@
path.nodes[3].x = left + dx, path.nodes[3].y = top + thickness, path.nodes[3].z = 0;
path.nodes[4] = path.nodes[0];
drawing->draw_path(path);
- drawing->restore();
}
void diamond(DrawTraversal_ptr traversal, Coord thickness, const Color &medium, const Color &light, const Color &dark,
@@ -345,7 +334,6 @@
Coord dy = thickness * std::sqrt(length.y * length.y / (length.x * length.x) + 1.0);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Path path;
path.shape = convex;
@@ -398,7 +386,6 @@
path.nodes[3].x = center.x, path.nodes[3].y = bottom - dy, path.nodes[3].z = 0;
path.nodes[4] = path.nodes[0];
drawing->draw_path(path);
- drawing->restore();
}
void circle(DrawTraversal_ptr, Coord thickness, const Color &medium, const Color &light, const Color &dark,
Index: Berlin/modules/Tools/Diamond.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Tools/Diamond.cc,v
retrieving revision 1.11
diff -u -w -r1.11 Diamond.cc
--- Berlin/modules/Tools/Diamond.cc 29 May 2002 06:49:40 -0000 1.11
+++ Berlin/modules/Tools/Diamond.cc 26 Aug 2002 22:13:25 -0000
@@ -40,7 +40,6 @@
allocation->bounds(l, u);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
if (drawing->surface_fillstyle() == DrawingKit::outlined)
drawing->surface_fillstyle(DrawingKit::solid);
@@ -100,7 +99,6 @@
path.nodes[4] = path.nodes[0];
drawing->draw_path(path);
}
- drawing->restore();
}
void BeveledDiamond::draw(DrawTraversal_ptr traversal)
@@ -113,7 +111,6 @@
Color light = brightness(color,-_bright);
Color dark = brightness(color, _bright);
- drawing->save();
if (drawing->surface_fillstyle() == DrawingKit::outlined)
drawing->surface_fillstyle(DrawingKit::solid);
@@ -136,7 +133,6 @@
Beveler::diamond(traversal, _thickness/2, color, light, dark, l.x, u.x, l.y, u.y, _fill);
break;
}
- drawing->restore();
}
void ColoredDiamond::draw(DrawTraversal_ptr traversal)
@@ -146,7 +142,6 @@
allocation->bounds(l, u);
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
if (drawing->surface_fillstyle() == DrawingKit::outlined)
drawing->surface_fillstyle(DrawingKit::solid);
Color tmp = drawing->foreground();
@@ -211,6 +206,5 @@
path.nodes[4] = path.nodes[0];
drawing->draw_path(path);
}
- drawing->restore();
}
Index: Berlin/modules/Tools/DrawingStateImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Tools/DrawingStateImpl.cc,v
retrieving revision 1.3
diff -u -w -r1.3 DrawingStateImpl.cc
--- Berlin/modules/Tools/DrawingStateImpl.cc 29 May 2002 06:49:40 -0000 1.3
+++ Berlin/modules/Tools/DrawingStateImpl.cc 26 Aug 2002 22:13:25 -0000
@@ -37,13 +37,13 @@
{
Trace trace("DrawingStateImpl::traverse");
traversal->visit(Graphic_var(_this()));
+ MonoGraphic::traverse(traversal);
}
void DrawingStateImpl::draw(DrawTraversal_ptr traversal)
{
Trace trace("DrawingStateImpl::draw");
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
if (_enabled & color) drawing->foreground(_color);
if (_enabled & light) drawing->lighting(_light);
if (_enabled & point) drawing->point_size(_point);
@@ -51,14 +51,11 @@
if (_enabled & estyle) drawing->line_endstyle(_estyle);
if (_enabled & fstyle) drawing->surface_fillstyle(_fstyle);
if (_enabled & tex) drawing->texture(_texture);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
void DrawingStateImpl::pick(PickTraversal_ptr traversal)
{
Trace trace("DrawingStateImpl::pick");
- MonoGraphic::traverse(traversal);
}
Color DrawingStateImpl::foreground() { return _color;}
Index: Berlin/modules/Tools/Frame.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Tools/Frame.cc,v
retrieving revision 1.15
diff -u -w -r1.15 Frame.cc
--- Berlin/modules/Tools/Frame.cc 29 May 2002 06:49:40 -0000 1.15
+++ Berlin/modules/Tools/Frame.cc 26 Aug 2002 22:13:25 -0000
@@ -177,14 +177,13 @@
Vertex l, u;
allocation->bounds(l, u);
DrawingKit_var drawing = traversal->drawing();
+ drawing->save();
DrawingKit::Fillstyle style = drawing->surface_fillstyle();
if (style != DrawingKit::outlined && _fill) drawing->draw_rectangle(l, u);
else if (_fill)
{
- drawing->save();
drawing->surface_fillstyle(DrawingKit::solid);
drawing->draw_rectangle(l, u);
- drawing->restore();
}
else
{
@@ -200,6 +199,7 @@
utmp = u;
drawing->draw_rectangle(ltmp, utmp);
}
+ drawing->restore();
}
void Bevel::draw(DrawTraversal_ptr traversal)
@@ -208,7 +208,7 @@
Vertex u, l;
allocation->bounds(l, u);
DrawingKit_var drawing = traversal->drawing();
- //drawing->transformation(traversal->current_transformation());
+ drawing->save();
Color color = drawing->foreground();
Color light = brightness(color, _bright);
Color dark = brightness(color,-_bright);
@@ -231,6 +231,7 @@
Beveler::rect(traversal, _thickness/2, color, light, dark, l.x, u.x, l.y, u.y, _fill);
break;
}
+ drawing->restore();
}
void ColoredFrame::draw(DrawTraversal_ptr traversal)
@@ -239,8 +240,8 @@
Vertex l, u;
allocation->bounds(l, u);
DrawingKit_var drawing = traversal->drawing();
- DrawingKit::Fillstyle style = drawing->surface_fillstyle();
drawing->save();
+ DrawingKit::Fillstyle style = drawing->surface_fillstyle();
Color tmp = drawing->foreground();
tmp.red = _color.red;
tmp.green = _color.green;
Index: Berlin/modules/Tools/ToolKitImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Tools/ToolKitImpl.cc,v
retrieving revision 1.21
diff -u -w -r1.21 ToolKitImpl.cc
--- Berlin/modules/Tools/ToolKitImpl.cc 1 Jun 2002 00:30:18 -0000 1.21
+++ Berlin/modules/Tools/ToolKitImpl.cc 26 Aug 2002 22:13:25 -0000
@@ -49,18 +49,15 @@
{
public:
RGBDecorator(Coord r, Coord g, Coord b) : red(r), green(g), blue(b) {}
- virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+ virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal);}
virtual void draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Color color = drawing->foreground();
color.red = red, color.green = green, color.blue = blue;
drawing->foreground(color);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
- virtual void pick(PickTraversal_ptr traversal) { MonoGraphic::traverse(traversal);}
+ virtual void pick(PickTraversal_ptr traversal) {}
private:
Coord red, green, blue;
};
@@ -69,18 +66,15 @@
{
public:
LightingDecorator(Coord r, Coord g, Coord b) : red(r), green(g), blue(b) {}
- virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+ virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal);}
virtual void draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Color color = drawing->lighting();
color.red *= red, color.green *= green, color.blue *= blue;
drawing->lighting(color);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
- virtual void pick(PickTraversal_ptr traversal) { MonoGraphic::traverse(traversal);}
+ virtual void pick(PickTraversal_ptr traversal) {}
private:
Coord red, green, blue;
};
@@ -89,18 +83,15 @@
{
public:
AlphaDecorator(Coord a) : alpha(a) {}
- virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this()));}
+ virtual void traverse(Traversal_ptr traversal) { traversal->visit(Graphic_var(_this())); MonoGraphic::traverse(traversal);}
virtual void draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Color color = drawing->foreground();
color.alpha *= alpha;
drawing->foreground(color);
- MonoGraphic::traverse(traversal);
- drawing->restore();
}
- virtual void pick(PickTraversal_ptr traversal) { MonoGraphic::traverse(traversal);}
+ virtual void pick(PickTraversal_ptr traversal) {}
private:
Coord alpha;
};
Index: Berlin/modules/Tools/Triangle.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Tools/Triangle.cc,v
retrieving revision 1.10
diff -u -w -r1.10 Triangle.cc
--- Berlin/modules/Tools/Triangle.cc 29 May 2002 06:49:40 -0000 1.10
+++ Berlin/modules/Tools/Triangle.cc 26 Aug 2002 22:13:26 -0000
@@ -76,7 +76,6 @@
}
else if (_fill)
{
- drawing->save();
drawing->surface_fillstyle(DrawingKit::solid);
Path path;
path.shape = convex;
@@ -109,7 +108,6 @@
break;
}
drawing->draw_path(path);
- drawing->restore();
}
else
{
@@ -142,7 +140,6 @@
Color light = brightness(color,-_bright);
Color dark = brightness(color, _bright);
- drawing->save();
if (drawing->surface_fillstyle() == DrawingKit::outlined)
drawing->surface_fillstyle(DrawingKit::solid);
@@ -233,7 +230,6 @@
}
break;
}
- drawing->restore();
}
void ColoredTriangle::draw(DrawTraversal_ptr traversal)
@@ -243,7 +239,6 @@
allocation->bounds(l, u);
DrawingKit_var drawing = traversal->drawing();
DrawingKit::Fillstyle style = drawing->surface_fillstyle();
- drawing->save();
Color tmp = drawing->foreground();
tmp.red = _color.red;
tmp.green = _color.green;
@@ -265,6 +260,5 @@
utmp = u;
drawing->draw_rectangle(ltmp, utmp);
}
- drawing->restore();
}
Index: Berlin/modules/Unidraw/ViewImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Unidraw/ViewImpl.cc,v
retrieving revision 1.4
diff -u -w -r1.4 ViewImpl.cc
--- Berlin/modules/Unidraw/ViewImpl.cc 29 May 2002 06:49:40 -0000 1.4
+++ Berlin/modules/Unidraw/ViewImpl.cc 26 Aug 2002 22:13:26 -0000
@@ -33,12 +33,12 @@
{
Trace trace("UViewImpl::traverse");
traversal->visit(Graphic_var(_this()));
+ MonoGraphic::traverse(traversal);
}
void UViewImpl::draw(DrawTraversal_ptr traversal)
{
Trace trace("UViewImpl::draw");
- MonoGraphic::traverse(traversal);
}
void UViewImpl::pick(PickTraversal_ptr traversal)
Index: Berlin/modules/Widgets/Motif/Gauge.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/modules/Widgets/Motif/Gauge.cc,v
retrieving revision 1.6
diff -u -w -r1.6 Gauge.cc
--- Berlin/modules/Widgets/Motif/Gauge.cc 29 May 2002 06:49:40 -0000 1.6
+++ Berlin/modules/Widgets/Motif/Gauge.cc 26 Aug 2002 22:13:26 -0000
@@ -43,7 +43,6 @@
void Gauge::draw(DrawTraversal_ptr traversal)
{
DrawingKit_var drawing = traversal->drawing();
- drawing->save();
Coord l = value->lower();
Coord u = value->upper();
Coord v = value->value();
@@ -68,7 +67,6 @@
// for (unsigned int i = 0; i != path.p.length(); i++) transform->transformVertex(path.p[i]);
drawing->foreground(brightness(color, -0.7));
drawing->draw_path(path);
- drawing->restore();
}
void Gauge::update(const CORBA::Any &)
Index: Berlin/src/DrawTraversalImpl.cc
===================================================================
RCS file: /cvs/fresco/Fresco/Berlin/src/DrawTraversalImpl.cc,v
retrieving revision 1.49
diff -u -w -r1.49 DrawTraversalImpl.cc
--- Berlin/src/DrawTraversalImpl.cc 29 May 2002 06:49:41 -0000 1.49
+++ Berlin/src/DrawTraversalImpl.cc 26 Aug 2002 22:13:26 -0000
@@ -133,6 +133,7 @@
_drawing->transformation(Transform_var(cumulative->_this()));
// drawable->clipping(region, Transform_var(tx->_this()));
push(child, tag, allocation, cumulative); // Keep ownership of cumulative!
+ _drawing->save();
try
{
child->traverse(__this);
@@ -141,12 +142,17 @@
{
// Make sure cumulative does not go out of scope before the pop() ;-)
pop();
+ _drawing->restore();
throw;
}
pop(); // cumulative still in scope...
+ _drawing->restore();
};
-void DrawTraversalImpl::visit(Graphic_ptr g) { g->draw(__this);}
+void DrawTraversalImpl::visit(Graphic_ptr g)
+{
+ g->draw(__this);
+}
Fresco::Traversal::order DrawTraversalImpl::direction() { return Fresco::Traversal::up;}
CORBA::Boolean DrawTraversalImpl::ok() { return true;}
DrawingKit_ptr DrawTraversalImpl::drawing() { return DrawingKit::_duplicate(_drawing);}