152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/*
252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * you may not use this file except in compliance with the License.
652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * You may obtain a copy of the License at
752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * See the License for the specific language governing permissions and
1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * limitations under the License.
1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpackage com.example.android.apis.graphics;
1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.content.Context;
2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Bitmap;
2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.BitmapShader;
2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Canvas;
2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Color;
2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Matrix;
2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Paint;
2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.PorterDuff;
2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.PorterDuffXfermode;
2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.RectF;
2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Shader;
3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Xfermode;
3152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.os.Bundle;
3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.view.View;
3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpublic class Xfermodes extends GraphicsActivity {
3562e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
3652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    // create a bitmap with a circle, used for the "dst" image
3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    static Bitmap makeDst(int w, int h) {
3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
3952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        Canvas c = new Canvas(bm);
4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
4162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
4262e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer        p.setColor(0xFFFFCC44);
4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        c.drawOval(new RectF(0, 0, w*3/4, h*3/4), p);
4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        return bm;
4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
4662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    // create a bitmap with a rect, used for the "src" image
4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    static Bitmap makeSrc(int w, int h) {
4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        Canvas c = new Canvas(bm);
5152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
5262e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        p.setColor(0xFF66AAFF);
5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        c.drawRect(w/3, h/3, w*19/20, h*19/20, p);
5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        return bm;
5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
5762e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    @Override
5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        super.onCreate(savedInstanceState);
6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        setContentView(new SampleView(this));
6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
6362e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    private static class SampleView extends View {
6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final int W = 64;
6652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final int H = 64;
6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final int ROW_MAX = 4;   // number of samples per row
6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Bitmap mSrcB;
7052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Bitmap mDstB;
7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Shader mBG;     // background checker-board pattern
7262e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final Xfermode[] sModes = {
7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
7552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.SRC),
7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.DST),
7752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
8152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
8252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
8352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
8452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
8552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.XOR),
8652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
8752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
8852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
8952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            new PorterDuffXfermode(PorterDuff.Mode.SCREEN)
9052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        };
9162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
9252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private static final String[] sLabels = {
9352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            "Clear", "Src", "Dst", "SrcOver",
9452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            "DstOver", "SrcIn", "DstIn", "SrcOut",
9552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            "DstOut", "SrcATop", "DstATop", "Xor",
9652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            "Darken", "Lighten", "Multiply", "Screen"
9752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        };
9862e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
9952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        public SampleView(Context context) {
10052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            super(context);
10162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
10252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mSrcB = makeSrc(W, H);
10352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mDstB = makeDst(W, H);
10462e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
10552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // make a ckeckerboard pattern
10652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            Bitmap bm = Bitmap.createBitmap(new int[] { 0xFFFFFFFF, 0xFFCCCCCC,
10752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                            0xFFCCCCCC, 0xFFFFFFFF }, 2, 2,
10852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                            Bitmap.Config.RGB_565);
10952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mBG = new BitmapShader(bm,
11052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                   Shader.TileMode.REPEAT,
11152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                   Shader.TileMode.REPEAT);
11252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            Matrix m = new Matrix();
11352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            m.setScale(6, 6);
11452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mBG.setLocalMatrix(m);
11552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
11662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
11752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        @Override protected void onDraw(Canvas canvas) {
11852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.drawColor(Color.WHITE);
11962e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
12052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            Paint labelP = new Paint(Paint.ANTI_ALIAS_FLAG);
12152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            labelP.setTextAlign(Paint.Align.CENTER);
12262e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
12352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            Paint paint = new Paint();
12452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            paint.setFilterBitmap(false);
12562e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
12652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            canvas.translate(15, 35);
12762e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
12852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            int x = 0;
12952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            int y = 0;
13052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            for (int i = 0; i < sModes.length; i++) {
13152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // draw the border
13252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                paint.setStyle(Paint.Style.STROKE);
13352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                paint.setShader(null);
13452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.drawRect(x - 0.5f, y - 0.5f,
13552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                x + W + 0.5f, y + H + 0.5f, paint);
13662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
13752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // draw the checker-board pattern
13852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                paint.setStyle(Paint.Style.FILL);
13952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                paint.setShader(mBG);
14052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.drawRect(x, y, x + W, y + H, paint);
14162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
14252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // draw the src/dst example into our offscreen bitmap
14352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                int sc = canvas.saveLayer(x, y, x + W, y + H, null,
14452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                          Canvas.MATRIX_SAVE_FLAG |
14552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                          Canvas.CLIP_SAVE_FLAG |
14652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                          Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
14752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                          Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
14852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                          Canvas.CLIP_TO_LAYER_SAVE_FLAG);
14952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.translate(x, y);
15052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.drawBitmap(mDstB, 0, 0, paint);
15152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                paint.setXfermode(sModes[i]);
15252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.drawBitmap(mSrcB, 0, 0, paint);
15352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                paint.setXfermode(null);
15452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.restoreToCount(sc);
15562e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
15652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // draw the label
15752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                canvas.drawText(sLabels[i],
15852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                                x + W/2, y - labelP.getTextSize()/2, labelP);
15962e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
16052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                x += W + 10;
16162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer
16252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // wrap around when we've drawn enough for one row
16352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                if ((i % ROW_MAX) == ROW_MAX - 1) {
16452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                    x = 0;
16552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                    y += H + 30;
16652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                }
16752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            }
16852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
16952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
17052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project}
17152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
172