1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2010 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage android.graphics; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.Bridge; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.DelegateManager; 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.graphics.Shader.TileMode; 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Delegate implementing the native methods of android.graphics.BitmapShader 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Through the layoutlib_create tool, the original native methods of BitmapShader have been 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * replaced by calls to methods of the same name in this delegate class. 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This class behaves like the original native implementation, but in Java, keeping previously 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * native data into its own objects and mapping them to int that are sent back and forth between 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * it and the original BitmapShader class. 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager}, 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}. 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * @see Shader_Delegate 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class BitmapShader_Delegate extends Shader_Delegate { 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- delegate data ---- 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private java.awt.Paint mJavaPaint; 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- Public Helper methods ---- 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public java.awt.Paint getJavaPaint() { 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mJavaPaint; 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public boolean isSupported() { 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return true; 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public String getSupportMessage() { 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // no message since isSupported returns true; 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- native methods ---- 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 6888a8364c386c694f7ad56662ef89713dbf7c9d63Narayan Kamath /*package*/ static long nativeCreate(long native_bitmap, int shaderTileModeX, 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int shaderTileModeY) { 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(native_bitmap); 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (bitmap == null) { 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 0; 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski BitmapShader_Delegate newDelegate = new BitmapShader_Delegate( 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bitmap.getImage(), 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Shader_Delegate.getTileMode(shaderTileModeX), 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Shader_Delegate.getTileMode(shaderTileModeY)); 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return sManager.addNewDelegate(newDelegate); 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- Private delegate/helper methods ---- 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private BitmapShader_Delegate(java.awt.image.BufferedImage image, 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski TileMode tileModeX, TileMode tileModeY) { 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mJavaPaint = new BitmapShaderPaint(image, tileModeX, tileModeY); 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private class BitmapShaderPaint implements java.awt.Paint { 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final java.awt.image.BufferedImage mImage; 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final TileMode mTileModeX; 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final TileMode mTileModeY; 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski BitmapShaderPaint(java.awt.image.BufferedImage image, 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski TileMode tileModeX, TileMode tileModeY) { 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mImage = image; 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mTileModeX = tileModeX; 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mTileModeY = tileModeY; 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public java.awt.PaintContext createContext( 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.image.ColorModel colorModel, 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.Rectangle deviceBounds, 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.geom.Rectangle2D userBounds, 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.geom.AffineTransform xform, 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.RenderingHints hints) { 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.geom.AffineTransform canvasMatrix; 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski canvasMatrix = xform.createInverse(); 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (java.awt.geom.NoninvertibleTransformException e) { 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski "Unable to inverse matrix in BitmapShader", e, null /*data*/); 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski canvasMatrix = new java.awt.geom.AffineTransform(); 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.geom.AffineTransform localMatrix = getLocalMatrix(); 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski localMatrix = localMatrix.createInverse(); 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (java.awt.geom.NoninvertibleTransformException e) { 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski "Unable to inverse matrix in BitmapShader", e, null /*data*/); 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski localMatrix = new java.awt.geom.AffineTransform(); 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new BitmapShaderContext(canvasMatrix, localMatrix, colorModel); 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private class BitmapShaderContext implements java.awt.PaintContext { 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final java.awt.geom.AffineTransform mCanvasMatrix; 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final java.awt.geom.AffineTransform mLocalMatrix; 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final java.awt.image.ColorModel mColorModel; 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public BitmapShaderContext( 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.geom.AffineTransform canvasMatrix, 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.geom.AffineTransform localMatrix, 139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.image.ColorModel colorModel) { 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mCanvasMatrix = canvasMatrix; 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLocalMatrix = localMatrix; 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mColorModel = colorModel; 143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void dispose() { 147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public java.awt.image.ColorModel getColorModel() { 151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mColorModel; 152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public java.awt.image.Raster getRaster(int x, int y, int w, int h) { 156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, 157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski java.awt.image.BufferedImage.TYPE_INT_ARGB); 158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int[] data = new int[w*h]; 160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int index = 0; 162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski float[] pt1 = new float[2]; 163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski float[] pt2 = new float[2]; 164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (int iy = 0 ; iy < h ; iy++) { 165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (int ix = 0 ; ix < w ; ix++) { 166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // handle the canvas transform 167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski pt1[0] = x + ix; 168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski pt1[1] = y + iy; 169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mCanvasMatrix.transform(pt1, 0, pt2, 0, 1); 170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // handle the local matrix. 172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski pt1[0] = pt2[0]; 173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski pt1[1] = pt2[1]; 174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLocalMatrix.transform(pt1, 0, pt2, 0, 1); 175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski data[index++] = getColor(pt2[0], pt2[1]); 177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/); 181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return image.getRaster(); 183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Returns a color for an arbitrary point. 188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private int getColor(float fx, float fy) { 190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int x = getCoordinate(Math.round(fx), mImage.getWidth(), mTileModeX); 191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int y = getCoordinate(Math.round(fy), mImage.getHeight(), mTileModeY); 192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mImage.getRGB(x, y); 194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private int getCoordinate(int i, int size, TileMode mode) { 197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (i < 0) { 198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski switch (mode) { 199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski case CLAMP: 200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = 0; 201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski break; 202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski case REPEAT: 203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = size - 1 - (-i % size); 204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski break; 205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski case MIRROR: 206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is the same as the positive side, just make the value positive 207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // first. 208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = -i; 209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int count = i / size; 210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = i % size; 211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if ((count % 2) == 1) { 213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = size - 1 - i; 214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski break; 216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } else if (i >= size) { 218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski switch (mode) { 219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski case CLAMP: 220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = size - 1; 221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski break; 222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski case REPEAT: 223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = i % size; 224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski break; 225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski case MIRROR: 226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int count = i / size; 227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = i % size; 228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if ((count % 2) == 1) { 230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski i = size - 1 - i; 231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski break; 233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return i; 237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getTransparency() { 242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return java.awt.Paint.TRANSLUCENT; 243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 246