qt-fix.diff
qt-win-opensource-src-4.5.2/src/gui/painting/qoutlinemapper.cpp 2009-09-12 11:19:10.156250000 +0200 | ||
---|---|---|
74 | 74 |
return QRectF(QPointF(minx, miny), QPointF(maxx, maxy)); |
75 | 75 |
} |
76 | 76 | |
77 |
static QPainterPath vp_convertToPainterPath(const QVectorPath &vp) |
|
78 |
{ |
|
79 |
QPainterPath path; |
|
80 | ||
81 |
if (vp.elementCount() == 0) |
|
82 |
return path; |
|
83 | ||
84 |
const QPointF *points = (const QPointF *) vp.points(); |
|
85 | ||
86 |
if (vp.elements()) { |
|
87 |
for (int i=0; i<vp.elementCount(); ++i) { |
|
88 |
switch (vp.elements()[i]) { |
|
89 |
case QPainterPath::MoveToElement: |
|
90 |
path.moveTo(points[i]); |
|
91 |
break; |
|
92 |
case QPainterPath::LineToElement: |
|
93 |
path.lineTo(points[i]); |
|
94 |
break; |
|
95 |
case QPainterPath::CurveToElement: |
|
96 |
path.cubicTo(points[i], points[i+1], points[i+2]); |
|
97 |
break; |
|
98 |
default: |
|
99 |
break; |
|
100 |
} |
|
101 |
} |
|
102 |
} else { |
|
103 |
path.moveTo(points[0]); |
|
104 |
for (int i=1; i<vp.elementCount(); ++i) |
|
105 |
path.lineTo(points[i]); |
|
106 |
} |
|
107 | ||
108 |
return path; |
|
109 |
} |
|
77 | 110 | |
78 | 111 |
QT_FT_Outline *QOutlineMapper::convertPath(const QPainterPath &path) |
79 | 112 |
{ |
... | ... | |
198 | 231 |
m_m22 * e.y() + m_m12 * e.x() + m_dy); |
199 | 232 |
} |
200 | 233 |
} else { |
201 |
// ## TODO: this case needs to be plain code polygonal paths |
|
202 |
QPainterPath path; |
|
203 |
if (m_element_types.isEmpty()) { |
|
204 |
if (!m_elements.isEmpty()) |
|
205 |
path.moveTo(m_elements.at(0)); |
|
206 |
for (int i=1; i<m_elements.size(); ++i) |
|
207 |
path.lineTo(m_elements.at(i)); |
|
208 |
} else { |
|
209 |
for (int i=0; i<m_elements.size(); ++i) { |
|
210 |
switch (m_element_types.at(i)) { |
|
211 |
case QPainterPath::MoveToElement: |
|
212 |
path.moveTo(m_elements.at(i)); |
|
213 |
break; |
|
214 |
case QPainterPath::LineToElement: |
|
215 |
path.lineTo(m_elements.at(i)); |
|
216 |
break; |
|
217 |
case QPainterPath::CurveToElement: |
|
218 |
path.cubicTo(m_elements.at(i), m_elements.at(i+1), m_elements.at(i+2)); |
|
219 |
i += 2; |
|
220 |
break; |
|
221 |
default: |
|
222 |
Q_ASSERT(false); |
|
223 |
break; |
|
224 |
} |
|
225 |
} |
|
226 |
} |
|
234 |
const QVectorPath vp((qreal *)m_elements.data(), m_elements.size(), m_element_types.data()); |
|
235 |
QPainterPath path = vp_convertToPainterPath(vp); |
|
227 | 236 |
path = QTransform(m_m11, m_m12, m_m13, m_m21, m_m22, m_m23, m_dx, m_dy, m_m33).map(path); |
237 |
if (!(m_outline.flags & QT_FT_OUTLINE_EVEN_ODD_FILL)) |
|
238 |
path.setFillRule(Qt::WindingFill); |
|
228 | 239 |
uint old_txop = m_txop; |
229 | 240 |
m_txop = QTransform::TxNone; |
230 | 241 |
if (path.isEmpty()) |
... | ... | |
254 | 265 | |
255 | 266 | |
256 | 267 |
// Check for out of dev bounds... |
257 |
const bool do_clip = (controlPointRect.left() < -QT_RASTER_COORD_LIMIT
|
|
258 |
|| controlPointRect.right() > QT_RASTER_COORD_LIMIT
|
|
259 |
|| controlPointRect.top() < -QT_RASTER_COORD_LIMIT
|
|
260 |
|| controlPointRect.bottom() > QT_RASTER_COORD_LIMIT);
|
|
268 |
const bool do_clip = (controlPointRect.left() < -(QT_RASTER_COORD_LIMIT + 1)
|
|
269 |
|| controlPointRect.right() > (QT_RASTER_COORD_LIMIT + 1)
|
|
270 |
|| controlPointRect.top() < - (QT_RASTER_COORD_LIMIT + 1)
|
|
271 |
|| controlPointRect.bottom() > (QT_RASTER_COORD_LIMIT + 1) );
|
|
261 | 272 | |
262 |
if (do_clip) { |
|
273 |
if (do_clip) |
|
274 |
{ |
|
275 |
//if the path consists only of straight lines, we can use a faster clipping algorithm |
|
276 |
if(element_count > 10000 && !isCurved()) |
|
277 |
{ |
|
278 |
QDataBuffer<QPointF>* trimBuffer; |
|
279 |
if (m_txop == QTransform::TxNone) |
|
280 |
{ |
|
281 |
trimBuffer = &m_elements; |
|
282 |
} |
|
283 |
else |
|
284 |
{ |
|
285 |
trimBuffer = &m_elements_dev; |
|
286 |
} |
|
287 |
trimFeature(trimBuffer, trimBuffer->at(0) != trimBuffer->at(trimBuffer->size() - 1)); |
|
288 |
} |
|
289 |
else |
|
290 |
{ |
|
263 | 291 |
clipElements(elements, elementTypes(), element_count); |
264 |
} else { |
|
292 |
} |
|
293 |
} |
|
294 |
else |
|
295 |
{ |
|
265 | 296 |
convertElements(elements, elementTypes(), element_count); |
266 | 297 |
} |
267 | 298 |
} |
... | ... | |
409 | 440 |
m_txop = old_txop; |
410 | 441 |
} |
411 | 442 | |
443 |
bool QOutlineMapper::isCurved() const |
|
444 |
{ |
|
445 |
bool isCurved = false; |
|
446 |
for(int i = 0; i < m_element_types.size(); ++i) |
|
447 |
{ |
|
448 |
if(m_element_types.at(i) == QPainterPath::CurveToElement || m_element_types.at(i) == QPainterPath::CurveToDataElement) |
|
449 |
{ |
|
450 |
isCurved = true; |
|
451 |
break; |
|
452 |
} |
|
453 |
} |
|
454 |
return isCurved; |
|
455 |
} |
|
456 | ||
412 | 457 |
QT_END_NAMESPACE |
qt-win-opensource-src-4.5.2/src/gui/painting/qoutlinemapper_p.h 2009-09-12 11:17:14.281250000 +0200 | ||
---|---|---|
65 | 65 |
#include <private/qdatabuffer_p.h> |
66 | 66 |
#include "qpaintengineex_p.h" |
67 | 67 | |
68 |
#include <cmath> |
|
69 | ||
68 | 70 |
QT_BEGIN_NAMESPACE |
69 | 71 | |
70 | 72 |
// This limitations comes from qgrayraster.c. Any higher and |
71 | 73 |
// rasterization of shapes will produce incorrect results. |
72 | 74 |
const int QT_RASTER_COORD_LIMIT = 32767; |
75 |
const int QT_NEGATIVE_RASTER_COORD_LIMIT = -32767; |
|
76 |
static const double SMALL_NUM = 1e-12; |
|
73 | 77 | |
74 | 78 |
//#define QT_DEBUG_CONVERT |
75 | 79 | |
... | ... | |
231 | 235 | |
232 | 236 |
private: |
233 | 237 |
bool m_round_coords; |
238 | ||
239 |
// A handy way to refer to the four boundaries |
|
240 |
enum Boundary {XMax, XMin, YMax, YMin}; |
|
241 | ||
242 |
/**Trims the feature to the bounding box defined by +-QT_RASTER_COORD_LIMIT. |
|
243 |
// Uses Sutherland and Hodgman's polygon-clipping algorithm. See J. D. Foley, A. van Dam, |
|
244 |
// S. K. Feiner, and J. F. Hughes, Computer Graphics, Principles and |
|
245 |
// Practice. Addison-Wesley Systems Programming Series, |
|
246 |
// Addison-Wesley, 2nd ed., 1991.*/ |
|
247 |
void trimFeature(QDataBuffer<QPointF>* elements, bool shapeOpen); |
|
248 | ||
249 |
// Trims the given feature to the given boundary. Returns the |
|
250 |
// trimmed feature in the outX and outY vectors. |
|
251 |
void trimFeatureToBoundary( const QDataBuffer<QPointF>* in, |
|
252 |
QDataBuffer<QPointF>* out, |
|
253 |
Boundary b, |
|
254 |
bool shapeOpen ); |
|
255 | ||
256 |
/**True if the path contains CurveToElement or CurveToDataElement, false if if only consists straight lines*/ |
|
257 |
bool isCurved() const; |
|
258 | ||
259 |
// Determines if a point is inside or outside the given boundary |
|
260 |
static bool inside( const double x, const double y, Boundary b ); |
|
261 | ||
262 |
// Calculates the intersection point between a line defined by a |
|
263 |
// (x1, y1), and (x2, y2) and the given boundary |
|
264 |
static QPointF intersect( const double x1, const double y1, |
|
265 |
const double x2, const double y2, |
|
266 |
Boundary b ); |
|
234 | 267 |
}; |
235 | 268 | |
269 | ||
270 |
//inline functions |
|
271 |
// An auxilary function to trimPolygonToBoundarY() that returns |
|
272 |
// whether a point is inside or outside the given boundary. |
|
273 | ||
274 |
inline void QOutlineMapper::trimFeature(QDataBuffer<QPointF>* elements, bool shapeOpen) |
|
275 |
{ |
|
276 |
QDataBuffer<QPointF> tmpElements; |
|
277 |
trimFeatureToBoundary( elements, &tmpElements, XMax, shapeOpen); |
|
278 |
elements->reset(); |
|
279 |
trimFeatureToBoundary( &tmpElements, elements, YMax, shapeOpen ); |
|
280 |
tmpElements.reset(); |
|
281 |
trimFeatureToBoundary( elements, &tmpElements, XMin, shapeOpen ); |
|
282 |
elements->reset(); |
|
283 |
trimFeatureToBoundary( &tmpElements, elements, YMin, shapeOpen ); |
|
284 |
tmpElements.reset(); |
|
285 | ||
286 |
QPainterPath path; |
|
287 |
if(elements->size() > 0) |
|
288 |
{ |
|
289 |
path.moveTo(elements->at(0)); |
|
290 |
} |
|
291 |
for(int i = 1; i < elements->size(); ++i) |
|
292 |
{ |
|
293 |
path.lineTo(elements->at(i)); |
|
294 |
} |
|
295 |
uint old_txop = m_txop; |
|
296 |
m_txop = QTransform::TxNone; |
|
297 |
convertPath(path); |
|
298 |
m_txop = old_txop; |
|
299 |
} |
|
300 | ||
301 |
inline void QOutlineMapper::trimFeatureToBoundary( const QDataBuffer<QPointF>* in, QDataBuffer<QPointF>* out, Boundary b, bool shapeOpen ) |
|
302 |
{ |
|
303 | ||
304 |
// The shapeOpen parameter selects whether this function treats the |
|
305 |
// shape as open or closed. False is appropriate for polygons and |
|
306 |
// true for polylines. |
|
307 |
unsigned int i1 = in->size() - 1; |
|
308 | ||
309 |
// and compare to the first point initially. |
|
310 |
for ( int i2 = 0; i2 < in->size() ; ++i2 ) |
|
311 |
{ // look at each edge of the polygon in turn |
|
312 |
if ( inside( in->at(i2).x(), in->at(i2).y(), b ) ) // end point of edge is inside boundary |
|
313 |
{ |
|
314 |
if ( inside( in->at(i1).x(), in->at(i1).y(), b ) ) |
|
315 |
{ |
|
316 |
out->add(in->at(i2)); |
|
317 |
} |
|
318 |
else |
|
319 |
{ |
|
320 |
// edge crosses into the boundary, so trim back to the boundary, and |
|
321 |
// store both ends of the new edge |
|
322 |
if ( !( i2 == 0 && shapeOpen ) ) |
|
323 |
{ |
|
324 |
QPointF p = intersect( in->at(i1).x(), in->at(i1).y(), in->at(i2).x(), in->at(i2).y(), b); |
|
325 |
out->add(p); |
|
326 |
} |
|
327 |
out->add(in->at(i2)); |
|
328 |
} |
|
329 |
} |
|
330 |
else // end point of edge is outside boundary |
|
331 |
{ |
|
332 |
// start point is in boundary, so need to trim back |
|
333 |
if ( inside( in->at(i1).x(), in->at(i1).y(), b ) ) |
|
334 |
{ |
|
335 |
if ( !( i2 == 0 && shapeOpen ) ) |
|
336 |
{ |
|
337 |
QPointF p = intersect( in->at(i1).x(), in->at(i1).y(), in->at(i2).x(), in->at(i2).y(), b ); |
|
338 |
out->add(p); |
|
339 |
} |
|
340 |
} |
|
341 |
} |
|
342 |
i1 = i2; |
|
343 |
} |
|
344 |
} |
|
345 | ||
346 | ||
347 |
inline bool QOutlineMapper::inside( const double x, const double y, Boundary b ) |
|
348 |
{ |
|
349 |
switch ( b ) |
|
350 |
{ |
|
351 |
case XMax: // x < QT_RASTER_COORD_LIMIT is inside |
|
352 |
if ( x < QT_RASTER_COORD_LIMIT ) |
|
353 |
return true; |
|
354 |
break; |
|
355 |
case XMin: // x > -QT_RASTER_COORD_LIMIT is inside |
|
356 |
if ( x > QT_NEGATIVE_RASTER_COORD_LIMIT ) |
|
357 |
return true; |
|
358 |
break; |
|
359 |
case YMax: // y < QT_RASTER_COORD_LIMIT is inside |
|
360 |
if ( y < QT_RASTER_COORD_LIMIT) |
|
361 |
return true; |
|
362 |
break; |
|
363 |
case YMin: // y > -QT_RASTER_COORD_LIMIT is inside |
|
364 |
if ( y > QT_NEGATIVE_RASTER_COORD_LIMIT ) |
|
365 |
return true; |
|
366 |
break; |
|
367 |
} |
|
368 |
return false; |
|
369 |
} |
|
370 | ||
371 |
// An auxilary function to trimPolygonToBoundarY() that calculates and |
|
372 |
// returns the intersection of the line defined by the given points |
|
373 |
// and the given boundary. |
|
374 | ||
375 |
inline QPointF QOutlineMapper::intersect( const double x1, const double y1, |
|
376 |
const double x2, const double y2, |
|
377 |
Boundary b ) |
|
378 |
{ |
|
379 |
// This function assumes that the two given points (x1, y1), and |
|
380 |
// (x2, y2) cross the given boundary. Making this assumption allows |
|
381 |
// some optimisations. |
|
382 | ||
383 |
double r_n = SMALL_NUM, r_d = SMALL_NUM; |
|
384 | ||
385 |
switch ( b ) |
|
386 |
{ |
|
387 |
case XMax: // x = MAX_X boundary |
|
388 |
r_n = -( x1 - QT_RASTER_COORD_LIMIT ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
389 |
r_d = ( x2 - x1 ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
390 |
break; |
|
391 |
case XMin: // x = MIN_X boundary |
|
392 |
r_n = -( x1 - QT_NEGATIVE_RASTER_COORD_LIMIT ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
393 |
r_d = ( x2 - x1 ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
394 |
break; |
|
395 |
case YMax: // y = MAX_Y boundary |
|
396 |
r_n = ( y1 - QT_RASTER_COORD_LIMIT ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
397 |
r_d = -( y2 - y1 ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
398 |
break; |
|
399 |
case YMin: // y = MIN_Y boundary |
|
400 |
r_n = ( y1 - QT_NEGATIVE_RASTER_COORD_LIMIT ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
401 |
r_d = -( y2 - y1 ) * ( QT_RASTER_COORD_LIMIT - QT_NEGATIVE_RASTER_COORD_LIMIT ); |
|
402 |
break; |
|
403 |
} |
|
404 | ||
405 |
QPointF p; |
|
406 | ||
407 |
if ( std::abs( r_d ) > SMALL_NUM && std::abs( r_n ) > SMALL_NUM ) |
|
408 |
{ // they cross |
|
409 |
double r = r_n / r_d; |
|
410 |
p.setX( x1 + r*( x2 - x1 ) ); |
|
411 |
p.setY( y1 + r*( y2 - y1 ) ); |
|
412 |
} |
|
413 |
else |
|
414 |
{ |
|
415 |
// Should never get here, but if we do for some reason, cause a |
|
416 |
// clunk because something else is wrong if we do. |
|
417 |
Q_ASSERT( std::abs( r_d ) > SMALL_NUM && std::abs( r_n ) > SMALL_NUM ); |
|
418 |
} |
|
419 | ||
420 |
return p; |
|
421 |
} |
|
422 | ||
236 | 423 |
QT_END_NAMESPACE |
237 | 424 | |
238 | 425 |
#endif // QOUTLINEMAPPER_P_H |
qt-win-opensource-src-4.5.2/src/gui/painting/qprintengine_pdf.cpp 2010-04-01 11:18:56.390625000 +0200 | ||
---|---|---|
99 | 99 |
inline QPaintEngine::PaintEngineFeatures qt_pdf_decide_features() |
100 | 100 |
{ |
101 | 101 |
QPaintEngine::PaintEngineFeatures f = QPaintEngine::AllFeatures; |
102 |
f &= ~(QPaintEngine::PorterDuff | QPaintEngine::PerspectiveTransform
|
|
102 |
f &= (QPaintEngine::PorterDuff | QPaintEngine::PerspectiveTransform |
|
103 | 103 |
| QPaintEngine::ObjectBoundingModeGradients |
104 | 104 |
#ifndef USE_NATIVE_GRADIENTS |
105 | 105 |
| QPaintEngine::LinearGradientFill |
qt-win-opensource-src-4.5.2/src/plugins/sqldrivers/sqlite/sqlite.pro 2010-04-26 17:21:49.125000000 +0200 | ||
---|---|---|
6 | 6 | |
7 | 7 |
!system-sqlite:!contains( LIBS, .*sqlite.* ) { |
8 | 8 |
CONFIG(release, debug|release):DEFINES *= NDEBUG |
9 |
DEFINES += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE
|
|
9 |
DEFINES += SQLITE_OMIT_COMPLETE |
|
10 | 10 |
INCLUDEPATH += ../../../3rdparty/sqlite |
11 | 11 |
SOURCES += ../../../3rdparty/sqlite/sqlite3.c |
12 | 12 |
} else { |
qt-win-opensource-src-4.5.2/src/sql/models/qsqltablemodel.cpp 2010-04-01 12:20:26.484375000 +0200 | ||
---|---|---|
202 | 202 |
editQuery.addBindValue(rec.value(i)); |
203 | 203 |
} |
204 | 204 |
for (i = 0; i < whereValues.count(); ++i) { |
205 |
if (whereValues.isGenerated(i)) |
|
205 |
if (whereValues.isGenerated(i) && !whereValues.isNull(i))
|
|
206 | 206 |
editQuery.addBindValue(whereValues.value(i)); |
207 | 207 |
} |
208 | 208 |