1 /* 2 * Copyright 2011, The Android Open Source Project 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef ImageTexture_h 27 #define ImageTexture_h 28 29 #include "ClassTracker.h" 30 #include "GLUtils.h" 31 #include "SkBitmap.h" 32 #include "SkBitmapRef.h" 33 #include "SkRefCnt.h" 34 #include "LayerAndroid.h" 35 36 namespace WebCore { 37 38 class LayerAndroid; 39 40 ///////////////////////////////////////////////////////////////////////////////// 41 // Image sharing codepath for layers 42 ///////////////////////////////////////////////////////////////////////////////// 43 // 44 // We receive an SkBitmapRef on the webcore thread; from this we create 45 // an ImageTexture instance and keep it in TilesManager in a hashmap 46 // (see TilesManager::addImage()) 47 // 48 // The ImageTexture will recopy the pointed SkBitmap locally (so we can safely 49 // use it on the texture generation thread), and just use the SkBitmapRef as a 50 // key. 51 // 52 // Layers on the shared image path will ask TilesManager for the corresponding 53 // ImageTexture, instead of using a PaintedSurface+TiledTexture. 54 // When the ImageTexture is prepared for the first time, we directly upload 55 // the bitmap to a texture. 56 // 57 // TODO: limit how many ImageTextures can be uploaded in one draw cycle 58 // TODO: limit the size of ImageTextures (use a TiledTexture when needed) 59 // 60 ///////////////////////////////////////////////////////////////////////////////// 61 class ImageTexture { 62 public: 63 ImageTexture(SkBitmapRef* img); 64 virtual ~ImageTexture(); 65 66 void prepareGL(); 67 void uploadGLTexture(); 68 void drawGL(LayerAndroid* painter); 69 void drawCanvas(SkCanvas*, SkRect&); retain()70 void retain() { m_refCount++; } 71 void release(); refCount()72 unsigned int refCount() { return m_refCount; } imageRef()73 SkBitmapRef* imageRef() { return m_imageRef; } bitmap()74 SkBitmap* bitmap() { return m_image; } 75 76 private: 77 78 void deleteTexture(); 79 80 SkBitmapRef* m_imageRef; 81 SkBitmap* m_image; 82 GLuint m_textureId; 83 unsigned int m_refCount; 84 }; 85 86 } // namespace WebCore 87 88 #endif // ImageTexture 89