[Development] Proposal: Make QPen non-cosmetic by default

Samuel Rødal samuel.rodal at digia.com
Wed Oct 17 10:11:53 CEST 2012


On 10/11/2012 02:22 PM, Sorvig Morten wrote:
>
> On Oct 11, 2012, at 10:58 AM, Bache-Wiig Jens <Jens.Bache-Wiig at digia.com> wrote:
>>
>> I have personally never seen an actual use case where a cosmetic pen makes sense, but  I assume there are reasons for having i so anyone creating an explicit QPen(Qt::black, 0.0) should get a 1.0 pixel thick line regardless of scaling.
>
> I agree in general. I'm wondering if a 2 pixel-wide line for  QPen(Qt::black, 0.0) would be a better option in high-dpi mode - the user is expecting to "fill" one point. The result will look like a scaled pixmap, but won't have gaps.
>
> Morten

You mean a 1 "logical" pixel-wide line? ;)

But yeah, agreed, for high-dpi mode it will make sense that everything 
gets scaled by 2x2, both cosmetic and geometric lines, for the sake of 
consistency.

"The result will look like a scaled pixmap" - well, an antialiased non 
axis aligned line will still look sharp, unlike a scaled pixmap.

"but won't have gaps", that depends, if you're mixing line drawing and 
rectangle filling you might have gaps.

Example:

painter->setPen(Qt::black);
painter->drawLine(0, 0, 10, 0);
painter->fillRect(0, 1, 10, 1, Qt::black);

Since lines and other outlines are centered on the pixel grid lines 
instead of in the pixel centers, if you scale this by 2x2 you will get 
the line filling the device rectangle starting at QPoint(0, -1) with a 
size QSize(20, 2), whereas the rect fills the device rectangle starting 
at QPoint(0, 2) with a size QSize(20, 2).

Thus, there would be a one pixel horizontal gap starting at QPoint(0, 1) 
with size QSize(20, 1). If the line is clipped by the widget it will 
visibly only be one pixel high, whereas the rectangle will be two pixels 
high.

This way of mixing line drawing and filling in style code is therefore 
pretty evil, but unfortunately we do it in a lot of places. Most 
drawLine() calls in the style should really be replaced with calls to 
fillRect().

That's the curse of the 0.5 pixel offset between fills and strokes, and 
not writing the style code with scalability in mind.

--
Samuel



More information about the Development mailing list