static QSize getImageSize(QTextDocument *doc, const QTextImageFormat &format) { QImage image; const bool hasWidth = format.hasProperty(QTextFormat::ImageWidth); const int width = qRound(format.width()); const bool hasHeight = format.hasProperty(QTextFormat::ImageHeight); const int height = qRound(format.height()); QSize size(width, height); if (!hasWidth || !hasHeight) { image = getImage(doc, format); if (!hasWidth) size.setWidth(image.width() / image.devicePixelRatio()); if (!hasHeight) size.setHeight(image.height() / image.devicePixelRatio()); } qreal scale = 1.0; QPaintDevice *pdev = doc->documentLayout()->paintDevice(); if (pdev) { if (image.isNull()) image = getImage(doc, format); if (!image.isNull()) scale = qreal(pdev->logicalDpiY()) / qreal(qt_defaultDpi()); } size *= scale; return size; }
/*! \internal A helper function to blend two images. The result consists of ((alpha)*startImage) + ((1-alpha)*endImage) */ static QImage blendedImage(const QImage &start, const QImage &end, float alpha) { if (start.isNull() || end.isNull()) return QImage(); QImage blended; const int a = qRound(alpha*256); const int ia = 256 - a; const int sw = start.width(); const int sh = start.height(); const int bpl = start.bytesPerLine(); switch (start.depth()) { case 32: { blended = QImage(sw, sh, start.format()); blended.setDevicePixelRatio(start.devicePixelRatio()); uchar *mixed_data = blended.bits(); const uchar *back_data = start.bits(); const uchar *front_data = end.bits(); for (int sy = 0; sy < sh; sy++) { quint32* mixed = (quint32*)mixed_data; const quint32* back = (const quint32*)back_data; const quint32* front = (const quint32*)front_data; for (int sx = 0; sx < sw; sx++) { quint32 bp = back[sx]; quint32 fp = front[sx]; mixed[sx] = qRgba ((qRed(bp)*ia + qRed(fp)*a)>>8, (qGreen(bp)*ia + qGreen(fp)*a)>>8, (qBlue(bp)*ia + qBlue(fp)*a)>>8, (qAlpha(bp)*ia + qAlpha(fp)*a)>>8); } mixed_data += bpl; back_data += bpl; front_data += bpl; } } default: break; } return blended; }
/*! Initialize \a option with the values using the index \a index. This method is useful for subclasses when they need a QStyleOptionViewItem, but don't want to fill in all the information themselves. \sa QStyleOption::initFrom() */ void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const { QVariant value = index.data(Qt::FontRole); if (value.isValid() && !value.isNull()) { option->font = qvariant_cast<QFont>(value).resolve(option->font); option->fontMetrics = QFontMetrics(option->font); } value = index.data(Qt::TextAlignmentRole); if (value.isValid() && !value.isNull()) option->displayAlignment = Qt::Alignment(value.toInt()); value = index.data(Qt::ForegroundRole); if (value.canConvert<QBrush>()) option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value)); option->index = index; value = index.data(Qt::CheckStateRole); if (value.isValid() && !value.isNull()) { option->features |= QStyleOptionViewItem::HasCheckIndicator; option->checkState = static_cast<Qt::CheckState>(value.toInt()); } value = index.data(Qt::DecorationRole); if (value.isValid() && !value.isNull()) { option->features |= QStyleOptionViewItem::HasDecoration; switch (value.type()) { case QVariant::Icon: { option->icon = qvariant_cast<QIcon>(value); QIcon::Mode mode; if (!(option->state & QStyle::State_Enabled)) mode = QIcon::Disabled; else if (option->state & QStyle::State_Selected) mode = QIcon::Selected; else mode = QIcon::Normal; QIcon::State state = option->state & QStyle::State_Open ? QIcon::On : QIcon::Off; QSize actualSize = option->icon.actualSize(option->decorationSize, mode, state); // For highdpi icons actualSize might be larger than decorationSize, which we don't want. Clamp it to decorationSize. option->decorationSize = QSize(qMin(option->decorationSize.width(), actualSize.width()), qMin(option->decorationSize.height(), actualSize.height())); break; } case QVariant::Color: { QPixmap pixmap(option->decorationSize); pixmap.fill(qvariant_cast<QColor>(value)); option->icon = QIcon(pixmap); break; } case QVariant::Image: { QImage image = qvariant_cast<QImage>(value); option->icon = QIcon(QPixmap::fromImage(image)); option->decorationSize = image.size() / image.devicePixelRatio(); break; } case QVariant::Pixmap: { QPixmap pixmap = qvariant_cast<QPixmap>(value); option->icon = QIcon(pixmap); option->decorationSize = pixmap.size() / pixmap.devicePixelRatio(); break; } default: break; } } value = index.data(Qt::DisplayRole); if (value.isValid() && !value.isNull()) { option->features |= QStyleOptionViewItem::HasDisplay; option->text = displayText(value, option->locale); } option->backgroundBrush = qvariant_cast<QBrush>(index.data(Qt::BackgroundRole)); // disable style animations for checkboxes etc. within itemviews (QTBUG-30146) option->styleObject = 0; }
void QRasterPlatformPixmap::createPixmapForImage(QImage &sourceImage, Qt::ImageConversionFlags flags, bool inPlace) { QImage::Format format; if (flags & Qt::NoFormatConversion) format = sourceImage.format(); else if (pixelType() == BitmapType) { format = QImage::Format_MonoLSB; } else { if (sourceImage.depth() == 1) { format = sourceImage.hasAlphaChannel() ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; } else { QImage::Format opaqueFormat = QNativeImage::systemFormat(); QImage::Format alphaFormat = QImage::Format_ARGB32_Premultiplied; #if !defined(__ARM_NEON__) && !defined(__SSE2__) switch (opaqueFormat) { case QImage::Format_RGB16: alphaFormat = QImage::Format_ARGB8565_Premultiplied; break; default: // We don't care about the others... break; } #endif if (!sourceImage.hasAlphaChannel()) { format = opaqueFormat; } else if ((flags & Qt::NoOpaqueDetection) == 0 && !const_cast<QImage &>(sourceImage).data_ptr()->checkForAlphaPixels()) { format = opaqueFormat; } else { format = alphaFormat; } } } // image has alpha format but is really opaque, so try to do a // more efficient conversion if (format == QImage::Format_RGB32 && (sourceImage.format() == QImage::Format_ARGB32 || sourceImage.format() == QImage::Format_ARGB32_Premultiplied)) { image = sourceImage; if (!inPlace) image.detach(); if (image.d) image.d->format = QImage::Format_RGB32; } else if (inPlace && sourceImage.d->convertInPlace(format, flags)) { image = sourceImage; } else { image = sourceImage.convertToFormat(format); } if (image.d) { w = image.d->width; h = image.d->height; d = image.d->depth; } else { w = h = d = 0; } is_null = (w <= 0 || h <= 0); image.d->devicePixelRatio = sourceImage.devicePixelRatio(); //ensure the pixmap and the image resulting from toImage() have the same cacheKey(); setSerialNumber(image.cacheKey() >> 32); setDetachNumber(image.d->detach_no); }
void QPaintEngineEx::drawImage(const QPointF &pos, const QImage &image) { drawImage(QRectF(pos, image.size() / image.devicePixelRatio()), image, image.rect()); }