1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
From 807ac77061604c2ac7cf84b0a0b29dd949a6c634 Mon Sep 17 00:00:00 2001
From: "Martin T. H. Sandsmark" <martin.sandsmark@kde.org>
Date: Thu, 6 Dec 2018 10:02:41 -0500
Subject: fix drawing box chars, avoid storing and saving state all the time
Summary:
to get the box chars to be drawn correctly we need to turn on high
quality antialiasing in qpainter. in addition only turn it on if
antialiasing is enabled.
lastly qpainter.save()/restore() is called very often, so try to avoid
that if it isn't necessary.
BUG: 401463
Test Plan:
`cat tests/boxes.txt`
old:
{F6428268}
new:
{F6450304}
Reviewers: #konsole, hindenburg
Reviewed By: #konsole, hindenburg
Subscribers: wbauer, konsole-devel, #konsole
Tags: #konsole
Differential Revision: https://phabricator.kde.org/D16947
(cherry picked from commit 14b3c8be2c15ed9711b1308b4a991de4aad5802d)
---
src/TerminalDisplay.cpp | 45 ++++++++++++++++++++-------------------------
1 file changed, 20 insertions(+), 25 deletions(-)
diff --git a/src/TerminalDisplay.cpp b/src/TerminalDisplay.cpp
index 722e200..2b14556 100644
--- a/src/TerminalDisplay.cpp
+++ b/src/TerminalDisplay.cpp
@@ -619,7 +619,7 @@ static void drawLineChar(QPainter& paint, int x, int y, int w, int h, uchar code
{
//Calculate cell midpoints, end points.
const int cx = x + w / 2;
- const int cy = y + h / 2;
+ const int cy = y + h / 2. - 0.5;
const int ex = x + w - 1;
const int ey = y + h - 1;
@@ -671,33 +671,33 @@ static void drawLineChar(QPainter& paint, int x, int y, int w, int h, uchar code
//Intersection points.
if ((toDraw & Int11) != 0u) {
- paint.drawPoint(cx - 1, cy - 1);
+ paint.drawPoint(cx - 2, cy - 2);
}
if ((toDraw & Int12) != 0u) {
- paint.drawPoint(cx, cy - 1);
+ paint.drawPoint(cx - 1, cy - 2);
}
if ((toDraw & Int13) != 0u) {
- paint.drawPoint(cx + 1, cy - 1);
+ paint.drawPoint(cx - 0, cy - 2);
}
if ((toDraw & Int21) != 0u) {
- paint.drawPoint(cx - 1, cy);
+ paint.drawPoint(cx - 2, cy - 1);
}
if ((toDraw & Int22) != 0u) {
- paint.drawPoint(cx, cy);
+ paint.drawPoint(cx - 1, cy - 1);
}
if ((toDraw & Int23) != 0u) {
- paint.drawPoint(cx + 1, cy);
+ paint.drawPoint(cx - 0, cy - 1);
}
if ((toDraw & Int31) != 0u) {
- paint.drawPoint(cx - 1, cy + 1);
+ paint.drawPoint(cx - 2, cy);
}
if ((toDraw & Int32) != 0u) {
- paint.drawPoint(cx, cy + 1);
+ paint.drawPoint(cx - 1, cy);
}
if ((toDraw & Int33) != 0u) {
- paint.drawPoint(cx + 1, cy + 1);
+ paint.drawPoint(cx - 0, cy);
}
}
@@ -705,7 +705,7 @@ static void drawOtherChar(QPainter& paint, int x, int y, int w, int h, uchar cod
{
//Calculate cell midpoints, end points.
const int cx = x + w / 2;
- const int cy = y + h / 2;
+ const int cy = y + h / 2. - 0.5; // Compensate for the translation, to match fonts
const int ex = x + w - 1;
const int ey = y + h - 1;
@@ -792,16 +792,17 @@ void TerminalDisplay::drawLineCharString(QPainter& painter, int x, int y, const
const Character* attributes)
{
painter.save();
- painter.setRenderHint(QPainter::Antialiasing);
- const QPen& originalPen = painter.pen();
+ // For antialiasing, we need to shift it so the single pixel width is in the middle
+ painter.translate(0.5, 0.5);
if (((attributes->rendition & RE_BOLD) != 0) && _boldIntense) {
- QPen boldPen(originalPen);
- boldPen.setWidth(3);
+ QPen boldPen(painter.pen());
+ boldPen.setWidth(4);
painter.setPen(boldPen);
}
+
for (int i = 0 ; i < str.length(); i++) {
const uchar code = str[i].cell();
if (LineChars[code] != 0u) {
@@ -909,10 +910,10 @@ void TerminalDisplay::drawBackground(QPainter& painter, const QRect& rect, const
QColor color(backgroundColor);
color.setAlpha(qAlpha(_blendColor));
- painter.save();
+ const QPainter::CompositionMode originalMode = painter.compositionMode();
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(rect, color);
- painter.restore();
+ painter.setCompositionMode(originalMode);
#endif
} else {
painter.fillRect(rect, backgroundColor);
@@ -1041,8 +1042,6 @@ void TerminalDisplay::drawTextFragment(QPainter& painter ,
const QString& text,
const Character* style)
{
- painter.save();
-
// setup painter
const QColor foregroundColor = style->foregroundColor.color(_colorTable);
const QColor backgroundColor = style->backgroundColor.color(_colorTable);
@@ -1062,8 +1061,6 @@ void TerminalDisplay::drawTextFragment(QPainter& painter ,
// draw text
drawCharacters(painter, rect, text, style, invertCharacterColor);
-
- painter.restore();
}
void TerminalDisplay::drawPrinterFriendlyTextFragment(QPainter& painter,
@@ -1071,8 +1068,6 @@ void TerminalDisplay::drawPrinterFriendlyTextFragment(QPainter& painter,
const QString& text,
const Character* style)
{
- painter.save();
-
// Set the colors used to draw to black foreground and white
// background for printer friendly output when printing
Character print_style = *style;
@@ -1081,8 +1076,6 @@ void TerminalDisplay::drawPrinterFriendlyTextFragment(QPainter& painter,
// draw text
drawCharacters(painter, rect, text, &print_style, false);
-
- painter.restore();
}
void TerminalDisplay::setRandomSeed(uint randomSeed)
@@ -1499,6 +1492,8 @@ void TerminalDisplay::paintEvent(QPaintEvent* pe)
drawBackground(paint, rect, getBackgroundColor(), true /* use opacity setting */);
}
+ paint.setRenderHint(QPainter::Antialiasing, _antialiasText);
+
foreach(const QRect & rect, dirtyImageRegion.rects()) {
drawContents(paint, rect);
}
--
cgit v1.1
|