On Fri, Nov 6, 2009 at 10:27 AM, Boudewijn Rempt <boud@valdyas.org> wrote:
On Thursday 05 November 2009, Cyrille Berger wrote:
> Here are two patches to fix DPI in krita for jpeg and png. I would
>  especially need someone to check units. Currently krita is consistant with
>  itself... Would be nice also, if we had the unit of resolution in the UI.
>  (and why do I have to divide by 72 ?)
>

It looks like internally, resolution is expressed as a factor of the KOffice
document resolution, which is 72 dpi. For instance:

QPointF KisImage::documentToPixel(const QPointF &documentCoord) const
{
   return QPointF(documentCoord.x() * xRes(), documentCoord.y() * yRes());
}

And in the dialogs, we show pixels per inch:

KisCustomImageWidget:

   doubleResolution->setValue(72.0 * resolution);
   doubleResolution->setDecimals(0);



I wouldn't say it is right to say that "internal resolution" is X dpi due to unit difference.

Krita works with special points those are neither pixels of the viewport nor pts. One pixel of KisImage has a size. This size is measured in pt's, (pt is a universal units equal to 1/72 inch).

Let's define a KisImage point as "ipx" (image pixel) (note that this "ipx" are not equivalent to a pixel of viewport)

Let's define a viewport pixel as "vpx" that depends on the size of your display (it is calculated using KoDpi in KoZoomHandler)

KoZoomHandler::m_resolution[XY] stores the number of "vpx"es per one pt.

The number of "ipx"es per one pt is defined by the user and depends on the value of KisImage

KisImage::[xy]Res stores the number of a "ipx"es per pt.


                          ipx per inch
[
KisImage::xRes()] =-------------------------
                     pt per inch =const=72


                                    vpx per inch
[
KoZoomHandler::m_resolution[XY]] = -------------------------
                               pt per inch =const=72





JPEG stores it's resolution in DPIs.
      
[dpi]= ipx per inch


 
This means that you have to translate a unit in the denominator of KisImage's resolution from pt's to inches. As this value stands in denominator, you have to do a backward operation:

DPI = INCHES_TO_POINT(
KisImage::xRes());


You can take a look at how it works in:

krita/ui/canvas/kis_prescaled_projection.cc
libs/flake/KoZoomHandler.cc
libs/kobase/KoUnit.h


More than that, you can activate dbgRender kDegug-messages and KisPrescaledProjection will report you all the interesting information about dpis.




--
Dmitry Kazakov