1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian#include <GLES/gl.h>
22d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian#include <GLES/glext.h>
23d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
273330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
283330b203039dea366d4981db1408a460134b2d2cMathias Agopian
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerDim.h"
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
310f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
364d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayerDim::LayerDim(SurfaceFlinger* flinger, const sp<Client>& client,
374d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    : Layer(flinger, client, name, w, h, flags) {
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4113127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianLayerDim::~LayerDim() {
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
444297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerDim::onDraw(const sp<const DisplayDevice>& hw, const Region& clip) const
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
47f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian    if (s.alpha>0) {
481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian        const GLfloat alpha = s.alpha/255.0f;
494297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian        const uint32_t fbHeight = hw->getHeight();
50c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian        glDisable(GL_TEXTURE_EXTERNAL_OES);
51c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian        glDisable(GL_TEXTURE_2D);
520d1561275e80073807ac04728951782d943f8882Mathias Agopian
530d1561275e80073807ac04728951782d943f8882Mathias Agopian        if (s.alpha == 0xFF) {
540d1561275e80073807ac04728951782d943f8882Mathias Agopian            glDisable(GL_BLEND);
550d1561275e80073807ac04728951782d943f8882Mathias Agopian        } else {
560d1561275e80073807ac04728951782d943f8882Mathias Agopian            glEnable(GL_BLEND);
570d1561275e80073807ac04728951782d943f8882Mathias Agopian            glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
580d1561275e80073807ac04728951782d943f8882Mathias Agopian        }
590d1561275e80073807ac04728951782d943f8882Mathias Agopian
601f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian        glColor4f(0, 0, 0, alpha);
611f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
624fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        LayerMesh mesh;
634fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        computeGeometry(hw, &mesh);
644fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian
654fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        glVertexPointer(2, GL_FLOAT, 0, mesh.getVertices());
664fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, mesh.getVertexCount());
67945ebbfd3dc07c7168602a1603eeb76ea7425376Mathias Agopian
68c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian        glDisable(GL_BLEND);
69c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
732f73af9212487c81d31d07227fa8a2f4abc77638Mathias Agopianbool LayerDim::isVisible() const {
7413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian    const Layer::State& s(drawingState());
752f73af9212487c81d31d07227fa8a2f4abc77638Mathias Agopian    return !(s.flags & layer_state_t::eLayerHidden) && s.alpha;
762f73af9212487c81d31d07227fa8a2f4abc77638Mathias Agopian}
772f73af9212487c81d31d07227fa8a2f4abc77638Mathias Agopian
782f73af9212487c81d31d07227fa8a2f4abc77638Mathias Agopian
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
82