void qtauMeterBar::paintEvent(QPaintEvent *event) { // draw bg int hSt = event->rect().x() + _offset; int barWidth = _ns.note.width() * _ns.notesInBar; int firstBar = hSt / barWidth; int cacheOffset = hSt - firstBar * barWidth; QRect screenRect(event->rect()); QRect cacheRect(screenRect); cacheRect.moveLeft(cacheRect.x() + cacheOffset); QPainter p(this); p.drawPixmap(screenRect, *_bgCache, cacheRect); // draw bar numbers if (cacheOffset != 0) firstBar++; // now it's first visible bar line int lastBar = (hSt + event->rect().width()) / barWidth; QVector<QPainter::PixmapFragment> cachedLabels; int barScreenOffset = firstBar * barWidth - _offset; for (int i = firstBar; i <= lastBar; ++i, barScreenOffset += barWidth) cachedLabels.append(QPainter::PixmapFragment::create( QPointF(barScreenOffset + c_lblcache_hoff, c_lblcache_voff), QRectF(0, i * c_lblcache_line_height, c_lblcache_line_width, c_lblcache_line_height))); if (!cachedLabels.isEmpty()) p.drawPixmapFragments(cachedLabels.data(), cachedLabels.size(), *_labelCache); }
void CacheSpaceScene::validateItemsCacheImpl() const { Q_ASSERT(m_itemsCacheInvalid); if (m_scene->count() == 0) { clearItemsCache(); m_itemsCacheInvalid = false; return; } auto_value<bool> inUse(m_cacheIsInUse, true); QRect cacheRect(scrollOffset(), window().size()); QPoint origin = originPos(); int count = m_scene->count(); auto it = m_items.begin(); QVector<SharedPtr<CacheItem>> newItems; for (int id(0); id < count; ++id) { if (!cacheRect.intersects(m_scene->itemRect(ID(id)))) continue; SharedPtr<CacheItem> newItem; while ((it != m_items.end()) && (index((*it)->id) <= id)) { if (index((*it)->id) == id) { (*it)->correctRectangles(m_scrollDelta); newItem = *it; break; } ++it; } if (newItem.isNull()) { newItem = createCacheItem(ID(id)); // correct rectangle newItem->rect.translate(origin); } newItems.append(newItem); } m_items.swap(newItems); // clear offset m_scrollDelta = QPoint(0, 0); m_sizeDelta = QSize(0, 0); // mark items as valid m_itemsCacheInvalid = false; }
void ossimGui::ImageWidgetJob::start() { if(m_inputSource.valid()) { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_imageWidgetJobMutex); QTime start = QTime::currentTime(); ossimDrect cacheRect(m_tileCache->getRect()); // ossimDpt ulCachePt = cacheRect.ul(); ossimIrect rect; ossimDpt ul; // Because the cache rect is a sub rect of the scroll we need the upper left which starts at offset 0,0 in scroll space m_cacheToView.map(0.0, 0.0, &ul.x, &ul.y); while(m_tileCache->nextInvalidTile(rect) && (!isCanceled())) { // shift to zero based rectangle and then set back for opying purposes. ossimRefPtr<ossimImageData> data =m_inputSource->getTile(rect+ul); data->setImageRectangle(rect); ossimGui::Image img(data.get()); if(data.valid()) { m_tileCache->addTile(ossimGui::Image(data.get(), true)); } else { img = QImage(rect.width(), rect.height(), QImage::Format_RGB32); img.fill(0); img.setOffset(QPoint(rect.ul().x, rect.ul().y)); m_tileCache->addTile(img); } QTime end = QTime::currentTime(); if(start.msecsTo(end) >= m_maxProcessingTime) { break; } } } }