diff options
Diffstat (limited to 'awt/com/android/internal/awt/AndroidGraphics2D.java')
-rw-r--r-- | awt/com/android/internal/awt/AndroidGraphics2D.java | 1354 |
1 files changed, 0 insertions, 1354 deletions
diff --git a/awt/com/android/internal/awt/AndroidGraphics2D.java b/awt/com/android/internal/awt/AndroidGraphics2D.java deleted file mode 100644 index 9a8ae02..0000000 --- a/awt/com/android/internal/awt/AndroidGraphics2D.java +++ /dev/null @@ -1,1354 +0,0 @@ -/* - * Copyright 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 com.android.internal.awt; - -import com.android.internal.awt.AndroidGraphicsConfiguration; -import com.android.internal.graphics.NativeUtils; - -import java.awt.AlphaComposite; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GraphicsConfiguration; -import java.awt.Image; -import java.awt.Polygon; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.Stroke; -import java.awt.font.FontRenderContext; -import java.awt.font.GlyphVector; -import java.awt.geom.AffineTransform; -import java.awt.geom.Area; -import java.awt.geom.GeneralPath; -import java.awt.geom.NoninvertibleTransformException; -import java.awt.geom.PathIterator; -import java.awt.image.AffineTransformOp; -import java.awt.image.BufferedImage; -import java.awt.image.BufferedImageOp; -import java.awt.image.DataBuffer; -import java.awt.image.DirectColorModel; -import java.awt.image.ImageObserver; -import java.awt.image.Raster; -import java.awt.image.RenderedImage; -import java.awt.image.SinglePixelPackedSampleModel; -import java.awt.image.WritableRaster; -import java.awt.image.renderable.RenderableImage; -import java.text.AttributedCharacterIterator; -import java.util.Map; - -import org.apache.harmony.awt.gl.ImageSurface; -import org.apache.harmony.awt.gl.MultiRectArea; -import org.apache.harmony.awt.gl.Surface; -import org.apache.harmony.awt.gl.font.AndroidGlyphVector; -import org.apache.harmony.awt.gl.font.FontMetricsImpl; -import org.apache.harmony.awt.gl.image.OffscreenImage; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.Path; - -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Region; -import android.graphics.Typeface; -import android.graphics.PixelXorXfermode; -import android.view.Display; -import android.view.WindowManager; -import android.content.Context; - -public class AndroidGraphics2D extends Graphics2D { - - private int displayWidth, displayHeight; - - protected Surface dstSurf = null; - protected MultiRectArea clip = null; - - protected Composite composite = AlphaComposite.SrcOver; - protected AffineTransform transform = new AffineTransform(); - - private static AndroidGraphics2D mAg; - private static Canvas mC; - - // Android Paint - public static Paint mP; - - private static java.awt.Font mFnt; - - // Cached Matrix - public static Matrix mM; - private static FontMetrics mFm; - private static RenderingHints mRh; - private static Color mBc; - - private Area mCurrClip; - - public final static double RAD_360 = Math.PI / 180 * 360; - - // Image drawing - private AndroidJavaBlitter blitter; - private DirectColorModel cm; - private SinglePixelPackedSampleModel sm; - private WritableRaster wr; - - - public static AndroidGraphics2D getInstance() { - if (mAg == null) { - throw new RuntimeException("AndroidGraphics2D not instantiated!"); - } - return mAg; - } - - public static AndroidGraphics2D getInstance(Context ctx, Canvas c, Paint p) { - if (c == null || ctx == null) { - throw new RuntimeException( - "Illegal argument, Canvas cannot be null!"); - } - mAg = new AndroidGraphics2D(ctx, c, p); - return mAg; - } - - private AndroidGraphics2D(Context ctx, Canvas c, Paint p) { - super(); - mC = c; - mP = p; - mM = new Matrix(); - mM.reset(); - mM = mC.getMatrix(); - Rect r = mC.getClipBounds(); - int cl[] = {-1, r.top, r.left, -2, r.top, r.right, -2, r.bottom, r.right, -2, r.bottom, r.left}; - mCurrClip = new Area(createShape(cl)); - if(ctx != null) { - WindowManager wm = (WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE); - Display d = wm.getDefaultDisplay(); - displayWidth = d.getWidth(); - displayHeight = d.getHeight(); - } - blitter = new AndroidJavaBlitter(c); - cm = new DirectColorModel(32, 0xff0000, 0xff00, 0xff, 0xff000000); - sm = new SinglePixelPackedSampleModel( - DataBuffer.TYPE_INT, displayWidth, displayHeight, cm.getMasks()); - wr = Raster.createWritableRaster(sm, null); - dstSurf = new ImageSurface(cm, wr); - } - - @Override - public void addRenderingHints(Map<?, ?> hints) { - if (mRh == null) { - mRh = (RenderingHints) hints; - } - mRh.add((RenderingHints) hints); - } - - public float[] getMatrix() { - float[] f = new float[9]; - mC.getMatrix().getValues(f); - return f; - } - - /** - * - * @return a Matrix in Android format - */ - public float[] getInverseMatrix() { - AffineTransform af = new AffineTransform(createAWTMatrix(getMatrix())); - try { - af = af.createInverse(); - } catch (NoninvertibleTransformException e) { - } - return createMatrix(af); - } - - private Path getPath(Shape s) { - Path path = new Path(); - PathIterator pi = s.getPathIterator(null); - while (pi.isDone() == false) { - getCurrentSegment(pi, path); - pi.next(); - } - return path; - } - - private void getCurrentSegment(PathIterator pi, Path path) { - float[] coordinates = new float[6]; - int type = pi.currentSegment(coordinates); - switch (type) { - case PathIterator.SEG_MOVETO: - path.moveTo(coordinates[0], coordinates[1]); - break; - case PathIterator.SEG_LINETO: - path.lineTo(coordinates[0], coordinates[1]); - break; - case PathIterator.SEG_QUADTO: - path.quadTo(coordinates[0], coordinates[1], coordinates[2], - coordinates[3]); - break; - case PathIterator.SEG_CUBICTO: - path.cubicTo(coordinates[0], coordinates[1], coordinates[2], - coordinates[3], coordinates[4], coordinates[5]); - break; - case PathIterator.SEG_CLOSE: - path.close(); - break; - default: - break; - } - } - - private Shape createShape(int[] arr) { - Shape s = new GeneralPath(); - for(int i = 0; i < arr.length; i++) { - int type = arr[i]; - switch (type) { - case -1: - //MOVETO - ((GeneralPath)s).moveTo(arr[++i], arr[++i]); - break; - case -2: - //LINETO - ((GeneralPath)s).lineTo(arr[++i], arr[++i]); - break; - case -3: - //QUADTO - ((GeneralPath)s).quadTo(arr[++i], arr[++i], arr[++i], - arr[++i]); - break; - case -4: - //CUBICTO - ((GeneralPath)s).curveTo(arr[++i], arr[++i], arr[++i], - arr[++i], arr[++i], arr[++i]); - break; - case -5: - //CLOSE - return s; - default: - break; - } - } - return s; - } - /* - public int[] getPixels() { - return mC.getPixels(); - }*/ - - public static float getRadian(float degree) { - return (float) ((Math.PI / 180) * degree); - } - - private Shape getShape() { - return null; - } - - public static float getDegree(float radian) { - return (float) ((180 / Math.PI) * radian); - } - - /* - * Degree in radian - */ - public static float getEllipsisX(float degree, float princAxis) { - return (float) Math.cos(degree) * princAxis; - } - - public static float getEllipsisY(float degree, float conAxis) { - return (float) Math.sin(degree) * conAxis; - } - - @Override - public void clip(Shape s) { - mC.clipPath(getPath(s)); - } - - public void setCanvas(Canvas c) { - mC = c; - } - - @Override - public void draw(Shape s) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - mP.setStyle(Paint.Style.STROKE); - mC.drawPath(getPath(s), mP); - mP.setStyle(tmp); - } -/* - private ArrayList getSegments(Shape s) { - ArrayList arr = new ArrayList(); - PathIterator pi = s.getPathIterator(null); - while (pi.isDone() == false) { - getCurrentSegment(pi, arr); - pi.next(); - } - return arr; - } - - private void getCurrentSegment(PathIterator pi, ArrayList arr) { - float[] coordinates = new float[6]; - int type = pi.currentSegment(coordinates); - switch (type) { - case PathIterator.SEG_MOVETO: - arr.add(new Integer(-1)); - break; - case PathIterator.SEG_LINETO: - arr.add(new Integer(-2)); - break; - case PathIterator.SEG_QUADTO: - arr.add(new Integer(-3)); - break; - case PathIterator.SEG_CUBICTO: - arr.add(new Integer(-4)); - break; - case PathIterator.SEG_CLOSE: - arr.add(new Integer(-5)); - break; - default: - break; - } - } -*/ - /* - * Convenience method, not standard AWT - */ - public void draw(Path s) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - mP.setStyle(Paint.Style.STROKE); - s.transform(mM); - mC.drawPath(s, mP); - mP.setStyle(tmp); - } - - @Override - public void drawGlyphVector(GlyphVector g, float x, float y) { - // TODO draw at x, y - // draw(g.getOutline()); - /* - Matrix matrix = new Matrix(); - matrix.setTranslate(x, y); - Path pth = getPath(g.getOutline()); - pth.transform(matrix); - draw(pth); - */ - Path path = new Path(); - char[] c = ((AndroidGlyphVector)g).getGlyphs(); - mP.getTextPath(c, 0, c.length, x, y, path); - mC.drawPath(path, mP); - } - - @Override - public void drawRenderableImage(RenderableImage img, AffineTransform xform) { - throw new RuntimeException("Not implemented!"); - } - - @Override - public void drawRenderedImage(RenderedImage img, AffineTransform xform) { - throw new RuntimeException("Not implemented!"); - } - - @Override - public void drawString(AttributedCharacterIterator iterator, float x, - float y) { - throw new RuntimeException("AttributedCharacterIterator not supported!"); - - } - - @Override - public void drawString(AttributedCharacterIterator iterator, int x, int y) { - throw new RuntimeException("AttributedCharacterIterator not supported!"); - - } - - @Override - public void drawString(String s, float x, float y) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - - mP.setStyle(Paint.Style.FILL); - Path pth = new Path(); - mP.getTextPath(s, 0, s.length(), x, y, pth); - mC.drawPath(pth, mP); - mP.setStyle(tmp); - } - - @Override - public void drawString(String str, int x, int y) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - mP.setStrokeWidth(0); - - mC.drawText(str.toCharArray(), 0, str.toCharArray().length, x, y, - mP); - mP.setStyle(tmp); - } - - @Override - public void fill(Shape s) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - mP.setStyle(Paint.Style.FILL); - mC.drawPath(getPath(s), mP); - mP.setStyle(tmp); - } - - @Override - public Color getBackground() { - return mBc; - } - - @Override - public Composite getComposite() { - throw new RuntimeException("Composite not implemented!"); - } - - @Override - public GraphicsConfiguration getDeviceConfiguration() { - return new AndroidGraphicsConfiguration(); - } - - @Override - public FontRenderContext getFontRenderContext() { - return new FontRenderContext(getTransform(), mP.isAntiAlias(), true); - } - - @Override - public java.awt.Paint getPaint() { - throw new RuntimeException("AWT Paint not implemented in Android!"); - } - - public static Canvas getAndroidCanvas() { - return mC; - } - - public static Paint getAndroidPaint() { - return mP; - } - - @Override - public RenderingHints getRenderingHints() { - return mRh; - } - - @Override - public Stroke getStroke() { - if (mP != null) { - return new BasicStroke(mP.getStrokeWidth(), mP.getStrokeCap() - .ordinal(), mP.getStrokeJoin().ordinal()); - } - return null; - } - - @Override - public AffineTransform getTransform() { - return new AffineTransform(createAWTMatrix(getMatrix())); - } - - @Override - public boolean hit(Rectangle rect, Shape s, boolean onStroke) { - // ???AWT TODO check if on stroke - return s.intersects(rect.getX(), rect.getY(), rect.getWidth(), rect - .getHeight()); - } - - @Override - public void rotate(double theta) { - mM.preRotate((float) AndroidGraphics2D - .getDegree((float) (RAD_360 - theta))); - mC.concat(mM); - } - - @Override - public void rotate(double theta, double x, double y) { - mM.preRotate((float) AndroidGraphics2D.getDegree((float) theta), - (float) x, (float) y); - mC.concat(mM); - } - - @Override - public void scale(double sx, double sy) { - mM.setScale((float) sx, (float) sy); - mC.concat(mM); - } - - @Override - public void setBackground(Color color) { - mBc = color; - mC.clipRect(new Rect(0, 0, mC.getWidth(), mC.getHeight())); - // TODO don't limit to current clip - mC.drawARGB(color.getAlpha(), color.getRed(), color.getGreen(), color - .getBlue()); - } - - @Override - public void setComposite(Composite comp) { - throw new RuntimeException("Composite not implemented!"); - } - - public void setSpaint(Paint paint) { - mP = paint; - } - - @Override - public void setPaint(java.awt.Paint paint) { - setColor((Color)paint); - } - - @Override - public Object getRenderingHint(RenderingHints.Key key) { - if (mRh == null) { - return null; - } - return mRh.get(key); - } - - @Override - public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue) { - if (mRh == null) { - mRh = new RenderingHints(hintKey, hintValue); - } else { - mRh.put(hintKey, hintValue); - } - applyHints(); - } - - @Override - public void setRenderingHints(Map<?, ?> hints) { - mRh = (RenderingHints) hints; - applyHints(); - } - - private void applyHints() { - Object o; - - // TODO do something like this: - /* - * Set s = mRh.keySet(); Iterator it = s.iterator(); while(it.hasNext()) { - * o = it.next(); } - */ - - // ///////////////////////////////////////////////////////////////////// - // not supported in skia - /* - * o = mRh.get(RenderingHints.KEY_ALPHA_INTERPOLATION); if - * (o.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) { } else - * if (o.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) { } - * else if (o.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) { } - * - * o = mRh.get(RenderingHints.KEY_COLOR_RENDERING); if - * (o.equals(RenderingHints.VALUE_COLOR_RENDER_DEFAULT)) { } else if - * (o.equals(RenderingHints.VALUE_COLOR_RENDER_QUALITY)) { } else if - * (o.equals(RenderingHints.VALUE_COLOR_RENDER_SPEED)) { } - * - * o = mRh.get(RenderingHints.KEY_DITHERING); if - * (o.equals(RenderingHints.VALUE_DITHER_DEFAULT)) { } else if - * (o.equals(RenderingHints.VALUE_DITHER_DISABLE)) { } else if - * (o.equals(RenderingHints.VALUE_DITHER_ENABLE)) { } - * - * o = mRh.get(RenderingHints.KEY_FRACTIONALMETRICS); if - * (o.equals(RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT)) { } else - * if (o.equals(RenderingHints.VALUE_FRACTIONALMETRICS_OFF)) { } else if - * (o.equals(RenderingHints.VALUE_FRACTIONALMETRICS_ON)) { } - * - * o = mRh.get(RenderingHints.KEY_INTERPOLATION); if - * (o.equals(RenderingHints.VALUE_INTERPOLATION_BICUBIC)) { } else if - * (o.equals(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) { } else if - * (o .equals(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) { } - * - * o = mRh.get(RenderingHints.KEY_RENDERING); if - * (o.equals(RenderingHints.VALUE_RENDER_DEFAULT)) { } else if - * (o.equals(RenderingHints.VALUE_RENDER_QUALITY)) { } else if - * (o.equals(RenderingHints.VALUE_RENDER_SPEED)) { } - * - * o = mRh.get(RenderingHints.KEY_STROKE_CONTROL); if - * (o.equals(RenderingHints.VALUE_STROKE_DEFAULT)) { } else if - * (o.equals(RenderingHints.VALUE_STROKE_NORMALIZE)) { } else if - * (o.equals(RenderingHints.VALUE_STROKE_PURE)) { } - */ - - o = mRh.get(RenderingHints.KEY_ANTIALIASING); - if (o != null) { - if (o.equals(RenderingHints.VALUE_ANTIALIAS_DEFAULT)) { - mP.setAntiAlias(false); - } else if (o.equals(RenderingHints.VALUE_ANTIALIAS_OFF)) { - mP.setAntiAlias(false); - } else if (o.equals(RenderingHints.VALUE_ANTIALIAS_ON)) { - mP.setAntiAlias(true); - } - } - - o = mRh.get(RenderingHints.KEY_TEXT_ANTIALIASING); - if (o != null) { - if (o.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT)) { - mP.setAntiAlias(false); - } else if (o.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)) { - mP.setAntiAlias(false); - } else if (o.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_ON)) { - mP.setAntiAlias(true); - } - } - } - - @Override - public void setStroke(Stroke s) { - if (mP == null) { - mP = new Paint(); - } - BasicStroke bs = (BasicStroke) s; - mP.setStyle(Paint.Style.STROKE); - mP.setStrokeWidth(bs.getLineWidth()); - - int cap = bs.getEndCap(); - if (cap == 0) { - mP.setStrokeCap(Paint.Cap.BUTT); - } else if (cap == 1) { - mP.setStrokeCap(Paint.Cap.ROUND); - } else if (cap == 2) { - mP.setStrokeCap(Paint.Cap.SQUARE); - } - - int join = bs.getLineJoin(); - if (join == 0) { - mP.setStrokeJoin(Paint.Join.MITER); - } else if (join == 1) { - mP.setStrokeJoin(Paint.Join.ROUND); - } else if (join == 2) { - mP.setStrokeJoin(Paint.Join.BEVEL); - } - } - - public static float[] createMatrix(AffineTransform Tx) { - double[] at = new double[9]; - Tx.getMatrix(at); - float[] f = new float[at.length]; - f[0] = (float) at[0]; - f[1] = (float) at[2]; - f[2] = (float) at[4]; - f[3] = (float) at[1]; - f[4] = (float) at[3]; - f[5] = (float) at[5]; - f[6] = 0; - f[7] = 0; - f[8] = 1; - return f; - } - - private float[] createAWTMatrix(float[] matrix) { - float[] at = new float[9]; - at[0] = matrix[0]; - at[1] = matrix[3]; - at[2] = matrix[1]; - at[3] = matrix[4]; - at[4] = matrix[2]; - at[5] = matrix[5]; - at[6] = 0; - at[7] = 0; - at[8] = 1; - return at; - } - - public static Matrix createMatrixObj(AffineTransform Tx) { - Matrix m = new Matrix(); - m.reset(); - m.setValues(createMatrix(Tx)); - return m; - } - - @Override - public void setTransform(AffineTransform Tx) { - mM.reset(); - /* - * if(Tx.isIdentity()) { mM = new Matrix(); } - */ - mM.setValues(createMatrix(Tx)); - Matrix m = new Matrix(); - m.setValues(getInverseMatrix()); - mC.concat(m); - mC.concat(mM); - } - - @Override - public void shear(double shx, double shy) { - mM.setSkew((float) shx, (float) shy); - mC.concat(mM); - } - - @Override - public void transform(AffineTransform Tx) { - Matrix m = new Matrix(); - m.setValues(createMatrix(Tx)); - mC.concat(m); - } - - @Override - public void translate(double tx, double ty) { - mM.setTranslate((float) tx, (float) ty); - mC.concat(mM); - } - - @Override - public void translate(int x, int y) { - mM.setTranslate((float) x, (float) y); - mC.concat(mM); - } - - @Override - public void clearRect(int x, int y, int width, int height) { - mC.clipRect(x, y, x + width, y + height); - if (mBc != null) { - mC.drawARGB(mBc.getAlpha(), mBc.getBlue(), mBc.getGreen(), mBc - .getRed()); - } else { - mC.drawARGB(0xff, 0xff, 0xff, 0xff); - } - } - - @Override - public void clipRect(int x, int y, int width, int height) { - int cl[] = {-1, x, y, -2, x, y + width, -2, x + height, y + width, -2, x + height, y}; - Shape shp = createShape(cl); - mCurrClip.intersect(new Area(shp)); - mC.clipRect(new Rect(x, y, x + width, y + height), Region.Op.INTERSECT); - } - - @Override - public void copyArea(int sx, int sy, int width, int height, int dx, int dy) { - copyArea(mC, sx, sy, width + dx, height + dy, dx, dy); - } - - @Override - public Graphics create() { - return this; - } - - @Override - public void dispose() { - mC = null; - mP = null; - } - - @Override - public void drawArc(int x, int y, int width, int height, int sa, int ea) { - if (mP == null) { - mP = new Paint(); - } - mP.setStrokeWidth(0); - mC.drawArc(new RectF(x, y, x + width, y + height), 360 - (ea + sa), - ea, true, mP); - } - - - // ???AWT: only used for debuging, delete in final version - public void drawBitmap(Bitmap bm, float x, float y, Paint p) { - mC.drawBitmap(bm, x, y, null); - } - - @Override - public boolean drawImage(Image image, int x, int y, Color bgcolor, - ImageObserver imageObserver) { - - if(image == null) { - return true; - } - - boolean done = false; - boolean somebits = false; - Surface srcSurf = null; - if(image instanceof OffscreenImage){ - OffscreenImage oi = (OffscreenImage) image; - if((oi.getState() & ImageObserver.ERROR) != 0) { - return false; - } - done = oi.prepareImage(imageObserver); - somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0; - srcSurf = oi.getImageSurface(); - }else{ - done = true; - srcSurf = Surface.getImageSurface(image); - } - - if(done || somebits) { - int w = srcSurf.getWidth(); - int h = srcSurf.getHeight(); - - blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h, (AffineTransform) transform.clone(), - composite, bgcolor, clip); - } - return done; - } - - @Override - public boolean drawImage(Image image, int x, int y, ImageObserver imageObserver) { - return drawImage(image, x, y, null, imageObserver); - } - - @Override - public boolean drawImage(Image image, int x, int y, int width, int height, - Color bgcolor, ImageObserver imageObserver) { - - if(image == null) { - return true; - } - if(width == 0 || height == 0) { - return true; - } - - boolean done = false; - boolean somebits = false; - Surface srcSurf = null; - - if(image instanceof OffscreenImage){ - OffscreenImage oi = (OffscreenImage) image; - if((oi.getState() & ImageObserver.ERROR) != 0) { - return false; - } - done = oi.prepareImage(imageObserver); - somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0; - srcSurf = oi.getImageSurface(); - }else{ - done = true; - srcSurf = Surface.getImageSurface(image); - } - - if(done || somebits) { - int w = srcSurf.getWidth(); - int h = srcSurf.getHeight(); - if(w == width && h == height){ - blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h, - (AffineTransform) transform.clone(), - composite, bgcolor, clip); - }else{ - AffineTransform xform = new AffineTransform(); - xform.setToScale((float)width / w, (float)height / h); - blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h, - (AffineTransform) transform.clone(), - xform, composite, bgcolor, clip); - } - } - return done; - } - - @Override - public boolean drawImage(Image image, int x, int y, int width, int height, - ImageObserver imageObserver) { - return drawImage(image, x, y, width, height, null, imageObserver); - } - - @Override - public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, - int sx1, int sy1, int sx2, int sy2, Color bgcolor, - ImageObserver imageObserver) { - - if(image == null) { - return true; - } - if(dx1 == dx2 || dy1 == dy2 || sx1 == sx2 || sy1 == sy2) { - return true; - } - - boolean done = false; - boolean somebits = false; - Surface srcSurf = null; - if(image instanceof OffscreenImage){ - OffscreenImage oi = (OffscreenImage) image; - if((oi.getState() & ImageObserver.ERROR) != 0) { - return false; - } - done = oi.prepareImage(imageObserver); - somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0; - srcSurf = oi.getImageSurface(); - }else{ - done = true; - srcSurf = Surface.getImageSurface(image); - } - - if(done || somebits) { - - int dstX = dx1; - int dstY = dy1; - int srcX = sx1; - int srcY = sy1; - - int dstW = dx2 - dx1; - int dstH = dy2 - dy1; - int srcW = sx2 - sx1; - int srcH = sy2 - sy1; - - if(srcW == dstW && srcH == dstH){ - blitter.blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, srcW, srcH, - (AffineTransform) transform.clone(), - composite, bgcolor, clip); - }else{ - AffineTransform xform = new AffineTransform(); - xform.setToScale((float)dstW / srcW, (float)dstH / srcH); - blitter.blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, srcW, srcH, - (AffineTransform) transform.clone(), - xform, composite, bgcolor, clip); - } - } - return done; - } - - @Override - public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, - int sx1, int sy1, int sx2, int sy2, ImageObserver imageObserver) { - - return drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null, - imageObserver); - } - - @Override - public void drawImage(BufferedImage bufImage, BufferedImageOp op, - int x, int y) { - - if(bufImage == null) { - return; - } - - if(op == null) { - drawImage(bufImage, x, y, null); - } else if(op instanceof AffineTransformOp){ - AffineTransformOp atop = (AffineTransformOp) op; - AffineTransform xform = atop.getTransform(); - Surface srcSurf = Surface.getImageSurface(bufImage); - int w = srcSurf.getWidth(); - int h = srcSurf.getHeight(); - blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h, - (AffineTransform) transform.clone(), xform, - composite, null, clip); - } else { - bufImage = op.filter(bufImage, null); - Surface srcSurf = Surface.getImageSurface(bufImage); - int w = srcSurf.getWidth(); - int h = srcSurf.getHeight(); - blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h, - (AffineTransform) transform.clone(), - composite, null, clip); - } - } - - @Override - public boolean drawImage(Image image, AffineTransform trans, - ImageObserver imageObserver) { - - if(image == null) { - return true; - } - if(trans == null || trans.isIdentity()) { - return drawImage(image, 0, 0, imageObserver); - } - - boolean done = false; - boolean somebits = false; - Surface srcSurf = null; - if(image instanceof OffscreenImage){ - OffscreenImage oi = (OffscreenImage) image; - if((oi.getState() & ImageObserver.ERROR) != 0) { - return false; - } - done = oi.prepareImage(imageObserver); - somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0; - srcSurf = oi.getImageSurface(); - }else{ - done = true; - srcSurf = Surface.getImageSurface(image); - } - - if(done || somebits) { - int w = srcSurf.getWidth(); - int h = srcSurf.getHeight(); - AffineTransform xform = (AffineTransform) transform.clone(); - xform.concatenate(trans); - blitter.blit(0, 0, srcSurf, 0, 0, dstSurf, w, h, xform, composite, - null, clip); - } - return done; - } - - @Override - public void drawLine(int x1, int y1, int x2, int y2) { - if (mP == null) { - mP = new Paint(); - } - mC.drawLine(x1, y1, x2, y2, mP); - } - - @Override - public void drawOval(int x, int y, int width, int height) { - if (mP == null) { - mP = new Paint(); - } - mP.setStyle(Paint.Style.STROKE); - mC.drawOval(new RectF(x, y, x + width, y + height), mP); - } - - @Override - public void drawPolygon(int[] xpoints, int[] ypoints, int npoints) { - if (mP == null) { - mP = new Paint(); - } - mC.drawLine(xpoints[npoints - 1], ypoints[npoints - 1], xpoints[0], - ypoints[0], mP); - for (int i = 0; i < npoints - 1; i++) { - mC.drawLine(xpoints[i], ypoints[i], xpoints[i + 1], - ypoints[i + 1], mP); - } - } - - @Override - public void drawPolyline(int[] xpoints, int[] ypoints, int npoints) { - for (int i = 0; i < npoints - 1; i++) { - drawLine(xpoints[i], ypoints[i], xpoints[i + 1], ypoints[i + 1]); - } - - } - - @Override - public void drawRoundRect(int x, int y, int width, int height, - int arcWidth, int arcHeight) { - if (mP == null) { - mP = new Paint(); - } - mC.drawRoundRect(new RectF(x, y, width, height), arcWidth, - arcHeight, mP); - } - - @Override - public void fillArc(int x, int y, int width, int height, int sa, int ea) { - if (mP == null) { - mP = new Paint(); - } - - Paint.Style tmp = mP.getStyle(); - mP.setStyle(Paint.Style.FILL_AND_STROKE); - mC.drawArc(new RectF(x, y, x + width, y + height), 360 - (sa + ea), - ea, true, mP); - - mP.setStyle(tmp); - } - - @Override - public void fillOval(int x, int y, int width, int height) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - mP.setStyle(Paint.Style.FILL); - mC.drawOval(new RectF(x, y, x + width, y + height), mP); - mP.setStyle(tmp); - } - - @Override - public void fillPolygon(int[] xpoints, int[] ypoints, int npoints) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - mC.save(Canvas.CLIP_SAVE_FLAG); - - mP.setStyle(Paint.Style.FILL); - - GeneralPath filledPolygon = new GeneralPath( - GeneralPath.WIND_EVEN_ODD, npoints); - filledPolygon.moveTo(xpoints[0], ypoints[0]); - for (int index = 1; index < xpoints.length; index++) { - filledPolygon.lineTo(xpoints[index], ypoints[index]); - } - filledPolygon.closePath(); - Path path = getPath(filledPolygon); - mC.clipPath(path); - mC.drawPath(path, mP); - - mP.setStyle(tmp); - mC.restore(); - } - - @Override - public void fillRect(int x, int y, int width, int height) { - if (mP == null) { - mP = new Paint(); - } - Paint.Style tmp = mP.getStyle(); - mP.setStyle(Paint.Style.FILL); - mC.drawRect(new Rect(x, y, x + width, y + height), mP); - mP.setStyle(tmp); - } - - @Override - public void drawRect(int x, int y, int width, int height) { - int[] xpoints = { x, x, x + width, x + width }; - int[] ypoints = { y, y + height, y + height, y }; - drawPolygon(xpoints, ypoints, 4); - } - - @Override - public void fillRoundRect(int x, int y, int width, int height, - int arcWidth, int arcHeight) { - if (mP == null) { - mP = new Paint(); - } - mP.setStyle(Paint.Style.FILL); - mC.drawRoundRect(new RectF(x, y, x + width, y + height), arcWidth, - arcHeight, mP); - } - - @Override - public Shape getClip() { - return mCurrClip; - } - - @Override - public Rectangle getClipBounds() { - Rect r = mC.getClipBounds(); - return new Rectangle(r.left, r.top, r.width(), r.height()); - } - - @Override - public Color getColor() { - if (mP != null) { - return new Color(mP.getColor()); - } - return null; - } - - @Override - public Font getFont() { - return mFnt; - } - - @Override - public FontMetrics getFontMetrics(Font font) { - mFm = new FontMetricsImpl(font); - return mFm; - } - - @Override - public void setClip(int x, int y, int width, int height) { - int cl[] = {-1, x, y, -2, x, y + width, -2, x + height, y + width, -2, x + height, y}; - mCurrClip = new Area(createShape(cl)); - mC.clipRect(x, y, x + width, y + height, Region.Op.REPLACE); - - } - - @Override - public void setClip(Shape clip) { - mCurrClip = new Area(clip); - mC.clipPath(getPath(clip), Region.Op.REPLACE); - } - - @Override - public void setColor(Color c) { - if (mP == null) { - mP = new Paint(); - } - mP.setColor(c.getRGB()); - } - - /** - * Font mapping: - * - * Family: - * - * Android AWT - * ------------------------------------- - * serif Serif / TimesRoman - * sans-serif SansSerif / Helvetica - * monospace Monospaced / Courier - * - * Style: - * - * Android AWT - * ------------------------------------- - * normal Plain - * bold bold - * italic italic - * - */ - @Override - public void setFont(Font font) { - if (font == null) { - return; - } - if (mP == null) { - mP = new Paint(); - } - - mFnt = font; - Typeface tf = null; - int sty = font.getStyle(); - String nam = font.getName(); - String aF = ""; - if (nam != null) { - if (nam.equalsIgnoreCase("Serif") - || nam.equalsIgnoreCase("TimesRoman")) { - aF = "serif"; - } else if (nam.equalsIgnoreCase("SansSerif") - || nam.equalsIgnoreCase("Helvetica")) { - aF = "sans-serif"; - } else if (nam.equalsIgnoreCase("Monospaced") - || nam.equalsIgnoreCase("Courier")) { - aF = "monospace"; - } - } - - switch (sty) { - case Font.PLAIN: - tf = Typeface.create(aF, Typeface.NORMAL); - break; - case Font.BOLD: - tf = Typeface.create(aF, Typeface.BOLD); - break; - case Font.ITALIC: - tf = Typeface.create(aF, Typeface.ITALIC); - break; - case Font.BOLD | Font.ITALIC: - tf = Typeface.create(aF, Typeface.BOLD_ITALIC); - break; - default: - tf = Typeface.DEFAULT; - } - - mP.setTextSize(font.getSize()); - mP.setTypeface(tf); - } - - @Override - public void drawBytes(byte[] data, int offset, int length, int x, int y) { - drawString(new String(data, offset, length), x, y); - } - - @Override - public void drawPolygon(Polygon p) { - drawPolygon(p.xpoints, p.ypoints, p.npoints); - } - - @Override - public void fillPolygon(Polygon p) { - fillPolygon(p.xpoints, p.ypoints, p.npoints); - } - - @Override - public Rectangle getClipBounds(Rectangle r) { - Shape clip = getClip(); - if (clip != null) { - Rectangle b = clip.getBounds(); - r.x = b.x; - r.y = b.y; - r.width = b.width; - r.height = b.height; - } - return r; - } - - @Override - public boolean hitClip(int x, int y, int width, int height) { - return getClipBounds().intersects(new Rectangle(x, y, width, height)); - } - - @Override - public void drawChars(char[] data, int offset, int length, int x, int y) { - mC.drawText(data, offset, length, x, y, mP); - } - - @Override - public void setPaintMode() { - if (mP == null) { - mP = new Paint(); - } - mP.setXfermode(null); - } - - @Override - public void setXORMode(Color color) { - if (mP == null) { - mP = new Paint(); - } - mP.setXfermode(new PixelXorXfermode(color.getRGB())); - } - - @Override - public void fill3DRect(int x, int y, int width, int height, boolean raised) { - Color color = getColor(); - Color colorUp, colorDown; - if (raised) { - colorUp = color.brighter(); - colorDown = color.darker(); - setColor(color); - } else { - colorUp = color.darker(); - colorDown = color.brighter(); - setColor(colorUp); - } - - width--; - height--; - fillRect(x+1, y+1, width-1, height-1); - - setColor(colorUp); - fillRect(x, y, width, 1); - fillRect(x, y+1, 1, height); - - setColor(colorDown); - fillRect(x+width, y, 1, height); - fillRect(x+1, y+height, width, 1); - } - - @Override - public void draw3DRect(int x, int y, int width, int height, boolean raised) { - Color color = getColor(); - Color colorUp, colorDown; - if (raised) { - colorUp = color.brighter(); - colorDown = color.darker(); - } else { - colorUp = color.darker(); - colorDown = color.brighter(); - } - - setColor(colorUp); - fillRect(x, y, width, 1); - fillRect(x, y+1, 1, height); - - setColor(colorDown); - fillRect(x+width, y, 1, height); - fillRect(x+1, y+height, width, 1); - } - - public void copyArea(Canvas canvas, int sx, int sy, int width, int height, int dx, int dy) { - sx += getTransform().getTranslateX(); - sy += getTransform().getTranslateY(); - - NativeUtils.nativeScrollRect(canvas, - new Rect(sx, sy, sx + width, sy + height), - dx, dy); - } -} |