On Tuesday 09 October 2012 14:29:39 Pritam wrote: > On Tuesday 09 October 2012 02:07 PM, Sorvig Morten wrote: > > While preparing an upcoming blog entry I've collected some best practices > > regarding raster graphics (QImage and QPixmap). These apply to internal > > Qt development as well. The patch is still pending so they are open for > > discussion. > > > > (I use image and pixmap interchangeably here, most points apply to both) > > > > * Start by providing high-resolution artwork. You can provide 2x versions > > only and let Qt scale them down, or for best performance and image > > quality provide pre-scaled or hand-made 1x and 2x versions. > > > > * Set the QT_HIDPI_AWARE environment variable. (Changes the behaviour of > > QIcon::pixmap) > > > > • Use QIcon to manage the artwork versions. Use QIcon::pixmap(QWindow, > > QSize) to get an appropriate pixmap for a given window and point size. If > > you don’t know which window you are targeting you can use > > QIcon::pixmap(QSize), which will work correctly on single-display systems > > and and use the “best” display on multiple-display systems.
But QSize is already the size in pixel. Or do you mean that QIcon::pixmap could return a pixmap that is larger than the given QSize, scaled with some magic heuristics. That is not really intuitive. (and violate the current documentation) > > • Alternatively, manage the versions yourself. Set a dpi scale factor of 2 > > on the high-dpi version, either by appending "@2x" to the file name or by > > calling QImage::setDpiScaleFactor(2) yourself. Use > > QWindow::dpiScaleFactor() or qApp->dpiScaleFactor() to get the target > > scale factor. > > > > * Don’t scale pixmaps to specific pixel sizes unless you know what you are > > doing.> > > * Don’t use pixmap sizes directly in layout calculations. Divide by the pixmap scale factor: > > QSize pointSze = pixmap.size() / pixmap.dpiScaleFactor(); > > > > * QPainter::drawPixmap(QPoint, ...) works correctly with high-dpi pixmaps > > if the dpi scale factor is set, that is pixmaps from QIcon::pixmap(), > > pixmaps loaded from “@2x” files, or pixmaps where you call > > setDpiScaleFactor(). > > > > * QPainter::drawPixmap(QRect, ...) works correctly for all pixmaps and > > will draw high-dpi content if the source pixmap provides enough pixels. > > If you calculate the rect from the pixmap remember to use > > dpiScaleFactor() as above. > > > > * 2x pixmaps on a 2x high-dpi display is an optimized case in the raster > > paint engine, similar to 1x pixmaps on “standard” displays. > > > > * Most Qt API is in points (even QStyle::PixelMetric). The main exception > > is image and pixmap geometry, which is in pixels. > Forgive my ignorance, but I didn't understand. AFAIK most of Qt API is > in pixels. Do you mean after this patch, one should treat all API as points? I share the same question. > > Next on my agenda is high-dpi OpenGL, scene graph and Qt Quick. -- Olivier Woboq - Qt services and support - http://woboq.com _______________________________________________ Development mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/development
