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