コード例 #1
0
ファイル: meter.cpp プロジェクト: liushuyu/qtau
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);
}
コード例 #2
0
ファイル: CacheSpaceScene.cpp プロジェクト: lexxmark/qt-items
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;
}
コード例 #3
0
ファイル: ImageWidget.cpp プロジェクト: Dukeke/ossim
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;
         }
      }
   }
}