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