Home | History | Annotate | Download | only in graphics
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.apis.graphics;
     18 
     19 import android.content.Context;
     20 import android.graphics.Bitmap;
     21 import android.graphics.BitmapShader;
     22 import android.graphics.Canvas;
     23 import android.graphics.Color;
     24 import android.graphics.Matrix;
     25 import android.graphics.Paint;
     26 import android.graphics.PorterDuff;
     27 import android.graphics.PorterDuffXfermode;
     28 import android.graphics.RectF;
     29 import android.graphics.Shader;
     30 import android.graphics.Xfermode;
     31 import android.os.Bundle;
     32 import android.view.View;
     33 
     34 public class Xfermodes extends GraphicsActivity {
     35 
     36     // create a bitmap with a circle, used for the "dst" image
     37     static Bitmap makeDst(int w, int h) {
     38         Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
     39         Canvas c = new Canvas(bm);
     40         Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
     41 
     42         p.setColor(0xFFFFCC44);
     43         c.drawOval(new RectF(0, 0, w*3/4, h*3/4), p);
     44         return bm;
     45     }
     46 
     47     // create a bitmap with a rect, used for the "src" image
     48     static Bitmap makeSrc(int w, int h) {
     49         Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
     50         Canvas c = new Canvas(bm);
     51         Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
     52 
     53         p.setColor(0xFF66AAFF);
     54         c.drawRect(w/3, h/3, w*19/20, h*19/20, p);
     55         return bm;
     56     }
     57 
     58     @Override
     59     protected void onCreate(Bundle savedInstanceState) {
     60         super.onCreate(savedInstanceState);
     61         setContentView(new SampleView(this));
     62     }
     63 
     64     private static class SampleView extends View {
     65         private static final int W = 64;
     66         private static final int H = 64;
     67         private static final int ROW_MAX = 4;   // number of samples per row
     68 
     69         private Bitmap mSrcB;
     70         private Bitmap mDstB;
     71         private Shader mBG;     // background checker-board pattern
     72 
     73         private static final Xfermode[] sModes = {
     74             new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
     75             new PorterDuffXfermode(PorterDuff.Mode.SRC),
     76             new PorterDuffXfermode(PorterDuff.Mode.DST),
     77             new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
     78             new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
     79             new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
     80             new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
     81             new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
     82             new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
     83             new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
     84             new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
     85             new PorterDuffXfermode(PorterDuff.Mode.XOR),
     86             new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
     87             new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
     88             new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
     89             new PorterDuffXfermode(PorterDuff.Mode.SCREEN)
     90         };
     91 
     92         private static final String[] sLabels = {
     93             "Clear", "Src", "Dst", "SrcOver",
     94             "DstOver", "SrcIn", "DstIn", "SrcOut",
     95             "DstOut", "SrcATop", "DstATop", "Xor",
     96             "Darken", "Lighten", "Multiply", "Screen"
     97         };
     98 
     99         public SampleView(Context context) {
    100             super(context);
    101 
    102             mSrcB = makeSrc(W, H);
    103             mDstB = makeDst(W, H);
    104 
    105             // make a ckeckerboard pattern
    106             Bitmap bm = Bitmap.createBitmap(new int[] { 0xFFFFFFFF, 0xFFCCCCCC,
    107                                             0xFFCCCCCC, 0xFFFFFFFF }, 2, 2,
    108                                             Bitmap.Config.RGB_565);
    109             mBG = new BitmapShader(bm,
    110                                    Shader.TileMode.REPEAT,
    111                                    Shader.TileMode.REPEAT);
    112             Matrix m = new Matrix();
    113             m.setScale(6, 6);
    114             mBG.setLocalMatrix(m);
    115         }
    116 
    117         @Override protected void onDraw(Canvas canvas) {
    118             canvas.drawColor(Color.WHITE);
    119 
    120             Paint labelP = new Paint(Paint.ANTI_ALIAS_FLAG);
    121             labelP.setTextAlign(Paint.Align.CENTER);
    122 
    123             Paint paint = new Paint();
    124             paint.setFilterBitmap(false);
    125 
    126             canvas.translate(15, 35);
    127 
    128             int x = 0;
    129             int y = 0;
    130             for (int i = 0; i < sModes.length; i++) {
    131                 // draw the border
    132                 paint.setStyle(Paint.Style.STROKE);
    133                 paint.setShader(null);
    134                 canvas.drawRect(x - 0.5f, y - 0.5f,
    135                                 x + W + 0.5f, y + H + 0.5f, paint);
    136 
    137                 // draw the checker-board pattern
    138                 paint.setStyle(Paint.Style.FILL);
    139                 paint.setShader(mBG);
    140                 canvas.drawRect(x, y, x + W, y + H, paint);
    141 
    142                 // draw the src/dst example into our offscreen bitmap
    143                 int sc = canvas.saveLayer(x, y, x + W, y + H, null,
    144                                           Canvas.MATRIX_SAVE_FLAG |
    145                                           Canvas.CLIP_SAVE_FLAG |
    146                                           Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
    147                                           Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
    148                                           Canvas.CLIP_TO_LAYER_SAVE_FLAG);
    149                 canvas.translate(x, y);
    150                 canvas.drawBitmap(mDstB, 0, 0, paint);
    151                 paint.setXfermode(sModes[i]);
    152                 canvas.drawBitmap(mSrcB, 0, 0, paint);
    153                 paint.setXfermode(null);
    154                 canvas.restoreToCount(sc);
    155 
    156                 // draw the label
    157                 canvas.drawText(sLabels[i],
    158                                 x + W/2, y - labelP.getTextSize()/2, labelP);
    159 
    160                 x += W + 10;
    161 
    162                 // wrap around when we've drawn enough for one row
    163                 if ((i % ROW_MAX) == ROW_MAX - 1) {
    164                     x = 0;
    165                     y += H + 30;
    166                 }
    167             }
    168         }
    169     }
    170 }
    171 
    172