Home | History | Annotate | Download | only in wm
      1 /*
      2  * Copyright (C) 2011 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.android.server.wm;
     18 
     19 import android.graphics.Matrix;
     20 import android.graphics.PixelFormat;
     21 import android.graphics.Rect;
     22 import android.util.Slog;
     23 import android.view.Surface;
     24 import android.view.SurfaceSession;
     25 
     26 /**
     27  * Four black surfaces put together to make a black frame.
     28  */
     29 public class BlackFrame {
     30     class BlackSurface {
     31         final int left;
     32         final int top;
     33         final Surface surface;
     34 
     35         BlackSurface(SurfaceSession session, int layer, int l, int t, int r, int b)
     36                 throws Surface.OutOfResourcesException {
     37             left = l;
     38             top = t;
     39             int w = r-l;
     40             int h = b-t;
     41             surface = new Surface(session, 0, "BlackSurface",
     42                     -1, w, h, PixelFormat.OPAQUE, Surface.FX_SURFACE_DIM);
     43             if (WindowManagerService.SHOW_TRANSACTIONS ||
     44                     WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG,
     45                             "  BLACK " + surface + ": CREATE layer=" + layer);
     46             surface.setAlpha(1.0f);
     47             surface.setLayer(layer);
     48         }
     49 
     50         void setMatrix(Matrix matrix) {
     51             mTmpMatrix.setTranslate(left, top);
     52             mTmpMatrix.postConcat(matrix);
     53             mTmpMatrix.getValues(mTmpFloats);
     54             surface.setPosition(mTmpFloats[Matrix.MTRANS_X],
     55                     mTmpFloats[Matrix.MTRANS_Y]);
     56             surface.setMatrix(
     57                     mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
     58                     mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
     59             if (false) {
     60                 Slog.i(WindowManagerService.TAG, "Black Surface @ (" + left + "," + top + "): ("
     61                         + mTmpFloats[Matrix.MTRANS_X] + ","
     62                         + mTmpFloats[Matrix.MTRANS_Y] + ") matrix=["
     63                         + mTmpFloats[Matrix.MSCALE_X] + ","
     64                         + mTmpFloats[Matrix.MSCALE_Y] + "]["
     65                         + mTmpFloats[Matrix.MSKEW_X] + ","
     66                         + mTmpFloats[Matrix.MSKEW_Y] + "]");
     67             }
     68         }
     69 
     70         void clearMatrix() {
     71             surface.setMatrix(1, 0, 0, 1);
     72         }
     73     }
     74 
     75     final Matrix mTmpMatrix = new Matrix();
     76     final float[] mTmpFloats = new float[9];
     77     final BlackSurface[] mBlackSurfaces = new BlackSurface[4];
     78 
     79     public BlackFrame(SurfaceSession session, Rect outer, Rect inner,
     80             int layer) throws Surface.OutOfResourcesException {
     81         boolean success = false;
     82 
     83         try {
     84             if (outer.top < inner.top) {
     85                 mBlackSurfaces[0] = new BlackSurface(session, layer,
     86                         outer.left, outer.top, inner.right, inner.top);
     87             }
     88             if (outer.left < inner.left) {
     89                 mBlackSurfaces[1] = new BlackSurface(session, layer,
     90                         outer.left, inner.top, inner.left, outer.bottom);
     91             }
     92             if (outer.bottom > inner.bottom) {
     93                 mBlackSurfaces[2] = new BlackSurface(session, layer,
     94                         inner.left, inner.bottom, outer.right, outer.bottom);
     95             }
     96             if (outer.right > inner.right) {
     97                 mBlackSurfaces[3] = new BlackSurface(session, layer,
     98                         inner.right, outer.top, outer.right, inner.bottom);
     99             }
    100             success = true;
    101         } finally {
    102             if (!success) {
    103                 kill();
    104             }
    105         }
    106     }
    107 
    108     public void kill() {
    109         if (mBlackSurfaces != null) {
    110             for (int i=0; i<mBlackSurfaces.length; i++) {
    111                 if (mBlackSurfaces[i] != null) {
    112                     if (WindowManagerService.SHOW_TRANSACTIONS ||
    113                             WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(
    114                                     WindowManagerService.TAG,
    115                                     "  BLACK " + mBlackSurfaces[i].surface + ": DESTROY");
    116                     mBlackSurfaces[i].surface.destroy();
    117                     mBlackSurfaces[i] = null;
    118                 }
    119             }
    120         }
    121     }
    122 
    123     public void hide() {
    124         if (mBlackSurfaces != null) {
    125             for (int i=0; i<mBlackSurfaces.length; i++) {
    126                 if (mBlackSurfaces[i] != null) {
    127                     mBlackSurfaces[i].surface.hide();
    128                 }
    129             }
    130         }
    131     }
    132 
    133     public void setMatrix(Matrix matrix) {
    134         for (int i=0; i<mBlackSurfaces.length; i++) {
    135             if (mBlackSurfaces[i] != null) {
    136                 mBlackSurfaces[i].setMatrix(matrix);
    137             }
    138         }
    139     }
    140 
    141     public void clearMatrix() {
    142         for (int i=0; i<mBlackSurfaces.length; i++) {
    143             if (mBlackSurfaces[i] != null) {
    144                 mBlackSurfaces[i].clearMatrix();
    145             }
    146         }
    147     }
    148 }
    149