diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java b/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java index 01f65678c8..0eacbbee2f 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java @@ -790,6 +790,45 @@ public String toString() { }); } + private class SavedAsyncClip { + Rectangle clip; + Path clipP; + GeneralPath clipGP; + boolean clipIsPath; + } + + private final java.util.ArrayDeque savedClipStack = + new java.util.ArrayDeque(); + + @Override + public void pushClip() { + SavedAsyncClip s = new SavedAsyncClip(); + if (clip != null) { + s.clip = new Rectangle(clip); + } + if (clipP != null) { + s.clipP = new Path(clipP); + } + if (clipGP != null) { + s.clipGP = new GeneralPath(clipGP); + } + s.clipIsPath = clipIsPath; + savedClipStack.push(s); + } + + @Override + public void popClip() { + if (savedClipStack.isEmpty()) { + return; + } + SavedAsyncClip s = savedClipStack.pop(); + clip = s.clip; + clipP = s.clipP; + clipGP = s.clipGP; + clipIsPath = s.clipIsPath; + clipFresh = false; + } + /* private Matrix getTransformMatrix(){ diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java b/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java index 04ef0f7f6f..0a2b1ae24f 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java @@ -1464,7 +1464,32 @@ public int getClipY() { } private boolean clipSet = false; - + + // Stack of clipSet values captured by pushClip. Each pushClip adds an + // unpaired canvas.save() so the clip can be widened (restored) on + // popClip. clipSet is reset to false after the push so that a setClip + // inside the push/pop block doesn't restore our pushed save. + private final java.util.ArrayDeque pushedClipSetStack = new java.util.ArrayDeque(); + + public void pushClip() { + canvas.save(); + pushedClipSetStack.push(Boolean.valueOf(clipSet)); + clipSet = false; + } + + public void popClip() { + if (pushedClipSetStack.isEmpty()) { + return; + } + if (clipSet) { + canvas.restore(); + clipSet = false; + } + canvas.restore(); + clipSet = pushedClipSetStack.pop().booleanValue(); + clipFresh = false; + } + public void setClip(int x, int y, int width, int height) { //System.out.println("Setting clip "+x+","+y+","+width+", "+height); if (clipSet) { diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java index bf146bda53..4a8ee91081 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java @@ -5545,6 +5545,16 @@ public void rotate(Object nativeGraphics, float angle, int x, int y) { ((AndroidGraphics) nativeGraphics).rotate(angle, x, y); } + @Override + public void pushClip(Object graphics) { + ((AndroidGraphics) graphics).pushClip(); + } + + @Override + public void popClip(Object graphics) { + ((AndroidGraphics) graphics).popClip(); + } + @Override public boolean isTranslateMatrixSupported() { return true; diff --git a/scripts/android/screenshots/graphics-clip-under-rotation.png b/scripts/android/screenshots/graphics-clip-under-rotation.png index 8876e1fa9a..3ea0e3894f 100644 Binary files a/scripts/android/screenshots/graphics-clip-under-rotation.png and b/scripts/android/screenshots/graphics-clip-under-rotation.png differ diff --git a/scripts/android/screenshots/graphics-clip.png b/scripts/android/screenshots/graphics-clip.png index 238cf9a664..9aba16ffe9 100644 Binary files a/scripts/android/screenshots/graphics-clip.png and b/scripts/android/screenshots/graphics-clip.png differ