QImage QwtPlotRasterItem::compose( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &imageArea, const QRectF &paintRect, const QSize &imageSize, bool doCache) const { QImage image; if ( imageArea.isEmpty() || paintRect.isEmpty() || imageSize.isEmpty() ) return image; if ( doCache ) { if ( !d_data->cache.image.isNull() && d_data->cache.area == imageArea && d_data->cache.size == paintRect.size() ) { image = d_data->cache.image; } } if ( image.isNull() ) { double dx = 0.0; if ( paintRect.toRect().width() > imageSize.width() ) dx = imageArea.width() / imageSize.width(); const QwtScaleMap xxMap = imageMap(Qt::Horizontal, xMap, imageArea, imageSize, dx); double dy = 0.0; if ( paintRect.toRect().height() > imageSize.height() ) dy = imageArea.height() / imageSize.height(); const QwtScaleMap yyMap = imageMap(Qt::Vertical, yMap, imageArea, imageSize, dy); image = renderImage( xxMap, yyMap, imageArea, imageSize ); if ( doCache ) { d_data->cache.area = imageArea; d_data->cache.size = paintRect.size(); d_data->cache.image = image; } } if ( d_data->alpha >= 0 && d_data->alpha < 255 ) image = toRgba( image, d_data->alpha ); return image; }
void pListView::setImage(unsigned selection, unsigned position, const image& image) { //assign existing image for(unsigned n = 0; n < images.size(); n++) { if(images[n] == image) { imageMap(selection)(position) = n; return ListView_SetImage(hwnd, imageList, selection, position, n); } } //append and assign new image imageMap(selection)(position) = images.size(); images.append(image); ImageList_Append(imageList, image, 15); ListView_SetImage(hwnd, imageList, selection, position, imageMap(selection)(position)); }
void pListView::buildImageList() { auto& list = listView.state.image; unsigned columns = listView.state.text.size(); unsigned rows = max(1u, listView.state.headerText.size()); ListView_SetImageList(hwnd, NULL, LVSIL_SMALL); if(imageList) ImageList_Destroy(imageList); imageList = ImageList_Create(15, 15, ILC_COLOR32, 1, 0); imageMap.reset(); images.reset(); images.append(nall::image()); //empty icon for cells without an image assigned (I_IMAGENONE does not work) //create a vector of unique images from all images used (many cells may use the same image) for(unsigned y = 0; y < list.size(); y++) { for(unsigned x = 0; x < list[y].size(); x++) { bool found = false; for(unsigned z = 0; z < images.size(); z++) { if(list[y][x] == images[z]) { found = true; imageMap(y)(x) = z; break; } } if(found == false) { imageMap(y)(x) = images.size(); images.append(list[y][x]); } } } //build image list for(auto& imageItem : images) ImageList_Append(imageList, imageItem, 15); if(images.size() <= 1) return; //set images for all cells for(unsigned y = 0; y < columns; y++) { for(unsigned x = 0; x < rows; x++) { ListView_SetImage(hwnd, imageList, y, x, imageMap(y)(x)); } } }
QImage QwtPlotRasterItem::compose( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &imageArea, const QRectF &paintRect, const QSize &imageSize, bool doCache) const { QImage image; if ( imageArea.isEmpty() || paintRect.isEmpty() || imageSize.isEmpty() ) return image; if ( doCache ) { if ( !d_data->cache.image.isNull() && d_data->cache.area == imageArea && d_data->cache.size == paintRect.size() ) { image = d_data->cache.image; } } if ( image.isNull() ) { double dx = 0.0; if ( paintRect.toRect().width() > imageSize.width() ) dx = imageArea.width() / imageSize.width(); const QwtScaleMap xxMap = imageMap(Qt::Horizontal, xMap, imageArea, imageSize, dx); double dy = 0.0; if ( paintRect.toRect().height() > imageSize.height() ) dy = imageArea.height() / imageSize.height(); const QwtScaleMap yyMap = imageMap(Qt::Vertical, yMap, imageArea, imageSize, dy); image = renderImage( xxMap, yyMap, imageArea, imageSize ); if ( doCache ) { d_data->cache.area = imageArea; d_data->cache.size = paintRect.size(); d_data->cache.image = image; } } if ( d_data->alpha >= 0 && d_data->alpha < 255 ) { QImage alphaImage( image.size(), QImage::Format_ARGB32 ); #if QT_VERSION >= 0x040400 && !defined(QT_NO_QFUTURE) uint numThreads = renderThreadCount(); if ( numThreads <= 0 ) numThreads = QThread::idealThreadCount(); if ( numThreads <= 0 ) numThreads = 1; const int numRows = image.height() / numThreads; QList< QFuture<void> > futures; for ( uint i = 0; i < numThreads; i++ ) { QRect tile( 0, i * numRows, image.width(), numRows ); if ( i == numThreads - 1 ) { tile.setHeight( image.height() - i * numRows ); qwtToRgba( &image, &alphaImage, tile, d_data->alpha ); } else { futures += QtConcurrent::run( &qwtToRgba, &image, &alphaImage, tile, d_data->alpha ); } } for ( int i = 0; i < futures.size(); i++ ) futures[i].waitForFinished(); #else const QRect tile( 0, 0, image.width(), image.height() ); qwtToRgba( &image, &alphaImage, tile, d_data->alpha ); #endif image = alphaImage; } return image; }