/// Get a surface by location
AdobeSurfacePtr AdobeMemController::getSurface(const AdobeLocationPtr & loc)
{
    QString page_position = loc->getBookmark();
    CacheIter iter = cache_.find( page_position );
    if (iter != cache_.end())
    {
        return iter.value();
    }
    return AdobeSurfacePtr();
}
/// Recalculate length of all pages.
/// The total length won't be updated unless calling this function
void AdobeMemController::recalcTotalLength()
{
    total_length_ = 0;
    CacheIter begin = cache_.begin();
    CacheIter end   = cache_.end();
    CacheIter iter  = begin;
    for(; iter != end; ++iter)
    {
        total_length_ += iter.value()->length();
    }
}
/// Get a DjVu Page by page number
DjVuPagePtr DjvuPageManager::getPage(int page_num)
{
    CacheIter iter = cache_.find( page_num );
    if (iter != cache_.end())
    {
        return iter.value();
    }
    DjVuPagePtr page(new DjVuPage(page_num));
    cache_[page_num] = page;
    return page;
}
/// Recalculate length of all pages.
/// The total length won't be updated unless calling this function
void DjvuPageManager::recalcTotalLength()
{
    total_length_ = 0;
    CacheIter begin = cache_.begin();
    CacheIter end   = cache_.end();
    CacheIter iter  = begin;
    for(; iter != end; ++iter)
    {
        total_length_ += iter.value()->imageLength();
    }
}
/// Remove a surface for given location
bool AdobeMemController::removeSurface( const AdobeLocationPtr & loc )
{
    // remove the surface with lowest priority based on the remove strategy
    CacheIter begin       = cache_.begin();
    CacheIter end         = cache_.end();
    CacheIter iter        = begin;
    CacheIter remove_iter = iter;
    int ret = 0;
    while( iter != end )
    {
        ret = AdobeSurface::comparePriority( iter.value().get(),
                                             remove_iter.value().get(),
                                             &policy_ );
        if (ret < 0)
        {
            remove_iter = iter;
        }
        iter++;
    }

    if ( remove_iter == cache_.end() )
    {
        return false;
    }

    AdobeSurfacePtr surface = getSurface( loc );
    if ( surface != 0 && surface == remove_iter.value() )
    {
        // if it is the same surface, return
        return false;
    }

    total_length_ -= remove_iter.value()->length();

    // remove the bitmap and other records, reset the status at the time
    qDebug( "Remove Page:%p", remove_iter.value().get() );
    cache_.erase( remove_iter );
    return true;
}
/// Remove a surface for given location
bool DjvuPageManager::clearImage( int page_num )
{
    // remove the surface with lowest priority based on the remove strategy
    CacheIter begin       = cache_.begin();
    CacheIter end         = cache_.end();
    CacheIter iter        = begin;
    CacheIter remove_iter = iter;
    int ret = 0;
    while( iter != end )
    {
        ret = comparePriority( iter.value(), remove_iter.value(), &policy_ );
        if (ret < 0)
        {
            remove_iter = iter;
        }
        iter++;
    }

    if ( remove_iter == cache_.end() )
    {
        return false;
    }

    DjVuPagePtr page = getPage( page_num );
    if ( page != 0 && page == remove_iter.value() )
    {
        // if it is the same surface, return
        return false;
    }

    total_length_ -= remove_iter.value()->imageLength();

    // remove the bitmap and other records, reset the status at the time
    qDebug( "Remove Page:%p", remove_iter.value().get() );
    remove_iter.value()->clearImage();
    return true;
}
Exemple #7
0
QVariant DatabaseModel::data(const QModelIndex &index, int role) const
{
    if (index.row() < db_->count()
        && index.column() < columnTags_.size())
    {
        const int i = index.row();

        if (role == Qt::DisplayRole)
        {
            // return row index number
            if (index.column() == 0)
                return i + 1;

            // return a game value
            else
            {
                // lookup cache
                Hash cachepos = ((Hash)i<<MAX_COLUMNS_SHIFT) | (Hash)index.column();
                CacheIter c = cache_.find(cachepos);
                // return cached value
                if (c != cache_.end())
                    return c.value();

                // -- get info first time --

                // read game-header-info
                Game game;
                db_->loadGameHeaders(i, game);
                QString tag = game.tag(columnTags_.at(index.column()));

                // construct a variant
                QVariant ret;
                if (tag == "?")
                    // unknown
                    ret.setValue( QString("") );
                else
                {
                    bool ok;
                    // return as specific type?
                    { float num = tag.toFloat(&ok); if (ok) ret.setValue( num ); }
                    if (!ok) { int num = tag.toInt(&ok); if (ok) ret.setValue( num ); }
                    // return as string
                    if (!ok) ret.setValue( tag );
                }

                // store in cache
                cache_.insert(cachepos, ret);

                return ret;
            }
        }
        else if (role == Qt::FontRole)
        {
            if (db_->deleted(i))
            {
                QFont font;
                font.setStrikeOut(true);
                return font;
            }
        }
        else if (role == Qt::ForegroundRole)
        {
            if (!db_->getValidFlag(i))
            {
                return QVariant(QColor(Qt::red));
            }
            else
            if (db_->deleted(i))
                return QVariant(QColor(Qt::gray));

            return QVariant(QColor(Qt::black));
        }
    }
    return QVariant();
}