diff --git a/src/servers/app/DrawState.cpp b/src/servers/app/DrawState.cpp index 6dbf9c92ec..07546af8e2 100644 --- a/src/servers/app/DrawState.cpp +++ b/src/servers/app/DrawState.cpp @@ -66,7 +66,10 @@ DrawState::operator=(const DrawState& from) fScale = from.fScale; if (from.fClippingRegion) { - SetClippingRegion(*(from.fClippingRegion)); + if (fClippingRegion) + *fClippingRegion = *from.fClippingRegion; + else + fClippingRegion = new BRegion(*from.fClippingRegion); } else { delete fClippingRegion; fClippingRegion = NULL; @@ -302,15 +305,24 @@ DrawState::SetScale(float scale) void DrawState::SetClippingRegion(const BRegion& region) { - if (region.Frame().IsValid()) { + // reset clipping to that of previous state + if (PreviousState() != NULL && PreviousState()->ClippingRegion()) { if (fClippingRegion) - *fClippingRegion = region; - else - fClippingRegion = new BRegion(region); + *fClippingRegion = *(PreviousState()->ClippingRegion()); + else + fClippingRegion = new BRegion(*(PreviousState()->ClippingRegion())); } else { delete fClippingRegion; fClippingRegion = NULL; } + + // add the clipping from the passed region + if (region.Frame().IsValid()) { + if (fClippingRegion) + fClippingRegion->IntersectWith(®ion); + else + fClippingRegion = new BRegion(region); + } }