19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
23cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * A Picture records drawing calls (via the canvas returned by beginRecording)
24cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * and can then play them back into Canvas (via {@link Picture#draw(Canvas)} or
25cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * {@link Canvas#drawPicture(Picture)}).For most content (e.g. text, lines, rectangles),
26cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * drawing a sequence from a picture can be faster than the equivalent API
27cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * calls, since the picture performs its playback without incurring any
28cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * method-call overhead.
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Picture {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Canvas mRecordingCanvas;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int mNativePicture;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy    /**
35f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     * @hide
36f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     */
37f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy    public final boolean createdFromStream;
38f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int WORKING_STREAM_STORAGE = 16 * 1024;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger    /**
42cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * Creates an empty picture that is ready to record.
43cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Picture() {
45f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy        this(nativeConstructor(0), false);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a picture by making a copy of what has already been recorded in
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * src. The contents of src are unchanged, and if src changes later, those
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changes will not be reflected in this picture.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Picture(Picture src) {
54f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy        this(nativeConstructor(src != null ? src.mNativePicture : 0), false);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * To record a picture, call beginRecording() and then draw into the Canvas
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is returned. Nothing we appear on screen, but all of the draw
60cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * commands (e.g. {@link Canvas#drawRect(Rect, Paint)}) will be recorded.
61cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * To stop recording, call endRecording(). After endRecording() the Canvas
62cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * that was returned must no longer be used, and nothing should be drawn
63cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * into it.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Canvas beginRecording(int width, int height) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int ni = nativeBeginRecording(mNativePicture, width, height);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRecordingCanvas = new RecordingCanvas(this, ni);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRecordingCanvas;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call endRecording when the picture is built. After this call, the picture
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may be drawn, but the canvas that was returned by beginRecording must not
74cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * be used anymore. This is automatically called if {@link Picture#draw}
75cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * or {@link Canvas#drawPicture(Picture)} is called.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endRecording() {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRecordingCanvas != null) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecordingCanvas = null;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nativeEndRecording(mNativePicture);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the width of the picture as passed to beginRecording. This
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * does not reflect (per se) the content of the picture.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getWidth();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the height of the picture as passed to beginRecording. This
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * does not reflect (per se) the content of the picture.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getHeight();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Draw this picture on the canvas. The picture may have the side effect
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of changing the matrix and clip of the canvas.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
100cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * <p>
101cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * <strong>Note:</strong> This forces the picture to internally call
102cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * {@link Picture#endRecording()} in order to prepare for playback.
103cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     *
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas  The picture is drawn to this canvas
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRecordingCanvas != null) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            endRecording();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nativeDraw(canvas.mNativeCanvas, mNativePicture);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new picture (already recorded) from the data in the stream. This
115cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * data was generated by a previous call to writeToStream(). Pictures that
116cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * have been persisted across device restarts are not guaranteed to decode
117cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * properly and are highly discouraged.
118cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     *
119cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * <p>
120f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     * <strong>Note:</strong> a picture created from an input stream cannot be
121f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     * replayed on a hardware accelerated canvas.
122f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     *
123cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * @see #writeToStream(java.io.OutputStream)
124cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * @deprecated The recommended alternative is to not use writeToStream and
125cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * instead draw the picture into a Bitmap from which you can persist it as
126cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * raw or compressed pixels.
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
128cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger    @Deprecated
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Picture createFromStream(InputStream stream) {
130f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy        return new Picture(nativeCreateFromStream(stream, new byte[WORKING_STREAM_STORAGE]), true);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Write the picture contents to a stream. The data can be used to recreate
135cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * the picture in this or another process by calling createFromStream(...)
136cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * The resulting stream is NOT to be persisted across device restarts as
137cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * there is no guarantee that the Picture can be successfully reconstructed.
138f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     *
139cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * <p>
140f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     * <strong>Note:</strong> a picture created from an input stream cannot be
141f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy     * replayed on a hardware accelerated canvas.
142cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     *
143cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * @see #createFromStream(java.io.InputStream)
144cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * @deprecated The recommended alternative is to draw the picture into a
145cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger     * Bitmap from which you can persist it as raw or compressed pixels.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
147cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger    @Deprecated
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToStream(OutputStream stream) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // do explicit check before calling the native method
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (stream == null) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NullPointerException();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!nativeWriteToStream(mNativePicture, stream,
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             new byte[WORKING_STREAM_STORAGE])) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
16084fce187b0ae79adc5b4e64c26f72c8ed59e9703Romain Guy        try {
16184fce187b0ae79adc5b4e64c26f72c8ed59e9703Romain Guy            nativeDestructor(mNativePicture);
16284fce187b0ae79adc5b4e64c26f72c8ed59e9703Romain Guy        } finally {
16384fce187b0ae79adc5b4e64c26f72c8ed59e9703Romain Guy            super.finalize();
16484fce187b0ae79adc5b4e64c26f72c8ed59e9703Romain Guy        }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
166f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy
167f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy    final int ni() {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNativePicture;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy    private Picture(int nativePicture, boolean fromStream) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nativePicture == 0) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNativePicture = nativePicture;
176f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy        createdFromStream = fromStream;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // return empty picture if src is 0, or a copy of the native src
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int nativeConstructor(int nativeSrcOr0);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int nativeCreateFromStream(InputStream stream,
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                byte[] storage);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int nativeBeginRecording(int nativeCanvas,
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int w, int h);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void nativeEndRecording(int nativeCanvas);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void nativeDraw(int nativeCanvas, int nativePicture);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean nativeWriteToStream(int nativePicture,
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                           OutputStream stream, byte[] storage);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void nativeDestructor(int nativePicture);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class RecordingCanvas extends Canvas {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Picture mPicture;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public RecordingCanvas(Picture pict, int nativeCanvas) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(nativeCanvas);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPicture = pict;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setBitmap(Bitmap bitmap) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Cannot call setBitmap on a picture canvas");
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void drawPicture(Picture picture) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPicture == picture) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException(
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Cannot draw a picture into its recording canvas");
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.drawPicture(picture);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
216