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 #include "config.h" 27 #include "PaintTileOperation.h" 28 #include "ImageTexture.h" 29 #include "ImagesManager.h" 30 #include "LayerAndroid.h" 31 #include "PaintedSurface.h" 32 33 namespace WebCore { 34 35 PaintTileOperation::PaintTileOperation(BaseTile* tile, SurfacePainter* surface) 36 : QueuedOperation(QueuedOperation::PaintTile, tile->page()) 37 , m_tile(tile) 38 , m_surface(surface) 39 { 40 if (m_tile) 41 m_tile->setRepaintPending(true); 42 SkSafeRef(m_surface); 43 } 44 45 PaintTileOperation::~PaintTileOperation() 46 { 47 if (m_tile) { 48 m_tile->setRepaintPending(false); 49 m_tile = 0; 50 } 51 52 if (m_surface && m_surface->type() == SurfacePainter::ImageSurface) { 53 ImageTexture* image = static_cast<ImageTexture*>(m_surface); 54 ImagesManager::instance()->releaseImage(image->imageCRC()); 55 } else { 56 SkSafeUnref(m_surface); 57 } 58 } 59 60 bool PaintTileOperation::operator==(const QueuedOperation* operation) 61 { 62 if (operation->type() != type()) 63 return false; 64 const PaintTileOperation* op = static_cast<const PaintTileOperation*>(operation); 65 return op->m_tile == m_tile; 66 } 67 68 void PaintTileOperation::run() 69 { 70 if (m_tile) { 71 m_tile->paintBitmap(); 72 m_tile->setRepaintPending(false); 73 m_tile = 0; 74 } 75 } 76 77 int PaintTileOperation::priority() 78 { 79 if (!m_tile) 80 return -1; 81 82 int priority = 200000; 83 84 // if scrolling, prioritize the prefetch page, otherwise deprioritize 85 TiledPage* page = m_tile->page(); 86 if (page && page->isPrefetchPage()) { 87 if (page->glWebViewState()->isScrolling()) 88 priority = 0; 89 else 90 priority = 400000; 91 } 92 93 // prioritize higher draw count 94 unsigned long long currentDraw = TilesManager::instance()->getDrawGLCount(); 95 unsigned long long drawDelta = currentDraw - m_tile->drawCount(); 96 priority += 100000 * (int)std::min(drawDelta, (unsigned long long)1000); 97 98 // prioritize unpainted tiles, within the same drawCount 99 if (m_tile->frontTexture()) 100 priority += 50000; 101 102 // for base tiles, prioritize based on position 103 if (!m_tile->isLayerTile()) { 104 bool goingDown = m_tile->page()->scrollingDown(); 105 priority += m_tile->x(); 106 107 if (goingDown) 108 priority += 100000 - (1 + m_tile->y()) * 1000; 109 else 110 priority += m_tile->y() * 1000; 111 } 112 113 return priority; 114 } 115 116 } 117