19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
246950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/GraphicBuffer.h>
256950e428feaccc8164b989ef64e771a99948797aMathias Agopian
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "LayerDim.h"
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SurfaceFlinger.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "DisplayHardware/DisplayHardware.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerDim::LayerDim(SurfaceFlinger* flinger, DisplayID display,
34593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian        const sp<Client>& client)
35593c05ce7bcf7b6d94bd8c50da2b818cf05116b1Mathias Agopian    : LayerBaseClient(flinger, display, client)
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerDim::~LayerDim()
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerDim::onDraw(const Region& clip) const
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const State& s(drawingState());
466158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    Region::const_iterator it = clip.begin();
476158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    Region::const_iterator const end = clip.end();
486158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian    if (s.alpha>0 && (it != end)) {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
50781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        const GLfloat alpha = s.alpha/255.0f;
511473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        const uint32_t fbHeight = hw.getHeight();
529044ef05d542a4f99b4be7ecefbe5e676bd3ea7fMathias Agopian        glDisable(GL_TEXTURE_EXTERNAL_OES);
539044ef05d542a4f99b4be7ecefbe5e676bd3ea7fMathias Agopian        glDisable(GL_TEXTURE_2D);
54d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian
55d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian        if (s.alpha == 0xFF) {
56d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian            glDisable(GL_BLEND);
57d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian        } else {
58d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian            glEnable(GL_BLEND);
59d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian            glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
60d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian        }
61d35c6667c8233385f31aa203f486b2cb826bf6beMathias Agopian
62781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        glColor4f(0, 0, 0, alpha);
63781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
646e138fb682fb84bfebff7f4ae4b88cef1996708cMathias Agopian        glVertexPointer(2, GL_FLOAT, 0, mVertices);
659cc88529e4cbf54df3eed968666472d3fa658d13Mathias Agopian
666158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian        while (it != end) {
676158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian            const Rect& r = *it++;
681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            const GLint sy = fbHeight - (r.top + r.height());
691473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            glScissor(r.left, sy, r.width(), r.height());
701473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
729044ef05d542a4f99b4be7ecefbe5e676bd3ea7fMathias Agopian        glDisable(GL_BLEND);
739044ef05d542a4f99b4be7ecefbe5e676bd3ea7fMathias Agopian        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
80