File: qwt__painter_8cpp-source.html

package info (click to toggle)
libqwt 4.2.0-4.1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 9,832 kB
  • ctags: 5,512
  • sloc: cpp: 22,973; ansic: 244; makefile: 66
file content (554 lines) | stat: -rw-r--r-- 33,651 bytes parent folder | download | duplicates (5)
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Qwt User&apos;s Guide: qwt_painter.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.8 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<h1>qwt_painter.cpp</h1><pre class="fragment"><div>00001 <span class="comment">/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************</span>
00002 <span class="comment"> * Qwt Widget Library</span>
00003 <span class="comment"> * Copyright (C) 1997   Josef Wilgen</span>
00004 <span class="comment"> * Copyright (C) 2002   Uwe Rathmann</span>
00005 <span class="comment"> *</span>
00006 <span class="comment"> * This library is free software; you can redistribute it and/or</span>
00007 <span class="comment"> * modify it under the terms of the Qwt License, Version 1.0</span>
00008 <span class="comment"> *****************************************************************************/</span>
00009 
00010 <span class="comment">// vim: expandtab</span>
00011 
00012 <span class="preprocessor">#include &lt;qwindowdefs.h&gt;</span>
00013 <span class="preprocessor">#include &lt;qrect.h&gt;</span>
00014 <span class="preprocessor">#include &lt;qpainter.h&gt;</span>
00015 <span class="preprocessor">#include &lt;qpalette.h&gt;</span>
00016 <span class="preprocessor">#include &lt;qpaintdevice.h&gt;</span>
00017 <span class="preprocessor">#include &lt;qpaintdevicemetrics.h&gt;</span>
00018 <span class="preprocessor">#include &lt;qpixmap.h&gt;</span>
00019 <span class="preprocessor">#include &lt;qsimplerichtext.h&gt;</span>
00020 
00021 <span class="preprocessor">#include "qwt_painter.h"</span>
00022 <span class="preprocessor">#include "qwt_rect.h"</span>
00023 <span class="preprocessor">#include "<a class="code" href="qwt__math_8h.html">qwt_math.h</a>"</span>
00024 
00025 <span class="preprocessor">#if defined(Q_WS_X11)</span>
00026 <span class="preprocessor"></span><span class="keywordtype">bool</span> QwtPainter::d_deviceClipping = TRUE;
00027 <span class="preprocessor">#else</span>
00028 <span class="preprocessor"></span><span class="keywordtype">bool</span> QwtPainter::d_deviceClipping = FALSE;
00029 <span class="preprocessor">#endif</span>
00030 <span class="preprocessor"></span>
00031 QwtMetricsMap QwtPainter::d_metricsMap;
00032 
00033 <span class="preprocessor">#if defined(QWT_BROKEN_RASTEROP_FONT)</span>
00034 <span class="preprocessor"></span><span class="preprocessor">#if QT_VERSION &lt; 300</span>
00035 <span class="preprocessor"></span><span class="comment">// QwtPainter::textFontSubstitutionMode does not exist for Qt-2.3.</span>
00036 
00037 <span class="comment">// Calling qt_use_xft() from Qt-2.3 internals gives a segmentation error,</span>
00038 <span class="comment">// because qt_use_xft() requires presumably an open X display.</span>
00039 <span class="comment">// Steal qt_use_xft() but check only the environment variable QT_XFT.</span>
00040 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
00041 <span class="keyword">static</span> <span class="keywordtype">int</span> qwt_use_xft (<span class="keywordtype">void</span>)
00042 {
00043     <span class="keyword">static</span> <span class="keywordtype">int</span>  checked_env=0;
00044     <span class="keyword">static</span> <span class="keywordtype">int</span>  use_xft=0;
00045 
00046     <span class="keywordflow">if</span> (!checked_env) {
00047         <span class="keywordtype">char</span> *e = getenv (<span class="stringliteral">"QT_XFT"</span>);
00048         <span class="keywordflow">if</span> ( e &amp;&amp; (*e == <span class="charliteral">'1'</span> ||
00049                    *e == <span class="charliteral">'y'</span> || *e == <span class="charliteral">'Y'</span> ||
00050                    *e == <span class="charliteral">'t'</span> || *e == <span class="charliteral">'T'</span> ))
00051             use_xft = 1;
00052         <span class="keywordflow">else</span>
00053             use_xft = 0;
00054     }
00055     checked_env = 1;
00056 
00057     <span class="keywordflow">return</span> use_xft;
00058 }
00059 <span class="keywordtype">int</span> QwtPainter::d_textXorRopMode = qwt_use_xft() ? 
00060     QwtPainter::XorRopTextKeepFont : QwtPainter::XorRopTextNormal;
00061 <span class="preprocessor">#else // QT_VERSION &gt;= 300</span>
00062 <span class="preprocessor"></span><span class="preprocessor">#if 1</span>
00063 <span class="preprocessor"></span><span class="keywordtype">int</span> QwtPainter::d_textXorRopMode = QwtPainter::XorRopTextKeepFont;
00064 <span class="preprocessor">#else</span>
00065 <span class="preprocessor"></span><span class="keywordtype">int</span> QwtPainter::d_textXorRopMode = QwtPainter::XorRopTextKeepColor;
00066 <span class="preprocessor">#endif</span>
00067 <span class="preprocessor"></span><span class="preprocessor">#endif // QT_VERSION</span>
00068 <span class="preprocessor"></span><span class="preprocessor">#else</span>
00069 <span class="preprocessor"></span><span class="keywordtype">int</span> QwtPainter::d_textXorRopMode = QwtPainter::XorRopTextNormal;
00070 <span class="preprocessor">#endif</span>
00071 <span class="preprocessor"></span>
<a name="l00077"></a><a class="code" href="class_qwt_painter.html#e4">00077</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e4">QwtPainter::setDeviceClipping</a>(<span class="keywordtype">bool</span> enable)
00078 {
00079     d_deviceClipping = enable;
00080 }
00081 
<a name="l00088"></a><a class="code" href="class_qwt_painter.html#e5">00088</a> <span class="keywordtype">bool</span> <a class="code" href="class_qwt_painter.html#e5">QwtPainter::deviceClipping</a>()
00089 {
00090     <span class="keywordflow">return</span> d_deviceClipping;
00091 }
00092 
00097 <span class="keyword">const</span> QRect &amp;QwtPainter::deviceClipRect()
00098 {
00099     <span class="keyword">static</span> QRect clip;
00100 
00101     <span class="keywordflow">if</span> ( !clip.isValid() )
00102     {
00103         clip.setCoords(QWT_COORD_MIN, QWT_COORD_MIN,
00104             QWT_COORD_MAX, QWT_COORD_MAX);
00105     }
00106     <span class="keywordflow">return</span> clip;
00107 }
00108 
<a name="l00117"></a><a class="code" href="class_qwt_painter.html#e0">00117</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e0">QwtPainter::setMetricsMap</a>(<span class="keyword">const</span> QPaintDevice *layout,
00118     <span class="keyword">const</span> QPaintDevice *device)
00119 {
00120     d_metricsMap.setMetrics(layout, device);
00121 }
00122 
<a name="l00127"></a><a class="code" href="class_qwt_painter.html#e1">00127</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e0">QwtPainter::setMetricsMap</a>(<span class="keyword">const</span> QwtMetricsMap &amp;map)
00128 {
00129     d_metricsMap = map;
00130 }
00131 
<a name="l00136"></a><a class="code" href="class_qwt_painter.html#e2">00136</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e2">QwtPainter::resetMetricsMap</a>()
00137 {
00138     d_metricsMap = QwtMetricsMap();
00139 }
00140 
<a name="l00144"></a><a class="code" href="class_qwt_painter.html#e3">00144</a> <span class="keyword">const</span> QwtMetricsMap &amp;<a class="code" href="class_qwt_painter.html#e3">QwtPainter::metricsMap</a>()
00145 {
00146     <span class="keywordflow">return</span> d_metricsMap;
00147 }
00148 
<a name="l00152"></a><a class="code" href="class_qwt_painter.html#e6">00152</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e6">QwtPainter::setClipRect</a>(QPainter *painter, <span class="keyword">const</span> QRect &amp;rect)
00153 {
00154     painter-&gt;setClipRect(d_metricsMap.layoutToDevice(rect, painter));
00155 }
00156 
<a name="l00160"></a><a class="code" href="class_qwt_painter.html#e12">00160</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e12">QwtPainter::drawRect</a>(QPainter *painter, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> w, <span class="keywordtype">int</span> h) 
00161 {
00162     <a class="code" href="class_qwt_painter.html#e12">drawRect</a>(painter, QRect(x, y, w, h));
00163 }
00164 
<a name="l00168"></a><a class="code" href="class_qwt_painter.html#e13">00168</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e12">QwtPainter::drawRect</a>(QPainter *painter, <span class="keyword">const</span> QRect &amp;rect) 
00169 {
00170     <span class="keyword">const</span> QRect r = d_metricsMap.layoutToDevice(rect, painter);
00171 
00172     <span class="keywordflow">if</span> ( d_deviceClipping &amp;&amp; !deviceClipRect().contains(r) )
00173         <span class="keywordflow">return</span>;
00174 
00175     painter-&gt;drawRect(r);
00176 }
00177 
<a name="l00181"></a><a class="code" href="class_qwt_painter.html#e14">00181</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e14">QwtPainter::fillRect</a>(QPainter *painter, 
00182     <span class="keyword">const</span> QRect &amp;rect, <span class="keyword">const</span> QBrush &amp;brush)
00183 {
00184     <span class="keyword">const</span> QRect r = d_metricsMap.layoutToDevice(rect, painter);
00185 
00186     <span class="keywordflow">if</span> ( d_deviceClipping &amp;&amp; !deviceClipRect().contains(r) )
00187         <span class="keywordflow">return</span>;
00188 
00189     painter-&gt;fillRect(r, brush);
00190 }
00191 
<a name="l00195"></a><a class="code" href="class_qwt_painter.html#e15">00195</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e15">QwtPainter::drawEllipse</a>(QPainter *painter, <span class="keyword">const</span> QRect &amp;rect)
00196 {
00197     <span class="keyword">const</span> QRect r = d_metricsMap.layoutToDevice(rect, painter);
00198 
00199     <span class="keywordflow">if</span> ( d_deviceClipping &amp;&amp; !deviceClipRect().contains(rect) )
00200         <span class="keywordflow">return</span>;
00201 
00202     painter-&gt;drawEllipse(r);
00203 }
00204 
<a name="l00208"></a><a class="code" href="class_qwt_painter.html#e7">00208</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e7">QwtPainter::drawText</a>(QPainter *painter, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, 
00209         <span class="keyword">const</span> QString &amp;text, <span class="keywordtype">int</span> len)
00210 {
00211     <a class="code" href="class_qwt_painter.html#e7">drawText</a>(painter, QPoint(x, y), text, len);
00212 }
00213 
<a name="l00217"></a><a class="code" href="class_qwt_painter.html#e8">00217</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e7">QwtPainter::drawText</a>(QPainter *painter, <span class="keyword">const</span> QPoint &amp;pos, 
00218         <span class="keyword">const</span> QString &amp;text, <span class="keywordtype">int</span> len)
00219 {
00220     <span class="keyword">const</span> QPoint p = d_metricsMap.layoutToDevice(pos, painter);
00221 
00222     <span class="keywordflow">if</span> ( d_deviceClipping &amp;&amp; !deviceClipRect().contains(p) )
00223         <span class="keywordflow">return</span>;
00224 
00225 <span class="preprocessor">#if defined(QWT_BROKEN_RASTEROP_FONT)</span>
00226 <span class="preprocessor"></span>    <span class="comment">// XorROP text drawing does not work with xft</span>
00227 <span class="preprocessor">#if QT_VERSION &gt;= 300</span>
00228 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (Qt::XorROP == painter-&gt;rasterOp()
00229         &amp;&amp; d_textXorRopMode == XorRopTextKeepColor)
00230     {
00231         <span class="comment">// step 1: disable xft</span>
00232         <span class="keyword">extern</span> <span class="keywordtype">bool</span> qt_has_xft;
00233         <span class="keyword">const</span> <span class="keywordtype">bool</span> XftEnabled = qt_has_xft;
00234         qt_has_xft = FALSE;
00235 
00236         <span class="comment">// step 2: substitute the font by a bitmap font</span>
00237         painter-&gt;save();
00238         QFont font = painter-&gt;font();
00239         font.setStyleStrategy(QFont::PreferBitmap);
00240         painter-&gt;setFont(font);
00241 
00242         painter-&gt;drawText(p, text, len);
00243 
00244         <span class="comment">// restore state</span>
00245         qt_has_xft = XftEnabled;
00246         painter-&gt;restore();
00247 
00248     }
00249     <span class="keywordflow">else</span>
00250 <span class="preprocessor">#endif</span>
00251 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (Qt::XorROP == painter-&gt;rasterOp()
00252         &amp;&amp; d_textXorRopMode == XorRopTextKeepFont)
00253     {
00254         <span class="comment">// step 1: create a buffer pixmap, but we have to guess its size.</span>
00255 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00256 <span class="preprocessor"></span>        <span class="keywordtype">int</span> flags = Qt::AlignLeft;
00257 <span class="preprocessor">#else</span>
00258 <span class="preprocessor"></span>        <span class="keywordtype">int</span> flags = Qt::AlignAuto; <span class="comment">// OK for QwtScaleDraw, but ???</span>
00259 <span class="preprocessor">#endif </span>
00260 <span class="preprocessor"></span>        QFontMetrics fm = painter-&gt;fontMetrics();
00261         QPixmap pixmap(fm.boundingRect(
00262             0, 0, QCOORD_MAX, QCOORD_MAX, flags, text, len).size());
00263         pixmap.fill(QColor(0, 0, 0));
00264 
00265         <span class="comment">// step 2: draw the text on the pixmap</span>
00266         QPainter pmPainter(&amp;pixmap);
00267         pmPainter.setPen(painter-&gt;pen());
00268         pmPainter.setFont(painter-&gt;font());
00269         pmPainter.drawText(pixmap.rect(), flags, text, len);
00270 
00271         <span class="comment">// step 3: draw the pixmap</span>
00272         painter-&gt;drawPixmap(p.x(), p.y() - fm.ascent(), pixmap);
00273     }
00274     <span class="keywordflow">else</span>
00275 <span class="preprocessor">#endif</span>
00276 <span class="preprocessor"></span>    {
00277         painter-&gt;drawText(p, text, len);
00278     }
00279 }
00280 
<a name="l00284"></a><a class="code" href="class_qwt_painter.html#e9">00284</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e7">QwtPainter::drawText</a>(QPainter *painter, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> w, <span class="keywordtype">int</span> h, 
00285         <span class="keywordtype">int</span> flags, <span class="keyword">const</span> QString &amp;text, <span class="keywordtype">int</span> len)
00286 {
00287     <a class="code" href="class_qwt_painter.html#e7">drawText</a>(painter, QRect(x, y, w, h), flags, text, len);
00288 }
00289 
<a name="l00293"></a><a class="code" href="class_qwt_painter.html#e10">00293</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e7">QwtPainter::drawText</a>(QPainter *painter, <span class="keyword">const</span> QRect &amp;rect, 
00294         <span class="keywordtype">int</span> flags, <span class="keyword">const</span> QString &amp;text, <span class="keywordtype">int</span> len)
00295 {
00296 <span class="preprocessor">#if defined(QWT_BROKEN_RASTEROP_FONT)</span>
00297 <span class="preprocessor"></span>    <span class="comment">// XorROP text drawing does not work with xft</span>
00298 <span class="preprocessor">#if QT_VERSION &gt;= 300</span>
00299 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (Qt::XorROP == painter-&gt;rasterOp()
00300         &amp;&amp; d_textXorRopMode == XorRopTextKeepColor)
00301     {
00302         <span class="comment">// step 1: disable xft</span>
00303         <span class="keyword">extern</span> <span class="keywordtype">bool</span> qt_has_xft;
00304         <span class="keyword">const</span> <span class="keywordtype">bool</span> XftEnabled = qt_has_xft;
00305         qt_has_xft = FALSE;
00306 
00307         <span class="comment">// step 2: substitute the font by a bitmap font</span>
00308         painter-&gt;save();
00309         QFont font = painter-&gt;font();
00310         font.setStyleStrategy(QFont::PreferBitmap);
00311         painter-&gt;setFont(font);
00312 
00313         painter-&gt;drawText(
00314             d_metricsMap.layoutToDevice(rect, painter), flags, text, len);
00315 
00316         <span class="comment">// restore state</span>
00317         painter-&gt;restore();
00318         qt_has_xft = XftEnabled;
00319 
00320     }
00321     <span class="keywordflow">else</span>
00322 <span class="preprocessor">#endif</span>
00323 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (Qt::XorROP == painter-&gt;rasterOp()
00324         &amp;&amp; d_textXorRopMode == XorRopTextKeepFont)
00325     {
00326         <span class="comment">// step 1: create a buffer pixmap</span>
00327         QRect target = d_metricsMap.layoutToDevice(rect, painter);
00328         QPixmap pixmap(target.size());
00329         pixmap.fill(QColor(0, 0, 0));
00330 
00331         <span class="comment">// step 2: draw the text on the pixmap</span>
00332         QPainter pmPainter(&amp;pixmap);
00333         pmPainter.setPen(painter-&gt;pen());
00334         pmPainter.setFont(painter-&gt;font());
00335         pmPainter.drawText(pixmap.rect(), flags, text, len);
00336 
00337         <span class="comment">// step 3: draw the pixmap</span>
00338 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00339 <span class="preprocessor"></span>        painter-&gt;drawPixmap(target.x(), target.y(), pixmap);
00340 <span class="preprocessor">#else</span>
00341 <span class="preprocessor"></span>        painter-&gt;drawPixmap(target, pixmap);
00342 <span class="preprocessor">#endif</span>
00343 <span class="preprocessor"></span>    }
00344     <span class="keywordflow">else</span>
00345 <span class="preprocessor">#endif</span>
00346 <span class="preprocessor"></span>    {
00347         painter-&gt;drawText(
00348             d_metricsMap.layoutToDevice(rect, painter), flags, text, len);
00349     }
00350 }
00351 
00352 <span class="preprocessor">#ifndef QT_NO_RICHTEXT</span>
00353 <span class="preprocessor"></span>
<a name="l00357"></a><a class="code" href="class_qwt_painter.html#e11">00357</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e11">QwtPainter::drawSimpleRichText</a>(QPainter *painter, <span class="keyword">const</span> QRect &amp;rect,
00358     <span class="keywordtype">int</span> flags, QSimpleRichText &amp;text)
00359 {
00360     QColorGroup cg;
00361     cg.setColor(QColorGroup::Text, painter-&gt;pen().color());
00362 
00363 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00364 <span class="preprocessor"></span>    <span class="keyword">const</span> QFont defaultFont = QFont::defaultFont();
00365     QFont::setDefaultFont(painter-&gt;font());
00366 <span class="preprocessor">#endif</span>
00367 <span class="preprocessor"></span>
00368     <span class="keyword">const</span> QRect scaledRect = d_metricsMap.layoutToDevice(rect, painter);
00369 
00370     text.setWidth(painter, scaledRect.width());
00371 
00372     <span class="comment">// QSimpleRichText is Qt::AlignTop by default</span>
00373 
00374     <span class="keywordtype">int</span> y = scaledRect.y();
00375     <span class="keywordflow">if</span> (flags &amp; Qt::AlignBottom)
00376         y += (scaledRect.height() - text.height());
00377     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (flags &amp; Qt::AlignVCenter)
00378         y += (scaledRect.height() - text.height())/2;
00379 
00380 <span class="preprocessor">#if defined(QWT_BROKEN_RASTEROP_FONT)</span>
00381 <span class="preprocessor"></span>    <span class="comment">// XorROP text drawing does not work with xft</span>
00382 <span class="preprocessor">#if QT_VERSION &gt;= 300</span>
00383 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (Qt::XorROP == painter-&gt;rasterOp()
00384         &amp;&amp; d_textXorRopMode == XorRopTextKeepColor)
00385     {
00386         <span class="comment">// step 1: disable xft</span>
00387         <span class="keyword">extern</span> <span class="keywordtype">bool</span> qt_has_xft;
00388         <span class="keyword">const</span> <span class="keywordtype">bool</span> XftEnabled = qt_has_xft;
00389         qt_has_xft = FALSE;
00390 
00391         <span class="comment">// step 2: substitute the font by a bitmap font</span>
00392         painter-&gt;save();
00393         QFont font = painter-&gt;font();
00394         font.setStyleStrategy(QFont::PreferBitmap);
00395         painter-&gt;setFont(font);
00396 
00397         text.draw(painter, scaledRect.x(), y, scaledRect, cg);
00398 
00399         <span class="comment">// restore state</span>
00400         painter-&gt;restore();
00401         qt_has_xft = XftEnabled;
00402 
00403     }
00404     <span class="keywordflow">else</span>
00405 <span class="preprocessor">#endif</span>
00406 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (Qt::XorROP == painter-&gt;rasterOp()
00407         &amp;&amp; d_textXorRopMode == XorRopTextKeepFont)
00408     {
00409         <span class="comment">// step 1: create a buffer pixmap</span>
00410         QPixmap pixmap(scaledRect.size());
00411         pixmap.fill(QColor(0, 0, 0));
00412 
00413         <span class="comment">// step 2: draw the text on the pixmap</span>
00414         QPainter pmPainter(&amp;pixmap);
00415         pmPainter.setPen(painter-&gt;pen());
00416         pmPainter.setFont(painter-&gt;font());
00417         text.draw(&amp;pmPainter, scaledRect.x(), y, scaledRect, cg);
00418 
00419         <span class="comment">// step 3: draw the pixmap</span>
00420 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00421 <span class="preprocessor"></span>        painter-&gt;drawPixmap(scaledRect.x(), scaledRect.y(), pixmap);
00422 <span class="preprocessor">#else</span>
00423 <span class="preprocessor"></span>        painter-&gt;drawPixmap(scaledRect, pixmap);
00424 <span class="preprocessor">#endif</span>
00425 <span class="preprocessor"></span>    }
00426     <span class="keywordflow">else</span>
00427 <span class="preprocessor">#endif</span>
00428 <span class="preprocessor"></span>    {
00429         text.draw(painter, scaledRect.x(), y, scaledRect, cg);
00430     }
00431 
00432 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00433 <span class="preprocessor"></span>    QFont::setDefaultFont(defaultFont);
00434 <span class="preprocessor">#endif</span>
00435 <span class="preprocessor"></span>}
00436 
00437 <span class="preprocessor">#endif // !QT_NO_RICHTEXT</span>
00438 <span class="preprocessor"></span>
00439 
<a name="l00443"></a><a class="code" href="class_qwt_painter.html#e17">00443</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e16">QwtPainter::drawLine</a>(QPainter *painter, 
00444     <span class="keyword">const</span> QPoint &amp;p1, <span class="keyword">const</span> QPoint &amp;p2) 
00445 {
00446     QPointArray pa(2);
00447 
00448     <span class="keywordflow">if</span> ( d_deviceClipping &amp;&amp; 
00449         !(deviceClipRect().contains(p1) &amp;&amp; deviceClipRect().contains(p2)) )
00450     {
00451         pa.setPoint(0, p1);
00452         pa.setPoint(1, p2);
00453         <a class="code" href="class_qwt_painter.html#e19">drawPolyline</a>(painter, pa);
00454     }
00455     <span class="keywordflow">else</span>
00456     {
00457         pa.setPoint(0, d_metricsMap.layoutToDevice(p1));
00458         pa.setPoint(1, d_metricsMap.layoutToDevice(p2));
00459 
00460 <span class="preprocessor">#if QT_VERSION &gt;= 0x030200</span>
00461 <span class="preprocessor"></span>        <span class="keywordflow">if</span> ( painter-&gt;device()-&gt;isExtDev() )
00462         {
00463             <span class="comment">// Strange: the postscript driver of QPrinter adds an offset </span>
00464             <span class="comment">// of 0.5 to the start/endpoint when using drawLine, but not</span>
00465             <span class="comment">// for lines painted with drawLineSegments.</span>
00466 
00467             painter-&gt;drawLineSegments(pa);
00468         }
00469         <span class="keywordflow">else</span>
00470             painter-&gt;drawLine(pa[0], pa[1]);
00471 <span class="preprocessor">#else</span>
00472 <span class="preprocessor"></span>        painter-&gt;drawLine(pa[0], pa[1]);
00473 <span class="preprocessor">#endif</span>
00474 <span class="preprocessor"></span>    }
00475 }
00476 
<a name="l00481"></a><a class="code" href="class_qwt_painter.html#e16">00481</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e16">QwtPainter::drawLine</a>(QPainter *painter, <span class="keywordtype">int</span> x1, <span class="keywordtype">int</span> y1, <span class="keywordtype">int</span> x2, <span class="keywordtype">int</span> y2)
00482 {
00483     <a class="code" href="class_qwt_painter.html#e16">drawLine</a>(painter, QPoint(x1, y1), QPoint(x2, y2));
00484 }
00485 
<a name="l00490"></a><a class="code" href="class_qwt_painter.html#e18">00490</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e18">QwtPainter::drawPolygon</a>(QPainter *painter, <span class="keyword">const</span> QPointArray &amp;pa)
00491 {
00492     QPointArray cpa = d_metricsMap.layoutToDevice(pa);
00493     <span class="keywordflow">if</span> ( d_deviceClipping )
00494         cpa = <a class="code" href="class_qwt_painter.html#e22">clip</a>(cpa);
00495     painter-&gt;drawPolygon(cpa);
00496 }
00497 
<a name="l00501"></a><a class="code" href="class_qwt_painter.html#e19">00501</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e19">QwtPainter::drawPolyline</a>(QPainter *painter, <span class="keyword">const</span> QPointArray &amp;pa)
00502 {
00503     QPointArray cpa = d_metricsMap.layoutToDevice(pa);
00504     <span class="keywordflow">if</span> ( d_deviceClipping )
00505         cpa = <a class="code" href="class_qwt_painter.html#e22">clip</a>(cpa);
00506     painter-&gt;drawPolyline(cpa);
00507 }
00508 
<a name="l00513"></a><a class="code" href="class_qwt_painter.html#e20">00513</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e20">QwtPainter::drawPoint</a>(QPainter *painter, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
00514 {
00515     <span class="keyword">const</span> QPoint pos = d_metricsMap.layoutToDevice(QPoint(x, y));
00516 
00517     <span class="keywordflow">if</span> ( d_deviceClipping &amp;&amp; !deviceClipRect().contains(pos) )
00518         <span class="keywordflow">return</span>;
00519 
00520     painter-&gt;drawPoint(pos);
00521 }
00522 
<a name="l00524"></a><a class="code" href="class_qwt_painter.html#e22">00524</a> QPointArray <a class="code" href="class_qwt_painter.html#e22">QwtPainter::clip</a>(<span class="keyword">const</span> QPointArray &amp;pa)
00525 {
00526     <span class="keyword">const</span> <a class="code" href="class_qwt_rect.html">QwtRect</a> rect(deviceClipRect());
00527     <span class="keywordflow">return</span> rect.<a class="code" href="class_qwt_rect.html#a7">clip</a>(pa);
00528 }
00529 
00530 <span class="keywordtype">void</span> QwtPainter::drawColoredArc(QPainter *painter, <span class="keyword">const</span> QRect &amp;rect, 
00531     <span class="keywordtype">int</span> peak, <span class="keywordtype">int</span> arc, <span class="keywordtype">int</span> intervall, <span class="keyword">const</span> QColor &amp;c1, <span class="keyword">const</span> QColor &amp;c2)
00532 {
00533     <span class="keywordtype">int</span> h1, s1, v1;
00534     <span class="keywordtype">int</span> h2, s2, v2;
00535 
00536     c1.hsv(&amp;h1, &amp;s1, &amp;v1);
00537     c2.hsv(&amp;h2, &amp;s2, &amp;v2);
00538     
00539     arc /= 2;
00540     <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> angle = -arc; angle &lt; arc; angle += intervall)
00541     {
00542         <span class="keywordtype">double</span> ratio;
00543         <span class="keywordflow">if</span> ( angle &gt;= 0 )
00544             ratio = 1.0 - angle / double(arc);
00545         <span class="keywordflow">else</span>
00546             ratio = 1.0 + angle / double(arc);
00547             
00548 
00549         <span class="keyword">const</span> QColor c(h1 + qRound(ratio * (h2 - h1)),
00550             s1 + qRound(ratio * (s2 - s1)),
00551             v1 + qRound(ratio * (v2 - v1)),
00552             QColor::Hsv);
00553 
00554         painter-&gt;setPen(QPen(c, painter-&gt;pen().width()));
00555         painter-&gt;drawArc(rect, (peak + angle) * 16, intervall * 16);
00556     }
00557 }
00558 
<a name="l00560"></a><a class="code" href="class_qwt_painter.html#e21">00560</a> <span class="keywordtype">void</span> <a class="code" href="class_qwt_painter.html#e21">QwtPainter::drawRoundFrame</a>(QPainter *painter, <span class="keyword">const</span> QRect &amp;rect,
00561     <span class="keywordtype">int</span> width, <span class="keyword">const</span> QColorGroup &amp;cg, <span class="keywordtype">bool</span> sunken)
00562 {
00563     QColor c0 = cg.mid();
00564     QColor c1, c2;
00565     <span class="keywordflow">if</span> ( sunken )
00566     {
00567         c1 = cg.dark();
00568         c2 = cg.light();
00569     }
00570     <span class="keywordflow">else</span>
00571     {
00572         c1 = cg.light();
00573         c2 = cg.dark();
00574     }
00575 
00576     painter-&gt;setPen(QPen(c0, width));
00577     painter-&gt;drawArc(rect, 0, 360 * 16); <span class="comment">// full</span>
00578 
00579     <span class="keyword">const</span> <span class="keywordtype">int</span> peak = 150;
00580     <span class="keyword">const</span> <span class="keywordtype">int</span> intervall = 2;
00581 
00582     <span class="keywordflow">if</span> ( c0 != c1 )
00583         drawColoredArc(painter, rect, peak, 160, intervall, c0, c1);
00584     <span class="keywordflow">if</span> ( c0 != c2 )
00585         drawColoredArc(painter, rect, peak + 180, 120, intervall, c0, c2);
00586 }
00587 
<a name="l00594"></a><a class="code" href="class_qwt_painter.html#e23">00594</a> <span class="keywordtype">int</span> <a class="code" href="class_qwt_painter.html#e23">QwtPainter::textXorRopMode</a>()
00595 {
00596     <span class="keywordflow">return</span> d_textXorRopMode;
00597 }
00598 
00618 <span class="preprocessor">#if defined(QWT_BROKEN_RASTEROP_FONT)</span>
00619 <span class="preprocessor"></span>
00620 <span class="keywordtype">int</span> <a class="code" href="class_qwt_painter.html#e24">QwtPainter::setTextXorRopMode</a>(TextXorRopMode mode)
00621 {
00622     <span class="keywordflow">if</span> ((mode == XorRopTextNormal)
00623         || (mode == XorRopTextKeepFont)
00624 <span class="preprocessor">#if QT_VERSION &gt;= 300</span>
00625 <span class="preprocessor"></span>        || (mode == XorRopTextKeepColor)
00626 <span class="preprocessor">#endif</span>
00627 <span class="preprocessor"></span>        )
00628         d_textXorRopMode = mode;
00629 
00630 <span class="preprocessor">#if QT_VERSION &lt; 300</span>
00631 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (!qwt_use_xft())
00632         d_textXorRopMode = XorRopTextNormal;
00633 <span class="preprocessor">#endif</span>
00634 <span class="preprocessor"></span>
00635     <span class="keywordflow">return</span> d_textXorRopMode;
00636 }
00637 
00638 <span class="preprocessor">#else</span>
00639 <span class="preprocessor"></span>
<a name="l00640"></a><a class="code" href="class_qwt_painter.html#e24">00640</a> <span class="keywordtype">int</span> <a class="code" href="class_qwt_painter.html#e24">QwtPainter::setTextXorRopMode</a>(TextXorRopMode)
00641 {
00642     <span class="keywordflow">return</span> d_textXorRopMode;
00643 }
00644 
00645 <span class="preprocessor">#endif</span>
00646 <span class="preprocessor"></span>
00647 <span class="comment">// Local Variables:</span>
00648 <span class="comment">// mode: C++</span>
00649 <span class="comment">// c-file-style: "stroustrup"</span>
00650 <span class="comment">// indent-tabs-mode: nil</span>
00651 <span class="comment">// End:</span>
</div></pre><hr size="1"><address style="align: right;"><small>Generated on Tue Nov 16 21:12:20 2004 for Qwt User's Guide by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.8 </small></address>
</body>
</html>