📄 verticalmirrortexteffect.java
字号:
//#condition polish.usePolishGui && polish.midp2/* * Created on Jun 20, 2006 at 9:52:50 PM. * * Copyright (c) 2006 Robert Virkus / Enough Software * * This file is part of J2ME Polish. * * J2ME Polish is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * J2ME Polish is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with J2ME Polish; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Commercial licenses are also available, please * refer to the accompanying LICENSE.txt or visit * http://www.j2mepolish.org for details. */package de.enough.polish.ui.texteffects;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;import de.enough.polish.ui.Color;import de.enough.polish.ui.Style;import de.enough.polish.ui.TextEffect;import de.enough.polish.util.DrawUtil;/** * <p>Adds a vertically mirrored text as a shadow to the text.</p> * <p>Activate the shadow text effect by specifying <code>text-effect: mirror-shadow;</code> in your polish.css file. * You can finetune the effect with following attributes: * </p> * <ul> * <li><b>text-mirror-color</b>: the color of the shadow, defaults to the specified font-color.</li> * <li><b>text-mirror-padding</b>: the gap between the text and the mirror-shadow, defaults to 0.</li> * <li><b>text-mirror-steps</b>: The number of pixels until the mirror-shadow fades away, defaults to the given font's height.</li> * <li><b>text-mirror-start-translucency</b>: The opaqueness of the first row of the shadow in percent: between 0 (fully transparent) and 100 (fully opaque)</li> * <li><b>text-mirror-end-translucency</b>: The opaqueness of the last row of the shadow in percent: between 0 (fully transparent) and 100 (fully opaque)</li> * </ul> * <p>Note that this effect is optimized for displaying a single line of text. When your text contains line-breaks, many temporary int arrays will be created. * Also note that this effect requires MIDP 2.0 support. * </p> * * <p>Copyright Enough Software 2006</p> * <pre> * history * Jun 20, 2006 - rob creation * </pre> * @author Robert Virkus, j2mepolish@enough.de */public class VerticalMirrorTextEffect extends TextEffect { //#if polish.MirrorShadowText.ClearColor:defined //#= private final static int CLEAR_COLOR = ${polish.MirrorShadowText.ClearColor}; //#else private final static int CLEAR_COLOR = 0xFF000123; //#endif private int shadowColor; private int padding; private int steps; private int startTranslucency; private int endTranslucency; private int[] rgbData; private int rgbWidth; private int rgbHeight; private Graphics bufferGraphics; private Image bufferImage; private int clearColor; private String lastText; /* (non-Javadoc) * @see de.enough.polish.ui.TextEffect#drawStrings(java.lang.String[], int, int, int, int, int, int, int, int, javax.microedition.lcdui.Graphics) */// public void drawStrings(String[] textLines, int textColor, int x, int y, int leftBorder, int rightBorder, int lineHeight, int maxWidth, int layout, Graphics g) {// if (textLines == this.lastLines) {// g.drawRGB( this.rgbData, 0, this.rgbWidth, x, y, this.rgbWidth, this.rgbHeight, true );// return;// }// // calculate dimensions:// this.lastLines = textLines;// int height = (textLines.length * lineHeight) + this.padding + this.steps;// // prepare RGB data buffer:// prepareRgbBuffer( maxWidth, height );// this.rgbGraphics.setColor( textColor );// this.rgbGraphics.setFont( g.getFont() );// // write each text line and add mirror shadow:// super.drawStrings(textLines, textColor, 0, 0, 0, maxWidth,// lineHeight, maxWidth, layout, this.rgbGraphics);// this.rgbData = new int[ maxWidth * height ];// this.bufferImage.getRGB( this.rgbData, 0, maxWidth, 0, 0, maxWidth, height );// removeClearColor();// g.drawRGB( this.rgbData, 0, this.rgbWidth, x, y, this.rgbWidth, this.rgbHeight, true );//// } // private void removeClearColor( int[] data ) {// for (int i = 0; i < data.length; i++) {// int color = data[i];// if ( color == this.clearColor ) {// data[i] = 0x00000000; // full transparent// } else if ( (color & 0xFF000000) == 0 ){// color |= 0xFF000000;// }// }// } private void prepareRgbBuffer( int width, int height ) { this.rgbWidth = width; this.rgbHeight = height; Image image = Image.createImage( width, height ); this.bufferImage = image; Graphics bufferG = image.getGraphics(); bufferG.setColor( CLEAR_COLOR ); bufferG.fillRect( 0, 0, width + 1, height + 1 ); this.bufferGraphics = bufferG; int[] clearColorArray = new int[1]; image.getRGB(clearColorArray, 0, 1, 0, 0, 1, 1 ); this.clearColor = clearColorArray[0]; } /* (non-Javadoc) * @see de.enough.polish.ui.TextEffect#drawString(java.lang.String, int, int, int, int, javax.microedition.lcdui.Graphics) */ public void drawString(String text, int textColor, int x, int y, int orientation, Graphics g) { g.drawString( text, x, y, orientation); Font font = g.getFont(); int fontHeight = font.getHeight(); if ( text == this.lastText ) { if ( (orientation & Graphics.RIGHT) == Graphics.RIGHT ) { x -= this.rgbWidth; } else if ( (orientation & Graphics.HCENTER) == Graphics.HCENTER ) { x -= this.rgbWidth/2; } g.drawRGB( this.rgbData, 0, this.rgbWidth, x, y + fontHeight + this.padding, this.rgbWidth, this.rgbHeight, true ); return; } int width = font.stringWidth( text ); int height = this.steps; prepareRgbBuffer(width, height); this.bufferGraphics.setFont( font ); this.bufferGraphics.setColor( this.shadowColor ); for (int i=0; i < this.steps; i++ ) { this.bufferGraphics.setClip( 0, i, width, 1 ); this.bufferGraphics.drawString( text, 0, -fontHeight + i*2 + 1, Graphics.LEFT | Graphics.TOP ); //System.out.println( "clip-y=" + i + ", font-y=" + (-fontHeight + i*2 + 1) + ", fontHeight=" + fontHeight); } int[] translucencies = DrawUtil.getGradient( this.startTranslucency, this.endTranslucency, height); int[] data = new int[ width * height ]; this.bufferImage.getRGB( data, 0, width, 0, 0, width, height ); for (int row = 0; row < height; row++) { int translucency = ( translucencies[row] << 24) | 0xFFFFFF; for (int column = 0; column < width; column++) { int index = row*width + column; int color = data[ index ]; if (color == this.clearColor) { data[ index ] = 0x00000000; // fully transparent } else { data[ index ] = color & translucency; } } } if ( (orientation & Graphics.RIGHT) == Graphics.RIGHT ) { x -= width; } else if ( (orientation & Graphics.HCENTER) == Graphics.HCENTER ) { x -= width/2; } g.drawRGB( data, 0, width, x, y + fontHeight + this.padding, width, height, true ); this.rgbData = data; this.lastText = text; this.bufferImage = null; this.bufferGraphics = null; } /* (non-Javadoc) * @see de.enough.polish.ui.TextEffect#setStyle(de.enough.polish.ui.Style) */ public void setStyle(Style style) { super.setStyle(style); this.shadowColor = style.getFontColor(); //#if polish.css.text-mirror-color Color shadowColorObj = style.getColorProperty( "text-mirror-color" ); if (shadowColorObj != null) { this.shadowColor = shadowColorObj.getColor(); } //#endif //#if polish.css.text-mirror-padding Integer paddingInt = style.getIntProperty( "text-mirror-padding" ); if (paddingInt != null) { this.padding = paddingInt.intValue(); } //#endif Font font = style.font; if (font == null) { font = Font.getDefaultFont(); } this.steps = font.getHeight(); //#if polish.css.text-mirror-steps Integer stepsInt = style.getIntProperty( "text-mirror-steps" ); if (stepsInt != null) { this.steps = stepsInt.intValue(); } //#endif int startTranslucencyPercent = 90; //#if polish.css.text-mirror-start-translucency Integer startTranslucencyInt = style.getIntProperty("text-mirror-start-translucency"); if (startTranslucencyInt != null ) { startTranslucencyPercent = startTranslucencyInt.intValue(); } //#endif this.startTranslucency = (startTranslucencyPercent * 255) / 100; int endTranslucencyPercent = 0; //#if polish.css.text-mirror-end-translucency Integer endTranslucencyInt = style.getIntProperty("text-mirror-end-translucency"); if (endTranslucencyInt != null ) { endTranslucencyPercent = endTranslucencyInt.intValue(); } //#endif this.endTranslucency = (endTranslucencyPercent * 255) / 100; } /* (non-Javadoc) * @see de.enough.polish.ui.TextEffect#releaseResources() */ public void releaseResources() { super.releaseResources(); this.lastText = null; this.rgbData = null; this.bufferGraphics = null; this.bufferImage = null; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -