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