1a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard/* 2a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Copyright 2010, The Android Open Source Project 3a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 4a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Redistribution and use in source and binary forms, with or without 5a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * modification, are permitted provided that the following conditions 6a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * are met: 7a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions of source code must retain the above copyright 8a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer. 9a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions in binary form must reproduce the above copyright 10a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer in the 11a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * documentation and/or other materials provided with the distribution. 12a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 13a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard */ 25a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 26594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#ifndef TileTexture_h 27594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#define TileTexture_h 28a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 29594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "Color.h" 30485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu#include "FloatRect.h" 31594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "SkBitmap.h" 32594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "SkRect.h" 33594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "SkSize.h" 3432ce41e0241790f20e63cafea4d3c1db87423eecChris Craik#include "TextureInfo.h" 35594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik 3662ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu#include <GLES2/gl2.h> 37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 38a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardclass SkCanvas; 39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore { 41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 42594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikclass TextureOwner; 43594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikclass Tile; 44594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikclass TransformationMatrix; 45a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 46594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikclass TileTexture { 47a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardpublic: 48a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger // This object is to be constructed on the consumer's thread and must have 49a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger // a width and height greater than 0. 50594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik TileTexture(uint32_t w, uint32_t h); 51594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik virtual ~TileTexture(); 52a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 531eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger // allows consumer thread to assign ownership of the texture to the tile. It 541eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger // returns false if ownership cannot be transferred because the tile is busy 5564d72d82692e48f595e7a31ac2a1680f11d9186bChris Craik bool acquire(TextureOwner* owner); 5681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard bool release(TextureOwner* owner); 57959c08a729d39539327aeb634dbce69524e7b678Chris Craik 58211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard // set the texture owner if not busy. Return false if busy, true otherwise. 5964d72d82692e48f595e7a31ac2a1680f11d9186bChris Craik bool setOwner(TextureOwner* owner); 60a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 61a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger // private member accessor functions 629cb2c64b0e05541c6e78a17de554436f933351fbNicolas Roard TextureOwner* owner() { return m_owner; } // only used by the consumer thread 63a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 64ac45fd040af509d8cc3470ad7f8dcdfe459d5c7cNicolas Roard const SkSize& getSize() const { return m_size; } 65ac45fd040af509d8cc3470ad7f8dcdfe459d5c7cNicolas Roard 662986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik // OpenGL ID of backing texture, 0 when not allocated 677c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu GLuint m_ownTextureId; 682986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik // these are used for dynamically (de)allocating backing graphics memory 69959c08a729d39539327aeb634dbce69524e7b678Chris Craik void requireGLTexture(); 70959c08a729d39539327aeb634dbce69524e7b678Chris Craik void discardGLTexture(); 717c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 72f8f42bbda64a56cfd5ab48a274020d4efc9a5594Chris Craik void transferComplete(); 737c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 7462ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu TextureInfo* getTextureInfo() { return &m_ownTextureInfo; } 7507fd4ab12bf7dbeb0ad9baeea1107d0823c648cdNicolas Roard 76309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu // Make sure the following pureColor getter/setter are only read/written 77309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu // in UI thread. Therefore no need for a lock. 78309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu void setPure(bool pure) { m_isPureColor = pure; } 798abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu bool isPureColor() {return m_isPureColor; } 80309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu void setPureColor(const Color& color) { m_pureColor = color; setPure(true); } 818abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu Color pureColor() { return m_pureColor; } 828abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu 83e6a08abad427194f5eb95ba75b77211fa8498997Chris Craik void drawGL(bool isLayer, const SkRect& rect, float opacity, 8432ce41e0241790f20e63cafea4d3c1db87423eecChris Craik const TransformationMatrix* transform, bool forceBlending, bool usePointSampling, 85485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu const FloatRect& fillPortion); 86a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardprivate: 8762ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu TextureInfo m_ownTextureInfo; 88ac45fd040af509d8cc3470ad7f8dcdfe459d5c7cNicolas Roard SkSize m_size; 891eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger 90594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik // Tile owning the texture, only modified by UI thread 91530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik TextureOwner* m_owner; 928abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu 938abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu // When the whole tile is single color, skip the transfer queue and draw 948abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu // it directly through shader. 958abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu bool m_isPureColor; 968abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu Color m_pureColor; 97a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}; 98a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 99a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore 100a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 101594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#endif // TileTexture_h 102