| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.android_webview; |
| |
| import android.graphics.Canvas; |
| import android.graphics.Picture; |
| import android.graphics.Rect; |
| |
| import org.chromium.base.JNINamespace; |
| import org.chromium.content.common.CleanupReference; |
| |
| import java.io.OutputStream; |
| |
| // A simple wrapper around a SkPicture, that allows final rendering to be performed using the |
| // chromium skia library. |
| @JNINamespace("android_webview") |
| class AwPicture extends Picture { |
| |
| private long mNativeAwPicture; |
| |
| // There is no explicit destroy method on Picture base-class, so cleanup is always |
| // handled via the CleanupReference. |
| private static final class DestroyRunnable implements Runnable { |
| private long mNativeAwPicture; |
| private DestroyRunnable(long nativeAwPicture) { |
| mNativeAwPicture = nativeAwPicture; |
| } |
| @Override |
| public void run() { |
| nativeDestroy(mNativeAwPicture); |
| } |
| } |
| |
| private CleanupReference mCleanupReference; |
| |
| /** |
| * @param nativeAwPicture is an instance of the AwPicture native class. Ownership is |
| * taken by this java instance. |
| */ |
| AwPicture(long nativeAwPicture) { |
| mNativeAwPicture = nativeAwPicture; |
| mCleanupReference = new CleanupReference(this, new DestroyRunnable(nativeAwPicture)); |
| } |
| |
| @Override |
| public Canvas beginRecording(int width, int height) { |
| unsupportedOperation(); |
| return null; |
| } |
| |
| @Override |
| public void endRecording() { |
| // Intentional no-op. The native picture ended recording prior to java c'tor call. |
| } |
| |
| @Override |
| public int getWidth() { |
| return nativeGetWidth(mNativeAwPicture); |
| } |
| |
| @Override |
| public int getHeight() { |
| return nativeGetHeight(mNativeAwPicture); |
| } |
| |
| // Effectively a local variable of draw(), but held as a member to avoid GC churn. |
| private Rect mClipBoundsTemporary = new Rect(); |
| |
| @Override |
| public void draw(Canvas canvas) { |
| canvas.getClipBounds(mClipBoundsTemporary); |
| nativeDraw(mNativeAwPicture, canvas, |
| mClipBoundsTemporary.left, mClipBoundsTemporary.top, |
| mClipBoundsTemporary.right, mClipBoundsTemporary.bottom); |
| } |
| |
| @Override |
| public void writeToStream(OutputStream stream) { |
| unsupportedOperation(); |
| } |
| |
| private void unsupportedOperation() { |
| throw new IllegalStateException("Unsupported in AwPicture"); |
| } |
| |
| private static native void nativeDestroy(long nativeAwPicture); |
| private native int nativeGetWidth(long nativeAwPicture); |
| private native int nativeGetHeight(long nativeAwPicture); |
| private native void nativeDraw(long nativeAwPicture, Canvas canvas, |
| int left, int top, int right, int bottom); |
| } |
| |