/// 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; }
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(); }