19c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis/*
29c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Copyright (C) 2012 The Android Open Source Project
39c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
49c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
59c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * you may not use this file except in compliance with the License.
69c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * You may obtain a copy of the License at
79c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
89c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
99c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Unless required by applicable law or agreed to in writing, software
119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * See the License for the specific language governing permissions and
149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * limitations under the License.
159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis */
169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
175bbe0ab655713849fbfe750d4d09690106f95d7fMathias Agopian#include <GLES2/gl2.h>
185bbe0ab655713849fbfe750d4d09690106f95d7fMathias Agopian#include <GLES2/gl2ext.h>
195bbe0ab655713849fbfe750d4d09690106f95d7fMathias Agopian
209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "Flatland.h"
219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "GLHelper.h"
229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisnamespace android {
249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass Blitter {
269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic:
279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool setUp(GLHelper* helper) {
299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        bool result;
309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        result = helper->getShaderProgram("Blit", &mBlitPgm);
329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        if (!result) {
339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return false;
349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mPosAttribLoc = glGetAttribLocation(mBlitPgm, "position");
379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mUVAttribLoc = glGetAttribLocation(mBlitPgm, "uv");
389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mUVToTexUniformLoc = glGetUniformLocation(mBlitPgm, "uvToTex");
399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mObjToNdcUniformLoc = glGetUniformLocation(mBlitPgm, "objToNdc");
409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mBlitSrcSamplerLoc = glGetUniformLocation(mBlitPgm, "blitSrc");
419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mModColorUniformLoc = glGetUniformLocation(mBlitPgm, "modColor");
429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return true;
449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool blit(GLuint texName, const float* texMatrix,
479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t x, int32_t y, uint32_t w, uint32_t h) {
489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        float modColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return modBlit(texName, texMatrix, modColor, x, y, w, h);
509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool modBlit(GLuint texName, const float* texMatrix, float* modColor,
539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t x, int32_t y, uint32_t w, uint32_t h) {
549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glUseProgram(mBlitPgm);
559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        GLint vp[4];
579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glGetIntegerv(GL_VIEWPORT, vp);
589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        float screenToNdc[16] = {
599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            2.0f/float(vp[2]),  0.0f,               0.0f,   0.0f,
609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            0.0f,               -2.0f/float(vp[3]), 0.0f,   0.0f,
619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            0.0f,               0.0f,               1.0f,   0.0f,
629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            -1.0f,              1.0f,               0.0f,   1.0f,
639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        };
649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        const float pos[] = {
659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float(x),   float(y),
669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float(x+w), float(y),
679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float(x),   float(y+h),
689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float(x+w), float(y+h),
699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        };
709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        const float uv[] = {
719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            0.0f, 0.0f,
729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            1.0f, 0.0f,
739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            0.0f, 1.0f,
749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            1.0f, 1.0f,
759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        };
769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glVertexAttribPointer(mPosAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, pos);
789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glVertexAttribPointer(mUVAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, uv);
799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glEnableVertexAttribArray(mPosAttribLoc);
809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glEnableVertexAttribArray(mUVAttribLoc);
819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glUniformMatrix4fv(mObjToNdcUniformLoc, 1, GL_FALSE, screenToNdc);
839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glUniformMatrix4fv(mUVToTexUniformLoc, 1, GL_FALSE, texMatrix);
849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glUniform4fv(mModColorUniformLoc, 1, modColor);
859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glActiveTexture(GL_TEXTURE0);
879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glBindTexture(GL_TEXTURE_EXTERNAL_OES, texName);
889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glUniform1i(mBlitSrcSamplerLoc, 0);
899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glDisableVertexAttribArray(mPosAttribLoc);
939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        glDisableVertexAttribArray(mUVAttribLoc);
949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        if (glGetError() != GL_NO_ERROR) {
969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            fprintf(stderr, "GL error!\n");
979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return true;
1009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprivate:
1039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLuint mBlitPgm;
1049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLint mPosAttribLoc;
1059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLint mUVAttribLoc;
1069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLint mUVToTexUniformLoc;
1079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLint mObjToNdcUniformLoc;
1089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLint mBlitSrcSamplerLoc;
1099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    GLint mModColorUniformLoc;
1109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis};
1119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass ComposerBase : public Composer {
1139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic:
1149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    virtual ~ComposerBase() {}
1159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    virtual bool setUp(const LayerDesc& desc,
1179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            GLHelper* helper) {
1189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mLayerDesc = desc;
1199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return setUp(helper);
1209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    virtual void tearDown() {
1239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
12592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn    virtual bool compose(GLuint /*texName*/, const sp<GLConsumer>& /*glc*/) {
1269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return true;
1279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprotected:
13092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn    virtual bool setUp(GLHelper* /*helper*/) {
1319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return true;
1329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    LayerDesc mLayerDesc;
1359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis};
1369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1379c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisComposer* nocomp() {
1389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    class NoComp : public ComposerBase {
1399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    };
1409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return new NoComp();
1419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
1429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1439c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisComposer* opaque() {
1449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    class OpaqueComp : public ComposerBase {
1459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool setUp(GLHelper* helper) {
1469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mBlitter.setUp(helper);
1479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
1489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool compose(GLuint texName, const sp<GLConsumer>& glc) {
1509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float texMatrix[16];
1519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glc->getTransformMatrix(texMatrix);
1529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t x = mLayerDesc.x;
1549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t y = mLayerDesc.y;
1559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t w = mLayerDesc.width;
1569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t h = mLayerDesc.height;
1579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mBlitter.blit(texName, texMatrix, x, y, w, h);
1599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
1609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        Blitter mBlitter;
1629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    };
1639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return new OpaqueComp();
1649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
1659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1669c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisComposer* opaqueShrink() {
1679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    class OpaqueComp : public ComposerBase {
1689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool setUp(GLHelper* helper) {
1699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mParity = false;
1709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mBlitter.setUp(helper);
1719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
1729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool compose(GLuint texName, const sp<GLConsumer>& glc) {
1749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float texMatrix[16];
1759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glc->getTransformMatrix(texMatrix);
1769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t x = mLayerDesc.x;
1789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t y = mLayerDesc.y;
1799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t w = mLayerDesc.width;
1809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t h = mLayerDesc.height;
1819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mParity = !mParity;
1839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (mParity) {
1849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                x += w / 128;
1859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                y += h / 128;
1869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                w -= w / 64;
1879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                h -= h / 64;
1889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
1899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mBlitter.blit(texName, texMatrix, x, y, w, h);
1919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
1929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        Blitter mBlitter;
1949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        bool mParity;
1959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    };
1969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return new OpaqueComp();
1979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
1989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1999c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisComposer* blend() {
2009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    class BlendComp : public ComposerBase {
2019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool setUp(GLHelper* helper) {
2029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mBlitter.setUp(helper);
2039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool compose(GLuint texName, const sp<GLConsumer>& glc) {
2069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            bool result;
2079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float texMatrix[16];
2099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glc->getTransformMatrix(texMatrix);
2109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float modColor[4] = { .75f, .75f, .75f, .75f };
2129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t x = mLayerDesc.x;
2149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t y = mLayerDesc.y;
2159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t w = mLayerDesc.width;
2169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t h = mLayerDesc.height;
2179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glEnable(GL_BLEND);
2199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            result = mBlitter.modBlit(texName, texMatrix, modColor,
2229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                    x, y, w, h);
2239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (!result) {
2249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                return false;
2259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
2269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glDisable(GL_BLEND);
2289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return true;
2309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        Blitter mBlitter;
2339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    };
2349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return new BlendComp();
2359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
2369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2379c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisComposer* blendShrink() {
2389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    class BlendShrinkComp : public ComposerBase {
2399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool setUp(GLHelper* helper) {
2409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mParity = false;
2419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mBlitter.setUp(helper);
2429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        virtual bool compose(GLuint texName, const sp<GLConsumer>& glc) {
2459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            bool result;
2469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float texMatrix[16];
2489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glc->getTransformMatrix(texMatrix);
2499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            float modColor[4] = { .75f, .75f, .75f, .75f };
2519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t x = mLayerDesc.x;
2539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t y = mLayerDesc.y;
2549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t w = mLayerDesc.width;
2559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t h = mLayerDesc.height;
2569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mParity = !mParity;
2589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (mParity) {
2599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                x += w / 128;
2609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                y += h / 128;
2619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                w -= w / 64;
2629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                h -= h / 64;
2639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
2649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glEnable(GL_BLEND);
2669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            result = mBlitter.modBlit(texName, texMatrix, modColor,
2699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                    x, y, w, h);
2709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (!result) {
2719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                return false;
2729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
2739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            glDisable(GL_BLEND);
2759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return true;
2779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        Blitter mBlitter;
2809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        bool mParity;
2819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    };
2829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return new BlendShrinkComp();
2839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
2849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} // namespace android
286