Fixes a bug introduced in I3c3316377874e89fccc85afb864bc038b0ef3890. CreateLocalMatrixShader combines the existing matrix with the new matrix, which is not what we want. Keep track of the original SkShader at all times, and always create the local matrix shader with the original. Store the SkShader with a local matrix as Shader.native_with_local_matrix. Make Shader.native_instance private. Instead of allowing direct access, add an init() method which sets it, and getNativeInstance(), which returns either native_instance or native_with_local_matrix, as appropriate. Make Shader subclasses call init(), instead of setting native_instance directly. Pass native_with_local_matrix pointer to nativeSetLocalMatrix and nativeDestructor, which unrefs it (if not null). Since nativeSetLocalMatrix no longer replaces the original, do not unref it. Add a comment to Shader.updateLocalMatrix that it does not affect ComposeShaders created with this Shader. (This should have been a part of I3c3316377874e89fccc85afb864bc038b0ef3890.) BUG:16293121 Change-Id: Ieb31c7e1fe99081f6b81493178f4a18d3c5df643
62 lines
1.9 KiB
Java
62 lines
1.9 KiB
Java
/*
|
|
* Copyright (C) 2007 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.graphics;
|
|
|
|
/**
|
|
* Shader used to draw a bitmap as a texture. The bitmap can be repeated or
|
|
* mirrored by setting the tiling mode.
|
|
*/
|
|
public class BitmapShader extends Shader {
|
|
/**
|
|
* Prevent garbage collection.
|
|
* @hide
|
|
*/
|
|
@SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
|
|
public final Bitmap mBitmap;
|
|
|
|
private TileMode mTileX;
|
|
private TileMode mTileY;
|
|
|
|
/**
|
|
* Call this to create a new shader that will draw with a bitmap.
|
|
*
|
|
* @param bitmap The bitmap to use inside the shader
|
|
* @param tileX The tiling mode for x to draw the bitmap in.
|
|
* @param tileY The tiling mode for y to draw the bitmap in.
|
|
*/
|
|
public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY) {
|
|
mBitmap = bitmap;
|
|
mTileX = tileX;
|
|
mTileY = tileY;
|
|
final long b = bitmap.ni();
|
|
init(nativeCreate(b, tileX.nativeInt, tileY.nativeInt));
|
|
}
|
|
|
|
/**
|
|
* @hide
|
|
*/
|
|
@Override
|
|
protected Shader copy() {
|
|
final BitmapShader copy = new BitmapShader(mBitmap, mTileX, mTileY);
|
|
copyLocalMatrix(copy);
|
|
return copy;
|
|
}
|
|
|
|
private static native long nativeCreate(long native_bitmap, int shaderTileModeX,
|
|
int shaderTileModeY);
|
|
}
|