• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
BlackSurface(SurfaceSession session, int layer, int l, int t, int r, int b)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 
setMatrix(Matrix matrix)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 
clearMatrix()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 
BlackFrame(SurfaceSession session, Rect outer, Rect inner, int layer)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 
kill()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 
hide()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 
setMatrix(Matrix matrix)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 
clearMatrix()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