19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2007, The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.awt;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.awt.AndroidGraphicsConfiguration;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.graphics.NativeUtils;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.AlphaComposite;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.BasicStroke;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Color;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Composite;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Font;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.FontMetrics;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Graphics;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Graphics2D;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.GraphicsConfiguration;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Image;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Polygon;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Rectangle;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.RenderingHints;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Shape;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Stroke;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.font.FontRenderContext;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.font.GlyphVector;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.AffineTransform;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.Area;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.GeneralPath;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.NoninvertibleTransformException;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.PathIterator;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.AffineTransformOp;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.BufferedImage;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.BufferedImageOp;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.DataBuffer;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.DirectColorModel;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.ImageObserver;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.Raster;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.RenderedImage;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.SinglePixelPackedSampleModel;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.WritableRaster;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.image.renderable.RenderableImage;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.AttributedCharacterIterator;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.ImageSurface;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.MultiRectArea;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.Surface;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.font.AndroidGlyphVector;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.font.FontMetricsImpl;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.image.OffscreenImage;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Paint;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Path;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.RectF;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Typeface;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelXorXfermode;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AndroidGraphics2D extends Graphics2D {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int displayWidth, displayHeight;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Surface dstSurf = null;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected MultiRectArea clip = null;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Composite composite = AlphaComposite.SrcOver;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected AffineTransform transform = new AffineTransform();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static AndroidGraphics2D mAg;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static Canvas mC;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Android Paint
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Paint mP;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static java.awt.Font mFnt;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Cached Matrix
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Matrix mM;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static FontMetrics mFm;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static RenderingHints mRh;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static Color mBc;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Area mCurrClip;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static double RAD_360 = Math.PI / 180 * 360;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Image drawing
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AndroidJavaBlitter blitter;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DirectColorModel cm;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SinglePixelPackedSampleModel sm;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WritableRaster wr;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static AndroidGraphics2D getInstance() {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAg == null) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("AndroidGraphics2D not instantiated!");
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAg;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static AndroidGraphics2D getInstance(Context ctx, Canvas c, Paint p) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == null || ctx == null) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Illegal argument, Canvas cannot be null!");
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAg = new AndroidGraphics2D(ctx, c, p);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAg;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AndroidGraphics2D(Context ctx, Canvas c, Paint p) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC = c;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP = p;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM = new Matrix();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.reset();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM = mC.getMatrix();
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect r = mC.getClipBounds();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cl[] = {-1, r.top, r.left, -2, r.top, r.right, -2, r.bottom, r.right, -2, r.bottom, r.left};
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrClip = new Area(createShape(cl));
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(ctx != null) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager wm = (WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Display d = wm.getDefaultDisplay();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            displayWidth = d.getWidth();
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            displayHeight = d.getHeight();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        blitter = new AndroidJavaBlitter(c);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cm = new DirectColorModel(32, 0xff0000, 0xff00, 0xff, 0xff000000);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sm = new SinglePixelPackedSampleModel(
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DataBuffer.TYPE_INT, displayWidth, displayHeight, cm.getMasks());
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wr = Raster.createWritableRaster(sm, null);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dstSurf = new ImageSurface(cm, wr);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addRenderingHints(Map<?, ?> hints) {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRh == null) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRh = (RenderingHints) hints;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRh.add((RenderingHints) hints);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getMatrix() {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] f = new float[9];
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.getMatrix().getValues(f);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a Matrix in Android format
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getInverseMatrix() {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform af = new AffineTransform(createAWTMatrix(getMatrix()));
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            af = af.createInverse();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (NoninvertibleTransformException e) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return createMatrix(af);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Path getPath(Shape s) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Path path = new Path();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PathIterator pi = s.getPathIterator(null);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (pi.isDone() == false) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getCurrentSegment(pi, path);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.next();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return path;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void getCurrentSegment(PathIterator pi, Path path) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] coordinates = new float[6];
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type = pi.currentSegment(coordinates);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (type) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_MOVETO:
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            path.moveTo(coordinates[0], coordinates[1]);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_LINETO:
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            path.lineTo(coordinates[0], coordinates[1]);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_QUADTO:
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            path.quadTo(coordinates[0], coordinates[1], coordinates[2],
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    coordinates[3]);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_CUBICTO:
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            path.cubicTo(coordinates[0], coordinates[1], coordinates[2],
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    coordinates[3], coordinates[4], coordinates[5]);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_CLOSE:
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            path.close();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Shape createShape(int[] arr) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Shape s = new GeneralPath();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0; i < arr.length; i++) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int type = arr[i];
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case -1:
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //MOVETO
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((GeneralPath)s).moveTo(arr[++i], arr[++i]);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case -2:
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //LINETO
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((GeneralPath)s).lineTo(arr[++i], arr[++i]);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case -3:
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //QUADTO
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((GeneralPath)s).quadTo(arr[++i], arr[++i], arr[++i],
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        arr[++i]);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case -4:
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //CUBICTO
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((GeneralPath)s).curveTo(arr[++i], arr[++i], arr[++i],
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        arr[++i], arr[++i], arr[++i]);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case -5:
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //CLOSE
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return s;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int[] getPixels() {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mC.getPixels();
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }*/
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static float getRadian(float degree) {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (float) ((Math.PI / 180) * degree);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Shape getShape() {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static float getDegree(float radian) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (float) ((180 / Math.PI) * radian);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Degree in radian
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static float getEllipsisX(float degree, float princAxis) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (float) Math.cos(degree) * princAxis;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static float getEllipsisY(float degree, float conAxis) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (float) Math.sin(degree) * conAxis;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clip(Shape s) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.clipPath(getPath(s));
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCanvas(Canvas c) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC = c;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Shape s) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Paint.Style tmp = mP.getStyle();
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setStyle(Paint.Style.STROKE);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.drawPath(getPath(s), mP);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setStyle(tmp);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList getSegments(Shape s) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList arr = new ArrayList();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PathIterator pi = s.getPathIterator(null);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (pi.isDone() == false) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getCurrentSegment(pi, arr);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.next();
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return arr;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void getCurrentSegment(PathIterator pi, ArrayList arr) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] coordinates = new float[6];
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type = pi.currentSegment(coordinates);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (type) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_MOVETO:
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            arr.add(new Integer(-1));
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_LINETO:
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            arr.add(new Integer(-2));
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_QUADTO:
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            arr.add(new Integer(-3));
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_CUBICTO:
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            arr.add(new Integer(-4));
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case PathIterator.SEG_CLOSE:
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            arr.add(new Integer(-5));
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method, not standard AWT
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Path s) {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Paint.Style tmp = mP.getStyle();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setStyle(Paint.Style.STROKE);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s.transform(mM);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.drawPath(s, mP);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setStyle(tmp);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawGlyphVector(GlyphVector g, float x, float y) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO draw at x, y
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // draw(g.getOutline());
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Matrix matrix = new Matrix();
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        matrix.setTranslate(x, y);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Path pth = getPath(g.getOutline());
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pth.transform(matrix);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        draw(pth);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Path path = new Path();
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char[] c = ((AndroidGlyphVector)g).getGlyphs();
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.getTextPath(c, 0, c.length, x, y, path);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.drawPath(path, mP);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not implemented!");
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not implemented!");
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawString(AttributedCharacterIterator iterator, float x,
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float y) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("AttributedCharacterIterator not supported!");
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawString(AttributedCharacterIterator iterator, int x, int y) {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("AttributedCharacterIterator not supported!");
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawString(String s, float x, float y) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Paint.Style tmp = mP.getStyle();
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.FILL);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Path pth = new Path();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.getTextPath(s, 0, s.length(), x, y, pth);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawPath(pth, mP);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(tmp);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawString(String str, int x, int y) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Paint.Style tmp = mP.getStyle();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeWidth(0);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawText(str.toCharArray(), 0, str.toCharArray().length, x, y,
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mP);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(tmp);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fill(Shape s) {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Paint.Style tmp = mP.getStyle();
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.FILL);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawPath(getPath(s), mP);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(tmp);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Color getBackground() {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBc;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Composite getComposite() {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Composite not implemented!");
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public GraphicsConfiguration getDeviceConfiguration() {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new AndroidGraphicsConfiguration();
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FontRenderContext getFontRenderContext() {
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FontRenderContext(getTransform(), mP.isAntiAlias(), true);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public java.awt.Paint getPaint() {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("AWT Paint not implemented in Android!");
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Canvas getAndroidCanvas() {
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mC;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Paint getAndroidPaint() {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mP;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public RenderingHints getRenderingHints() {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRh;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Stroke getStroke() {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP != null) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BasicStroke(mP.getStrokeWidth(), mP.getStrokeCap()
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .ordinal(), mP.getStrokeJoin().ordinal());
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform getTransform() {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new AffineTransform(createAWTMatrix(getMatrix()));
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // ???AWT TODO check if on stroke
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s.intersects(rect.getX(), rect.getY(), rect.getWidth(), rect
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getHeight());
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void rotate(double theta) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.preRotate((float) AndroidGraphics2D
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getDegree((float) (RAD_360 - theta)));
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(mM);
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void rotate(double theta, double x, double y) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.preRotate((float) AndroidGraphics2D.getDegree((float) theta),
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (float) x, (float) y);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(mM);
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scale(double sx, double sy) {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.setScale((float) sx, (float) sy);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(mM);
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBackground(Color color) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBc = color;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.clipRect(new Rect(0, 0, mC.getWidth(), mC.getHeight()));
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO don't limit to current clip
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.drawARGB(color.getAlpha(), color.getRed(), color.getGreen(), color
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getBlue());
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setComposite(Composite comp) {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Composite not implemented!");
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSpaint(Paint paint) {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP = paint;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPaint(java.awt.Paint paint) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColor((Color)paint);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getRenderingHint(RenderingHints.Key key) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRh == null) {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRh.get(key);
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRh == null) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRh = new RenderingHints(hintKey, hintValue);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRh.put(hintKey, hintValue);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applyHints();
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRenderingHints(Map<?, ?> hints) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRh = (RenderingHints) hints;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applyHints();
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void applyHints() {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object o;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO do something like this:
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Set s = mRh.keySet(); Iterator it = s.iterator(); while(it.hasNext()) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = it.next(); }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // /////////////////////////////////////////////////////////////////////
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // not supported in skia
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = mRh.get(RenderingHints.KEY_ALPHA_INTERPOLATION); if
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) { } else
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if (o.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)) { }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * else if (o.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)) { }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = mRh.get(RenderingHints.KEY_COLOR_RENDERING); if
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_COLOR_RENDER_DEFAULT)) { } else if
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_COLOR_RENDER_QUALITY)) { } else if
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_COLOR_RENDER_SPEED)) { }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = mRh.get(RenderingHints.KEY_DITHERING); if
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_DITHER_DEFAULT)) { } else if
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_DITHER_DISABLE)) { } else if
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_DITHER_ENABLE)) { }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = mRh.get(RenderingHints.KEY_FRACTIONALMETRICS); if
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT)) { } else
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if (o.equals(RenderingHints.VALUE_FRACTIONALMETRICS_OFF)) { } else if
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_FRACTIONALMETRICS_ON)) { }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = mRh.get(RenderingHints.KEY_INTERPOLATION); if
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_INTERPOLATION_BICUBIC)) { } else if
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_INTERPOLATION_BILINEAR)) { } else if
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o .equals(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)) { }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = mRh.get(RenderingHints.KEY_RENDERING); if
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_RENDER_DEFAULT)) { } else if
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_RENDER_QUALITY)) { } else if
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_RENDER_SPEED)) { }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * o = mRh.get(RenderingHints.KEY_STROKE_CONTROL); if
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_STROKE_DEFAULT)) { } else if
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_STROKE_NORMALIZE)) { } else if
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (o.equals(RenderingHints.VALUE_STROKE_PURE)) { }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        o = mRh.get(RenderingHints.KEY_ANTIALIASING);
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (o != null) {
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (o.equals(RenderingHints.VALUE_ANTIALIAS_DEFAULT)) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP.setAntiAlias(false);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (o.equals(RenderingHints.VALUE_ANTIALIAS_OFF)) {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP.setAntiAlias(false);
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (o.equals(RenderingHints.VALUE_ANTIALIAS_ON)) {
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP.setAntiAlias(true);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        o = mRh.get(RenderingHints.KEY_TEXT_ANTIALIASING);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (o != null) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (o.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT)) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP.setAntiAlias(false);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (o.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP.setAntiAlias(false);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (o.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_ON)) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP.setAntiAlias(true);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStroke(Stroke s) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BasicStroke bs = (BasicStroke) s;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setStyle(Paint.Style.STROKE);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setStrokeWidth(bs.getLineWidth());
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cap = bs.getEndCap();
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cap == 0) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeCap(Paint.Cap.BUTT);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (cap == 1) {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeCap(Paint.Cap.ROUND);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (cap == 2) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeCap(Paint.Cap.SQUARE);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int join = bs.getLineJoin();
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (join == 0) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeJoin(Paint.Join.MITER);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (join == 1) {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeJoin(Paint.Join.ROUND);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (join == 2) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeJoin(Paint.Join.BEVEL);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static float[] createMatrix(AffineTransform Tx) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double[] at = new double[9];
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Tx.getMatrix(at);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] f = new float[at.length];
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[0] = (float) at[0];
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[1] = (float) at[2];
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[2] = (float) at[4];
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[3] = (float) at[1];
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[4] = (float) at[3];
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[5] = (float) at[5];
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[6] = 0;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[7] = 0;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f[8] = 1;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float[] createAWTMatrix(float[] matrix) {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] at = new float[9];
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[0] = matrix[0];
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[1] = matrix[3];
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[2] = matrix[1];
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[3] = matrix[4];
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[4] = matrix[2];
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[5] = matrix[5];
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[6] = 0;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[7] = 0;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        at[8] = 1;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return at;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Matrix createMatrixObj(AffineTransform Tx) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Matrix m = new Matrix();
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m.reset();
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m.setValues(createMatrix(Tx));
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTransform(AffineTransform Tx) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.reset();
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if(Tx.isIdentity()) { mM = new Matrix(); }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.setValues(createMatrix(Tx));
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Matrix m = new Matrix();
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m.setValues(getInverseMatrix());
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(m);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(mM);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void shear(double shx, double shy) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.setSkew((float) shx, (float) shy);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(mM);
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void transform(AffineTransform Tx) {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Matrix m = new Matrix();
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m.setValues(createMatrix(Tx));
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(m);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void translate(double tx, double ty) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.setTranslate((float) tx, (float) ty);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(mM);
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void translate(int x, int y) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mM.setTranslate((float) x, (float) y);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.concat(mM);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearRect(int x, int y, int width, int height) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.clipRect(x, y, x + width, y + height);
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBc != null) {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawARGB(mBc.getAlpha(), mBc.getBlue(), mBc.getGreen(), mBc
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .getRed());
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawARGB(0xff, 0xff, 0xff, 0xff);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clipRect(int x, int y, int width, int height) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cl[] = {-1, x, y, -2, x, y + width, -2, x + height, y + width, -2, x + height, y};
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Shape shp = createShape(cl);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrClip.intersect(new Area(shp));
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.clipRect(new Rect(x, y, x + width, y + height), Region.Op.INTERSECT);
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void copyArea(int sx, int sy, int width, int height, int dx, int dy) {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        copyArea(mC, sx, sy, width + dx, height + dy, dx, dy);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Graphics create() {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispose() {
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC = null;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = null;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawArc(int x, int y, int width, int height, int sa, int ea) {
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStrokeWidth(0);
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawArc(new RectF(x, y, x + width, y + height), 360 - (ea + sa),
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       ea, true, mP);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ???AWT: only used for debuging, delete in final version
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawBitmap(Bitmap bm, float x, float y, Paint p) {
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.drawBitmap(bm, x, y, null);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean drawImage(Image image, int x, int y, Color bgcolor,
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ImageObserver imageObserver) {
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image == null) {
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean done = false;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean somebits = false;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface srcSurf = null;
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image instanceof OffscreenImage){
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OffscreenImage oi = (OffscreenImage) image;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((oi.getState() & ImageObserver.ERROR) != 0) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = oi.prepareImage(imageObserver);
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = oi.getImageSurface();
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }else{
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = true;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = Surface.getImageSurface(image);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(done || somebits) {
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int w = srcSurf.getWidth();
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int h = srcSurf.getHeight();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h, (AffineTransform) transform.clone(),
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    composite, bgcolor, clip);
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return done;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean drawImage(Image image, int x, int y, ImageObserver imageObserver) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return drawImage(image, x, y, null, imageObserver);
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean drawImage(Image image, int x, int y, int width, int height,
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Color bgcolor, ImageObserver imageObserver) {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image == null) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(width == 0 || height == 0) {
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean done = false;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean somebits = false;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface srcSurf = null;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image instanceof OffscreenImage){
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OffscreenImage oi = (OffscreenImage) image;
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((oi.getState() & ImageObserver.ERROR) != 0) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = oi.prepareImage(imageObserver);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = oi.getImageSurface();
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }else{
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = true;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = Surface.getImageSurface(image);
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(done || somebits) {
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int w = srcSurf.getWidth();
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int h = srcSurf.getHeight();
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(w == width && h == height){
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h,
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (AffineTransform) transform.clone(),
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        composite, bgcolor, clip);
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }else{
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AffineTransform xform = new AffineTransform();
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                xform.setToScale((float)width / w, (float)height / h);
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h,
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (AffineTransform) transform.clone(),
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        xform, composite, bgcolor, clip);
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return done;
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean drawImage(Image image, int x, int y, int width, int height,
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ImageObserver imageObserver) {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return drawImage(image, x, y, width, height, null, imageObserver);
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2,
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sx1, int sy1, int sx2, int sy2, Color bgcolor,
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ImageObserver imageObserver) {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image == null) {
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(dx1 == dx2 || dy1 == dy2 || sx1 == sx2 || sy1 == sy2) {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean done = false;
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean somebits = false;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface srcSurf = null;
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image instanceof OffscreenImage){
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OffscreenImage oi = (OffscreenImage) image;
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((oi.getState() & ImageObserver.ERROR) != 0) {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = oi.prepareImage(imageObserver);
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = oi.getImageSurface();
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }else{
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = true;
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = Surface.getImageSurface(image);
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(done || somebits) {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int dstX = dx1;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int dstY = dy1;
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int srcX = sx1;
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int srcY = sy1;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int dstW = dx2 - dx1;
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int dstH = dy2 - dy1;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int srcW = sx2 - sx1;
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int srcH = sy2 - sy1;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(srcW == dstW && srcH == dstH){
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                blitter.blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, srcW, srcH,
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (AffineTransform) transform.clone(),
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        composite, bgcolor, clip);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }else{
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AffineTransform xform = new AffineTransform();
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                xform.setToScale((float)dstW / srcW, (float)dstH / srcH);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                blitter.blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, srcW, srcH,
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (AffineTransform) transform.clone(),
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        xform, composite, bgcolor, clip);
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return done;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2,
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sx1, int sy1, int sx2, int sy2, ImageObserver imageObserver) {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null,
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imageObserver);
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawImage(BufferedImage bufImage, BufferedImageOp op,
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int x, int y) {
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(bufImage == null) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(op == null) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawImage(bufImage, x, y, null);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if(op instanceof AffineTransformOp){
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AffineTransformOp atop = (AffineTransformOp) op;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AffineTransform xform = atop.getTransform();
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Surface srcSurf = Surface.getImageSurface(bufImage);
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int w = srcSurf.getWidth();
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int h = srcSurf.getHeight();
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h,
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (AffineTransform) transform.clone(), xform,
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    composite, null, clip);
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bufImage = op.filter(bufImage, null);
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Surface srcSurf = Surface.getImageSurface(bufImage);
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int w = srcSurf.getWidth();
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int h = srcSurf.getHeight();
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            blitter.blit(0, 0, srcSurf, x, y, dstSurf, w, h,
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (AffineTransform) transform.clone(),
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    composite, null, clip);
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean drawImage(Image image, AffineTransform trans,
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ImageObserver imageObserver) {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image == null) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(trans == null || trans.isIdentity()) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return drawImage(image, 0, 0, imageObserver);
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean done = false;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean somebits = false;
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface srcSurf = null;
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(image instanceof OffscreenImage){
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OffscreenImage oi = (OffscreenImage) image;
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((oi.getState() & ImageObserver.ERROR) != 0) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = oi.prepareImage(imageObserver);
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            somebits = (oi.getState() & ImageObserver.SOMEBITS) != 0;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = oi.getImageSurface();
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }else{
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            done = true;
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcSurf = Surface.getImageSurface(image);
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(done || somebits) {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int w = srcSurf.getWidth();
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int h = srcSurf.getHeight();
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AffineTransform xform = (AffineTransform) transform.clone();
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            xform.concatenate(trans);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            blitter.blit(0, 0, srcSurf, 0, 0, dstSurf, w, h, xform, composite,
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    null, clip);
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return done;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawLine(int x1, int y1, int x2, int y2) {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawLine(x1, y1, x2, y2, mP);
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawOval(int x, int y, int width, int height) {
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.STROKE);
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawOval(new RectF(x, y, x + width, y + height), mP);
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawPolygon(int[] xpoints, int[] ypoints, int npoints) {
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawLine(xpoints[npoints - 1], ypoints[npoints - 1], xpoints[0],
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ypoints[0], mP);
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < npoints - 1; i++) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mC.drawLine(xpoints[i], ypoints[i], xpoints[i + 1],
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ypoints[i + 1], mP);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawPolyline(int[] xpoints, int[] ypoints, int npoints) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < npoints - 1; i++) {
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawLine(xpoints[i], ypoints[i], xpoints[i + 1], ypoints[i + 1]);
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawRoundRect(int x, int y, int width, int height,
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int arcWidth, int arcHeight) {
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawRoundRect(new RectF(x, y, width, height), arcWidth,
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arcHeight, mP);
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fillArc(int x, int y, int width, int height, int sa, int ea) {
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Paint.Style tmp = mP.getStyle();
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.FILL_AND_STROKE);
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawArc(new RectF(x, y, x + width, y + height), 360 - (sa + ea),
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ea, true, mP);
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(tmp);
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fillOval(int x, int y, int width, int height) {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Paint.Style tmp = mP.getStyle();
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.FILL);
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawOval(new RectF(x, y, x + width, y + height), mP);
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(tmp);
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fillPolygon(int[] xpoints, int[] ypoints, int npoints) {
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Paint.Style tmp = mP.getStyle();
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.save(Canvas.CLIP_SAVE_FLAG);
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.FILL);
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GeneralPath filledPolygon = new GeneralPath(
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    GeneralPath.WIND_EVEN_ODD, npoints);
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filledPolygon.moveTo(xpoints[0], ypoints[0]);
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int index = 1; index < xpoints.length; index++) {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                filledPolygon.lineTo(xpoints[index], ypoints[index]);
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filledPolygon.closePath();
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Path path = getPath(filledPolygon);
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.clipPath(path);
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawPath(path, mP);
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(tmp);
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.restore();
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fillRect(int x, int y, int width, int height) {
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Paint.Style tmp = mP.getStyle();
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.FILL);
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawRect(new Rect(x, y, x + width, y + height), mP);
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(tmp);
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawRect(int x, int y, int width, int height) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] xpoints = { x, x, x + width, x + width };
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] ypoints = { y, y + height, y + height, y };
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        drawPolygon(xpoints, ypoints, 4);
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fillRoundRect(int x, int y, int width, int height,
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int arcWidth, int arcHeight) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mP == null) {
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mP = new Paint();
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP.setStyle(Paint.Style.FILL);
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mC.drawRoundRect(new RectF(x, y, x + width, y + height), arcWidth,
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arcHeight, mP);
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Shape getClip() {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrClip;
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Rectangle getClipBounds() {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect r = mC.getClipBounds();
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Rectangle(r.left, r.top, r.width(), r.height());
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Color getColor() {
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP != null) {
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Color(mP.getColor());
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Font getFont() {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFnt;
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FontMetrics getFontMetrics(Font font) {
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFm = new FontMetricsImpl(font);
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFm;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setClip(int x, int y, int width, int height) {
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cl[] = {-1, x, y, -2, x, y + width, -2, x + height, y + width, -2, x + height, y};
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrClip = new Area(createShape(cl));
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.clipRect(x, y, x + width, y + height, Region.Op.REPLACE);
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setClip(Shape clip) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrClip = new Area(clip);
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.clipPath(getPath(clip), Region.Op.REPLACE);
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setColor(Color c) {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setColor(c.getRGB());
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Font mapping:
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Family:
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Android         AWT
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * -------------------------------------
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * serif           Serif / TimesRoman
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sans-serif      SansSerif / Helvetica
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * monospace       Monospaced / Courier
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Style:
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Android            AWT
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * -------------------------------------
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal          Plain
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bold            bold
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * italic          italic
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFont(Font font) {
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (font == null) {
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFnt = font;
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Typeface tf = null;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int sty = font.getStyle();
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nam = font.getName();
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String aF = "";
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nam != null) {
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nam.equalsIgnoreCase("Serif")
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || nam.equalsIgnoreCase("TimesRoman")) {
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                aF = "serif";
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nam.equalsIgnoreCase("SansSerif")
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || nam.equalsIgnoreCase("Helvetica")) {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                aF = "sans-serif";
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nam.equalsIgnoreCase("Monospaced")
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || nam.equalsIgnoreCase("Courier")) {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                aF = "monospace";
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (sty) {
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case Font.PLAIN:
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tf = Typeface.create(aF, Typeface.NORMAL);
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case Font.BOLD:
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tf = Typeface.create(aF, Typeface.BOLD);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case Font.ITALIC:
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tf = Typeface.create(aF, Typeface.ITALIC);
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case Font.BOLD | Font.ITALIC:
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tf = Typeface.create(aF, Typeface.BOLD_ITALIC);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tf = Typeface.DEFAULT;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setTextSize(font.getSize());
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setTypeface(tf);
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawBytes(byte[] data, int offset, int length, int x, int y) {
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        drawString(new String(data, offset, length), x, y);
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawPolygon(Polygon p) {
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        drawPolygon(p.xpoints, p.ypoints, p.npoints);
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fillPolygon(Polygon p) {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillPolygon(p.xpoints, p.ypoints, p.npoints);
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Rectangle getClipBounds(Rectangle r) {
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Shape clip = getClip();
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clip != null) {
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rectangle b = clip.getBounds();
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.x = b.x;
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.y = b.y;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.width = b.width;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.height = b.height;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hitClip(int x, int y, int width, int height) {
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getClipBounds().intersects(new Rectangle(x, y, width, height));
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawChars(char[] data, int offset, int length, int x, int y) {
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mC.drawText(data, offset, length, x, y, mP);
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPaintMode() {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setXfermode(null);
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setXORMode(Color color) {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mP == null) {
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mP = new Paint();
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mP.setXfermode(new PixelXorXfermode(color.getRGB()));
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void fill3DRect(int x, int y, int width, int height, boolean raised) {
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Color color = getColor();
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Color colorUp, colorDown;
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (raised) {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorUp = color.brighter();
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorDown = color.darker();
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setColor(color);
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorUp = color.darker();
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorDown = color.brighter();
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setColor(colorUp);
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        width--;
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        height--;
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x+1, y+1, width-1, height-1);
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColor(colorUp);
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x, y, width, 1);
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x, y+1, 1, height);
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColor(colorDown);
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x+width, y, 1, height);
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x+1, y+height, width, 1);
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw3DRect(int x, int y, int width, int height, boolean raised) {
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Color color = getColor();
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Color colorUp, colorDown;
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (raised) {
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorUp = color.brighter();
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorDown = color.darker();
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorUp = color.darker();
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorDown = color.brighter();
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColor(colorUp);
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x, y, width, 1);
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x, y+1, 1, height);
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColor(colorDown);
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x+width, y, 1, height);
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fillRect(x+1, y+height, width, 1);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void copyArea(Canvas canvas, int sx, int sy, int width, int height, int dx, int dy) {
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sx += getTransform().getTranslateX();
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sy += getTransform().getTranslateY();
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NativeUtils.nativeScrollRect(canvas,
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new Rect(sx, sy, sx + width, sy + height),
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dx, dy);
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1355