• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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.test.hwui
18 
19 import android.app.Activity
20 import android.os.Bundle
21 import android.hardware.HardwareBuffer
22 import android.graphics.Canvas
23 import android.graphics.PixelFormat
24 import android.graphics.Rect
25 import android.media.ImageReader
26 import android.view.Surface
27 import java.lang.IllegalArgumentException
28 
29 const val USAGE_HWC = 0x800L
30 
31 class PenStylusActivity : Activity() {
32 
onCreatenull33     override fun onCreate(savedInstanceState: Bundle?) {
34         super.onCreate(savedInstanceState)
35 
36         setContentView(FrontBufferedLayer(this))
37     }
38 
39     class SingleBufferedCanvas : AutoCloseable {
40         val mHardwareBuffer: HardwareBuffer
41         private var mCanvas: Canvas?
42         private val mImageReader: ImageReader
43         private val mSurface: Surface
44 
45         constructor(width: Int, height: Int) {
46             mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1,
47                 HardwareBuffer.USAGE_CPU_READ_RARELY or HardwareBuffer.USAGE_CPU_WRITE_RARELY or
48                         HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE or USAGE_HWC)
49 
50             mSurface = mImageReader.surface
51             mSurface.unlockCanvasAndPost(mSurface.lockCanvas(null))
52             val image = mImageReader.acquireNextImage()
53             mHardwareBuffer = image.hardwareBuffer!!
54             image.close()
55             mCanvas = mSurface.lockCanvas(null)
56         }
57 
lockCanvasnull58         fun lockCanvas(rect: Rect?): Canvas {
59             if (mCanvas != null) {
60                 unlockCanvas(mCanvas!!)
61             }
62             mCanvas = mSurface.lockCanvas(rect)
63             return mCanvas!!
64         }
65 
unlockCanvasnull66         fun unlockCanvas(canvas: Canvas) {
67             if (this.mCanvas !== canvas) throw IllegalArgumentException()
68             mSurface.unlockCanvasAndPost(canvas)
69             this.mCanvas = null
70             mImageReader.acquireNextImage().close()
71         }
72 
updatenull73         inline fun update(area: Rect?, func: Canvas.() -> Unit) {
74             val canvas = lockCanvas(area)
75             func(canvas)
76             unlockCanvas(canvas)
77         }
78 
closenull79         override fun close() {
80             mHardwareBuffer.close()
81             mSurface.unlockCanvasAndPost(mCanvas)
82             mImageReader.close()
83         }
84     }
85 }