Home | History | Annotate | Download | only in android
      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