#include <private/qrasterdefs_p.h>
#include <private/qgrayraster_p.h>
#include <private/qblackraster_p.h>
#include <qpainterpath.h>
#include <qdebug.h>
#include <qhash.h>
#include <qlabel.h>
#include <qbitmap.h>
#include <private/qmath_p.h>
#include <private/qdatabuffer_p.h>
#include <private/qpainter_p.h>
#include <private/qtextengine_p.h>
#include <private/qpixmap_p.h>
#include <private/qfontengine_p.h>
#include <private/qpolygonclipper_p.h>
#include "qpaintengine_raster_p.h"
#include "qbezier_p.h"
#include <qwidget.h>
#include <qx11info_x11.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <limits.h>
Include dependency graph for qpaintengine_raster.cpp:

Go to the source code of this file.
Classes | |
| struct | ClipData |
| struct | QRasterFloatPoint |
| class | QFTOutlineMapper |
| class | QGradientCache |
| struct | QGradientCache::CacheInfo |
Defines | |
| #define | QT_FT_BEGIN_HEADER |
| #define | QT_FT_END_HEADER |
| #define | qreal_to_fixed_26_6(f) (int(f * 64)) |
| #define | qt_swap_int(x, y) { int tmp = (x); (x) = (y); (y) = tmp; } |
| #define | qt_swap_qreal(x, y) { qreal tmp = (x); (x) = (y); (y) = tmp; } |
| #define | int_dim(pos, dim) (int(pos+dim) - int(pos)) |
Enumerations | |
| enum | LineDrawMode |
Functions | |
| static void | qt_span_fill_clipped (int count, const QSpan *spans, void *userData) |
| static void | qt_span_clip (int count, const QSpan *spans, void *userData) |
| static void | drawLine_midpoint_i (int x1, int y1, int x2, int y2, ProcessSpans span_func, QSpanData *data, LineDrawMode style, const QRect &devRect) |
| static void | drawLine_midpoint_dashed_i (int x1, int y1, int x2, int y2, QPen *pen, ProcessSpans span_func, QSpanData *data, LineDrawMode style, const QRect &devRect, int *patternOffset) |
| static void | drawEllipse_midpoint_i (const QRect &rect, const QRect &clip, ProcessSpans pen_func, ProcessSpans brush_func, QSpanData *pen_data, QSpanData *brush_data) |
| static void | qt_ft_outline_move_to (qfixed x, qfixed y, void *data) |
| static void | qt_ft_outline_line_to (qfixed x, qfixed y, void *data) |
| static void | qt_ft_outline_cubic_to (qfixed c1x, qfixed c1y, qfixed c2x, qfixed c2y, qfixed ex, qfixed ey, void *data) |
| static void | fillRect (const QRect &r, QSpanData *data) |
| static void | qt_merge_clip (const QClipData *c1, const QClipData *c2, QClipData *result) |
| static const QSpan * | qt_intersect_spans (const QClipData *clip, int *currentClip, const QSpan *spans, const QSpan *end, QSpan **outSpans, int available) |
| const QVector< QRgb > * | qt_image_colortable (const QImage &image) |
| static int | ellipseSpansClipped (QT_FT_Span *spans, int numSpans, const QRect &clip) |
| static void | drawEllipsePoints (int x, int y, int length, const QRect &rect, const QRect &clip, ProcessSpans pen_func, ProcessSpans brush_func, QSpanData *pen_data, QSpanData *brush_data) |
Variables | |
| const int | QT_RASTER_COORD_LIMIT = 16385 |
| #define int_dim | ( | pos, | |||
| dim | ) | (int(pos+dim) - int(pos)) |
Definition at line 2494 of file qpaintengine_raster.cpp.
Referenced by QRasterPaintEngine::drawEllipse().
| #define qreal_to_fixed_26_6 | ( | f | ) | (int(f * 64)) |
Definition at line 80 of file qpaintengine_raster.cpp.
Referenced by QFTOutlineMapper::convertElements().
| #define QT_FT_BEGIN_HEADER |
Definition at line 24 of file qpaintengine_raster.cpp.
| #define QT_FT_END_HEADER |
Definition at line 25 of file qpaintengine_raster.cpp.
| #define qt_swap_int | ( | x, | |||
| y | ) | { int tmp = (x); (x) = (y); (y) = tmp; } |
Definition at line 81 of file qpaintengine_raster.cpp.
Referenced by drawLine_midpoint_dashed_i(), and drawLine_midpoint_i().
| #define qt_swap_qreal | ( | x, | |||
| y | ) | { qreal tmp = (x); (x) = (y); (y) = tmp; } |
Definition at line 82 of file qpaintengine_raster.cpp.
| enum LineDrawMode |
Definition at line 105 of file qpaintengine_raster.cpp.
00105 { 00106 LineDrawClipped, 00107 LineDrawNormal, 00108 LineDrawIncludeLastPixel 00109 };
| static void drawEllipse_midpoint_i | ( | const QRect & | rect, | |
| const QRect & | clip, | |||
| ProcessSpans | pen_func, | |||
| ProcessSpans | brush_func, | |||
| QSpanData * | pen_data, | |||
| QSpanData * | brush_data | |||
| ) | [static] |
Definition at line 4880 of file qpaintengine_raster.cpp.
References a, b, d, drawEllipsePoints(), QRect::height(), and QRect::width().
Referenced by QRasterPaintEngine::drawEllipse().
04883 { 04884 #ifdef FLOATING_POINT_BUGGY_OR_NO_FPU // no fpu, so use fixed point 04885 const QFixed a = QFixed(rect.width()) >> 1; 04886 const QFixed b = QFixed(rect.height()) >> 1; 04887 QFixed d = b*b - (a*a*b) + ((a*a) >> 2); 04888 #else 04889 const qreal a = qreal(rect.width()) / 2; 04890 const qreal b = qreal(rect.height()) / 2; 04891 qreal d = b*b - (a*a*b) + 0.25*a*a; 04892 #endif 04893 04894 int x = 0; 04895 int y = (rect.height() + 1) / 2; 04896 int startx = x; 04897 04898 // region 1 04899 while (a*a*(2*y - 1) > 2*b*b*(x + 1)) { 04900 if (d < 0) { // select E 04901 d += b*b*(2*x + 3); 04902 ++x; 04903 } else { // select SE 04904 d += b*b*(2*x + 3) + a*a*(-2*y + 2); 04905 drawEllipsePoints(startx, y, x - startx + 1, rect, clip, 04906 pen_func, brush_func, pen_data, brush_data); 04907 startx = ++x; 04908 --y; 04909 } 04910 } 04911 drawEllipsePoints(startx, y, x - startx + 1, rect, clip, 04912 pen_func, brush_func, pen_data, brush_data); 04913 04914 // region 2 04915 #ifdef FLOATING_POINT_BUGGY_OR_NO_FPU 04916 d = b*b*(x + (QFixed(1) >> 1))*(x + (QFixed(1) >> 1)) 04917 + a*a*((y - 1)*(y - 1) - b*b); 04918 #else 04919 d = b*b*(x + 0.5)*(x + 0.5) + a*a*((y - 1)*(y - 1) - b*b); 04920 #endif 04921 const int miny = rect.height() & 0x1; 04922 while (y > miny) { 04923 if (d < 0) { // select SE 04924 d += b*b*(2*x + 2) + a*a*(-2*y + 3); 04925 ++x; 04926 } else { // select S 04927 d += a*a*(-2*y + 3); 04928 } 04929 --y; 04930 drawEllipsePoints(x, y, 1, rect, clip, 04931 pen_func, brush_func, pen_data, brush_data); 04932 } 04933 }
Here is the call graph for this function:

| static void drawEllipsePoints | ( | int | x, | |
| int | y, | |||
| int | length, | |||
| const QRect & | rect, | |||
| const QRect & | clip, | |||
| ProcessSpans | pen_func, | |||
| ProcessSpans | brush_func, | |||
| QSpanData * | pen_data, | |||
| QSpanData * | brush_data | |||
| ) | [inline, static] |
Definition at line 4805 of file qpaintengine_raster.cpp.
References QT_FT_Span_::coverage, ellipseSpansClipped(), QRect::height(), QT_FT_Span_::len, n, qMax(), qMin(), QRect::width(), QT_FT_Span_::x, QRect::x(), QRect::y(), and QT_FT_Span_::y.
Referenced by drawEllipse_midpoint_i().
04810 { 04811 if (length == 0) 04812 return; 04813 04814 QT_FT_Span outline[4]; 04815 const int midx = rect.x() + (rect.width() + 1) / 2; 04816 const int midy = rect.y() + (rect.height() + 1) / 2; 04817 04818 x = x + midx; 04819 y = midy - y; 04820 04821 // topleft 04822 outline[0].x = midx + (midx - x) - (length - 1) - (rect.width() & 0x1); 04823 outline[0].len = qMin(length, x - outline[0].x); 04824 outline[0].y = y; 04825 outline[0].coverage = 255; 04826 04827 // topright 04828 outline[1].x = x; 04829 outline[1].len = length; 04830 outline[1].y = y; 04831 outline[1].coverage = 255; 04832 04833 // bottomleft 04834 outline[2].x = outline[0].x; 04835 outline[2].len = outline[0].len; 04836 outline[2].y = midy + (midy - y) - (rect.height() & 0x1); 04837 outline[2].coverage = 255; 04838 04839 // bottomright 04840 outline[3].x = x; 04841 outline[3].len = length; 04842 outline[3].y = outline[2].y; 04843 outline[3].coverage = 255; 04844 04845 if (brush_func && outline[0].x + outline[0].len < outline[1].x) { 04846 QT_FT_Span fill[2]; 04847 04848 // top fill 04849 fill[0].x = outline[0].x + outline[0].len - 1; 04850 fill[0].len = qMax(0, outline[1].x - fill[0].x); 04851 fill[0].y = outline[1].y; 04852 fill[0].coverage = 255; 04853 04854 // bottom fill 04855 fill[1].x = outline[2].x + outline[2].len - 1; 04856 fill[1].len = qMax(0, outline[3].x - fill[1].x); 04857 fill[1].y = outline[3].y; 04858 fill[1].coverage = 255; 04859 04860 int n = (fill[0].y >= fill[1].y ? 1 : 2); 04861 n = ellipseSpansClipped(fill, n, clip); 04862 if (n > 0) 04863 brush_func(n, fill, brush_data); 04864 } 04865 if (pen_func) { 04866 int n = (outline[1].y >= outline[2].y ? 2 : 4); 04867 n = ellipseSpansClipped(outline, n, clip); 04868 if (n > 0) 04869 pen_func(n, outline, pen_data); 04870 } 04871 }
Here is the call graph for this function:

| static void drawLine_midpoint_dashed_i | ( | int | x1, | |
| int | y1, | |||
| int | x2, | |||
| int | y2, | |||
| QPen * | pen, | |||
| ProcessSpans | span_func, | |||
| QSpanData * | data, | |||
| LineDrawMode | style, | |||
| const QRect & | devRect, | |||
| int * | patternOffset | |||
| ) | [static] |
Definition at line 4343 of file qpaintengine_raster.cpp.
References QVector< T >::at(), QT_FT_Span_::coverage, d, QPen::dashPattern(), data, QRect::height(), int, QT_FT_Span_::len, LineDrawNormal, qDebug(), qMax(), qMin(), qt_swap_int, QVector< T >::size(), start, QRect::width(), QT_FT_Span_::x, and QT_FT_Span_::y.
Referenced by QRasterPaintEngine::drawLines(), and QRasterPaintEngine::drawPolygon().
04348 { 04349 #ifdef QT_DEBUG_DRAW 04350 qDebug() << " - drawLine_midpoint_dashed_i" << x1 << y1 << x2 << y2 << *patternOffset; 04351 #endif 04352 04353 int x, y; 04354 int dx, dy, d, incrE, incrNE; 04355 04356 dx = x2 - x1; 04357 dy = y2 - y1; 04358 04359 Q_ASSERT(*patternOffset >= 0); 04360 04361 const QVector<qreal> penPattern = pen->dashPattern(); 04362 QVarLengthArray<qreal> pattern(penPattern.size()); 04363 04364 int patternLength = 0; 04365 for (int i = 0; i < penPattern.size(); ++i) 04366 patternLength += int(penPattern.at(i)); 04367 04368 // pattern must be reversed if coordinates are out of order 04369 int reverseLength = -1; 04370 if (dy == 0 && x1 > x2) 04371 reverseLength = x1 - x2; 04372 else if (dx == 0 && y1 > y2) 04373 reverseLength = y1 - y2; 04374 else if (qAbs(dx) >= qAbs(dy) && x2 < x1) // x major axis 04375 reverseLength = qAbs(dx); 04376 else if (qAbs(dy) >= qAbs(dx) && y2 < y1) // y major axis 04377 reverseLength = qAbs(dy); 04378 04379 const bool reversed = (reverseLength > -1); 04380 if (reversed) { // reverse pattern 04381 for (int i = 0; i < penPattern.size(); ++i) 04382 pattern[penPattern.size() - 1 - i] = penPattern.at(i); 04383 04384 *patternOffset = (patternLength - 1 - *patternOffset); 04385 *patternOffset += patternLength - (reverseLength % patternLength); 04386 *patternOffset = *patternOffset % patternLength; 04387 } else { 04388 for (int i = 0; i < penPattern.size(); ++i) 04389 pattern[i] = penPattern.at(i); 04390 } 04391 04392 int dashIndex = 0; 04393 bool inDash = !reversed; 04394 int currPattern = int(pattern[dashIndex]); 04395 04396 // adjust pattern for offset 04397 int adjust = *patternOffset; 04398 while (adjust--) { 04399 if (--currPattern == 0) { 04400 inDash = !inDash; 04401 dashIndex = ((dashIndex + 1) % pattern.size()); 04402 currPattern = int(pattern[dashIndex]); 04403 } 04404 } 04405 04406 const int NSPANS = 256; 04407 QT_FT_Span spans[NSPANS]; 04408 int current = 0; 04409 bool ordered = true; 04410 04411 if (dy == 0) { 04412 // specialcase horizontal lines 04413 if (y1 >= 0 && y1 < devRect.height()) { 04414 int start = qMax(0, qMin(x1, x2)); 04415 int stop = qMax(x1, x2) + 1; 04416 int stop_clipped = qMin(devRect.width(), stop); 04417 int len = stop_clipped - start; 04418 if (style == LineDrawNormal && stop == stop_clipped) 04419 len--; 04420 04421 if (len > 0) { 04422 int x = start; 04423 while (x < stop_clipped) { 04424 if (current == NSPANS) { 04425 span_func(NSPANS, spans, data); 04426 current = 0; 04427 } 04428 const int dash = qMin(currPattern, stop_clipped - x); 04429 if (inDash) { 04430 spans[current].x = ushort(x); 04431 spans[current].len = ushort(dash); 04432 spans[current].y = y1; 04433 spans[current].coverage = 255; 04434 ++current; 04435 } 04436 if (dash < currPattern) { 04437 currPattern -= dash; 04438 } else { 04439 dashIndex = (dashIndex + 1) % pattern.size(); 04440 currPattern = int(pattern[dashIndex]); 04441 inDash = !inDash; 04442 } 04443 x += dash; 04444 } 04445 } 04446 } 04447 goto flush_and_return; 04448 } else if (dx == 0) { 04449 if (x1 >= 0 && x1 < devRect.width()) { 04450 int start = qMax(0, qMin(y1, y2)); 04451 int stop = qMax(y1, y2) + 1; 04452 int stop_clipped = qMin(devRect.height(), stop); 04453 if (style == LineDrawNormal && stop == stop_clipped) 04454 --stop; 04455 else 04456 stop = stop_clipped; 04457 04458 // loop over dashes 04459 int y = start; 04460 while (y < stop) { 04461 const int dash = qMin(currPattern, stop - y); 04462 if (inDash) { 04463 for (int i = 0; i < dash; ++i) { 04464 if (current == NSPANS) { 04465 span_func(NSPANS, spans, data); 04466 current = 0; 04467 } 04468 spans[current].x = x1; 04469 spans[current].len = 1; 04470 spans[current].coverage = 255; 04471 spans[current].y = ushort(y + i); 04472 ++current; 04473 } 04474 } 04475 if (dash < currPattern) { 04476 currPattern -= dash; 04477 } else { 04478 dashIndex = (dashIndex + 1) % pattern.size(); 04479 currPattern = int(pattern[dashIndex]); 04480 inDash = !inDash; 04481 } 04482 y += dash; 04483 } 04484 } 04485 goto flush_and_return; 04486 } 04487 04488 if (qAbs(dx) >= qAbs(dy)) { /* if x is the major axis: */ 04489 04490 if (x2 < x1) { /* if coordinates are out of order */ 04491 qt_swap_int(x1, x2); 04492 dx = -dx; 04493 04494 qt_swap_int(y1, y2); 04495 dy = -dy; 04496 } 04497 04498 if (style == LineDrawNormal) 04499 --x2; 04500 04501 // In the loops below we increment before call the span function so 04502 // we need to stop one pixel before 04503 x2 = qMin(x2, devRect.width() - 1); 04504 04505 // completely clipped, so abort 04506 if (x2 <= x1) 04507 goto flush_and_return; 04508 04509 int x = x1; 04510 int y = y1; 04511 04512 if (x >= 0 && y >= 0 && y < devRect.height()) { 04513 Q_ASSERT(x >= 0 && y >= 0 && x < devRect.width() && y < devRect.height()); 04514 if (inDash) { 04515 if (current == NSPANS) { 04516 span_func(NSPANS, spans, data); 04517 current = 0; 04518 } 04519 spans[current].len = 1; 04520 spans[current].coverage = 255; 04521 spans[current].x = x; 04522 spans[current].y = y; 04523 ++current; 04524 } 04525 if (--currPattern <= 0) { 04526 inDash = !inDash; 04527 dashIndex = (dashIndex + 1) % pattern.size(); 04528 currPattern = int(pattern[dashIndex]); 04529 } 04530 } 04531 04532 if (y2 > y1) { // 315 -> 360 and 135 -> 180 (unit circle degrees) 04533 y2 = qMin(y2, devRect.height() - 1); 04534 04535 incrE = dy * 2; 04536 d = incrE - dx; 04537 incrNE = (dy - dx) * 2; 04538 04539 if (y > y2) 04540 goto flush_and_return; 04541 04542 while (x < x2) { 04543 if (d > 0) { 04544 ++y; 04545 d += incrNE; 04546 if (y > y2) 04547 goto flush_and_return; 04548 } else { 04549 d += incrE; 04550 } 04551 ++x; 04552 04553 if (x < 0 || y < 0) 04554 continue; 04555 04556 Q_ASSERT(x < devRect.width()); 04557 Q_ASSERT(y < devRect.height()); 04558 if (inDash) { 04559 if (current == NSPANS) { 04560 span_func(NSPANS, spans, data); 04561 current = 0; 04562 } 04563 spans[current].len = 1; 04564 spans[current].coverage = 255; 04565 spans[current].x = x; 04566 spans[current].y = y; 04567 ++current; 04568 } 04569 if (--currPattern <= 0) { 04570 inDash = !inDash; 04571 dashIndex = (dashIndex + 1) % pattern.size(); 04572 currPattern = int(pattern[dashIndex]); 04573 } 04574 } 04575 } else { // 0-45 and 180->225 (unit circle degrees) 04576 y1 = qMin(y1, devRect.height() - 1); 04577 04578 incrE = dy * 2; 04579 d = incrE + dx; 04580 incrNE = (dy + dx) * 2; 04581 04582 if (y < 0) 04583 goto flush_and_return; 04584 04585 while (x < x2) { 04586 if (d < 0) { 04587 if (current > 0) { 04588 span_func(current, spans, data); 04589 current = 0; 04590 } 04591 04592 --y; 04593 d += incrNE; 04594 if (y < 0) 04595 goto flush_and_return; 04596 } else { 04597 d += incrE; 04598 } 04599 ++x; 04600 04601 if (x < 0 || y > y1) 04602 continue; 04603 04604 Q_ASSERT(x < devRect.width() && y < devRect.height()); 04605 if (inDash) { 04606 if (current == NSPANS) { 04607 span_func(NSPANS, spans, data); 04608 current = 0; 04609 } 04610 spans[current].len = 1; 04611 spans[current].coverage = 255; 04612 spans[current].x = x; 04613 spans[current].y = y; 04614 ++current; 04615 } 04616 if (--currPattern <= 0) { 04617 inDash = !inDash; 04618 dashIndex = (dashIndex + 1) % pattern.size(); 04619 currPattern = int(pattern[dashIndex]); 04620 } 04621 } 04622 } 04623 } else { 04624 04625 // if y is the major axis: 04626 04627 if (y2 < y1) { /* if coordinates are out of order */ 04628 qt_swap_int(y1, y2); 04629 dy = -dy; 04630 04631 qt_swap_int(x1, x2); 04632 dx = -dx; 04633 } 04634 04635 if (style == LineDrawNormal) 04636 --y2; 04637 04638 // In the loops below we increment before call the span function so 04639 // we need to stop one pixel before 04640 y2 = qMin(y2, devRect.height() - 1); 04641 04642 // completely clipped, so abort 04643 if (y2 <= y1) 04644 goto flush_and_return; 04645 04646 x = x1; 04647 y = y1; 04648 04649 if (x>=0 && y>=0 && x < devRect.width()) { 04650 Q_ASSERT(x >= 0 && y >= 0 && x < devRect.width() && y < devRect.height()); 04651 if (inDash) { 04652 if (current == NSPANS) { 04653 span_func(NSPANS, spans, data); 04654 current = 0; 04655 } 04656 spans[current].len = 1; 04657 spans[current].coverage = 255; 04658 spans[current].x = x; 04659 spans[current].y = y; 04660 ++current; 04661 } 04662 if (--currPattern <= 0) { 04663 inDash = !inDash; 04664 dashIndex = (dashIndex + 1) % pattern.size(); 04665 currPattern = int(pattern[dashIndex]); 04666 } 04667 } 04668 04669 if (x2 > x1) { // 90 -> 135 and 270 -> 315 (unit circle degrees) 04670 x2 = qMin(x2, devRect.width() - 1); 04671 incrE = dx * 2; 04672 d = incrE - dy; 04673 incrNE = (dx - dy) * 2; 04674 04675 if (x > x2) 04676 goto flush_and_return; 04677 04678 while (y < y2) { 04679 if (d > 0) { 04680 ++x; 04681 d += incrNE; 04682 if (x > x2) 04683 goto flush_and_return; 04684 } else { 04685 d += incrE; 04686 } 04687 ++y; 04688 if (x < 0 || y < 0) 04689 continue; 04690 Q_ASSERT(x < devRect.width() && y < devRect.height()); 04691 if (inDash) { 04692 if (current == NSPANS) { 04693 span_func(NSPANS, spans, data); 04694 current = 0; 04695 } 04696 spans[current].len = 1; 04697 spans[current].coverage = 255; 04698 spans[current].x = x; 04699 spans[current].y = y; 04700 ++current; 04701 } 04702 if (--currPattern <= 0) { 04703 inDash = !inDash; 04704 dashIndex = (dashIndex + 1) % pattern.size(); 04705 currPattern = int(pattern[dashIndex]); 04706 } 04707 } 04708 } else { // 45 -> 90 and 225 -> 270 (unit circle degrees) 04709 x1 = qMin(x1, devRect.width() - 1); 04710 incrE = dx * 2; 04711 d = incrE + dy; 04712 incrNE = (dx + dy) * 2; 04713 04714 if (x < 0) 04715 goto flush_and_return; 04716 04717 while (y < y2) { 04718 if (d < 0) { 04719 --x; 04720 d += incrNE; 04721 if (x < 0) 04722 goto flush_and_return; 04723 } else { 04724 d += incrE; 04725 } 04726 ++y; 04727 if (y < 0 || x > x1) 04728 continue; 04729 Q_ASSERT(x >= 0 && x < devRect.width() && y >= 0 && y < devRect.height()); 04730 if (inDash) { 04731 if (current == NSPANS) { 04732 span_func(NSPANS, spans, data); 04733 current = 0; 04734 } 04735 spans[current].len = 1; 04736 spans[current].coverage = 255; 04737 spans[current].x = x; 04738 spans[current].y = y; 04739 ++current; 04740 } 04741 if (--currPattern <= 0) { 04742 inDash = !inDash; 04743 dashIndex = (dashIndex + 1) % pattern.size(); 04744 currPattern = int(pattern[dashIndex]); 04745 } 04746 } 04747 } 04748 } 04749 flush_and_return: 04750 if (current > 0) 04751 span_func(current, ordered ? spans : spans + (NSPANS - current), data); 04752 04753 // adjust offset 04754 if (reversed) { 04755 *patternOffset = (patternLength - 1 - *patternOffset); 04756 } else { 04757 *patternOffset = 0; 04758 for (int i = 0; i <= dashIndex; ++i) 04759 *patternOffset += int(pattern[i]); 04760 *patternOffset += patternLength - currPattern - 1; 04761 *patternOffset = (*patternOffset % patternLength); 04762 } 04763 }
Here is the call graph for this function:

| static void drawLine_midpoint_i | ( | int | x1, | |
| int | y1, | |||
| int | x2, | |||
| int | y2, | |||
| ProcessSpans | span_func, | |||
| QSpanData * | data, | |||
| LineDrawMode | style, | |||
| const QRect & | devRect | |||
| ) | [static] |
Definition at line 4040 of file qpaintengine_raster.cpp.
References QT_FT_Span_::coverage, d, data, fillRect(), QRect::height(), index, QT_FT_Span_::len, LineDrawNormal, qDebug(), qMax(), qMin(), qt_swap_int, start, QRect::width(), QT_FT_Span_::x, and QT_FT_Span_::y.
Referenced by QRasterPaintEngine::drawLines(), and QRasterPaintEngine::drawPolygon().
04042 { 04043 #ifdef QT_DEBUG_DRAW 04044 qDebug() << " - drawLine_midpoint_i" << QLine(QPoint(x1, y1), QPoint(x2, y2)); 04045 #endif 04046 04047 int x, y; 04048 int dx, dy, d, incrE, incrNE; 04049 04050 dx = x2 - x1; 04051 dy = y2 - y1; 04052 04053 const int NSPANS = 256; 04054 QT_FT_Span spans[NSPANS]; 04055 int current = 0; 04056 bool ordered = true; 04057 04058 if (dy == 0) { 04059 // specialcase horizontal lines 04060 if (y1 >= 0 && y1 < devRect.height()) { 04061 int start = qMax(0, qMin(x1, x2)); 04062 int stop = qMax(x1, x2) + 1; 04063 int stop_clipped = qMin(devRect.width(), stop); 04064 int len = stop_clipped - start; 04065 if (style == LineDrawNormal && stop == stop_clipped) 04066 len--; 04067 if (len > 0) { 04068 spans[0].x = ushort(start); 04069 spans[0].len = ushort(len); 04070 spans[0].y = y1; 04071 spans[0].coverage = 255; 04072 span_func(1, spans, data); 04073 } 04074 } 04075 return; 04076 } else if (dx == 0) { 04077 // specialcase vertical lines 04078 if (x1 >= 0 && x1 < devRect.width()) { 04079 int start = qMax(0, qMin(y1, y2)); 04080 int stop = qMax(y1, y2) + 1; 04081 int stop_clipped = qMin(devRect.height(), stop); 04082 int len = stop_clipped - start; 04083 if (style == LineDrawNormal && stop == stop_clipped) 04084 len--; 04085 #ifdef QT_EXPERIMENTAL_REGIONS 04086 if (len > 0) 04087 fillRect(QRect(x1, start, 1, len), QRegion(), data); 04088 #else 04089 if (len > 0) 04090 fillRect(QRect(x1, start, 1, len), data); 04091 #endif 04092 } 04093 return; 04094 } 04095 04096 04097 if (qAbs(dx) >= qAbs(dy)) { /* if x is the major axis: */ 04098 04099 if (x2 < x1) { /* if coordinates are out of order */ 04100 qt_swap_int(x1, x2); 04101 dx = -dx; 04102 04103 qt_swap_int(y1, y2); 04104 dy = -dy; 04105 } 04106 04107 if (style == LineDrawNormal) 04108 --x2; 04109 04110 // In the loops below we increment before call the span function so 04111 // we need to stop one pixel before 04112 x2 = qMin(x2, devRect.width() - 1); 04113 04114 // completely clipped, so abort 04115 if (x2 <= x1) { 04116 return; 04117 } 04118 04119 int x = x1; 04120 int y = y1; 04121 04122 if (y2 <= y1) 04123 ordered = false; 04124 04125 { 04126 const int index = (ordered ? current : NSPANS - 1 - current); 04127 spans[index].coverage = 255; 04128 spans[index].x = x; 04129 spans[index].y = y; 04130 04131 if (x >= 0 && y >= 0 && y < devRect.height()) 04132 spans[index].len = 1; 04133 else 04134 spans[index].len = 0; 04135 } 04136 04137 if (y2 > y1) { // 315 -> 360 and 135 -> 180 (unit circle degrees) 04138 y2 = qMin(y2, devRect.height() - 1); 04139 04140 incrE = dy * 2; 04141 d = incrE - dx; 04142 incrNE = (dy - dx) * 2; 04143 04144 if (y > y2) 04145 goto flush_and_return; 04146 04147 while (x < x2) { 04148 ++x; 04149 if (d > 0) { 04150 if (spans[current].len > 0) 04151 ++current; 04152 if (current == NSPANS) { 04153 span_func(NSPANS, spans, data); 04154 current = 0; 04155 } 04156 04157 ++y; 04158 d += incrNE; 04159 if (y > y2) 04160 goto flush_and_return; 04161 04162 spans[current].len = 0; 04163 spans[current].coverage = 255; 04164 spans[current].x = x; 04165 spans[current].y = y; 04166 } else { 04167 d += incrE; 04168 if (x == 0) 04169 spans[current].x = 0; 04170 } 04171 04172 if (x < 0 || y < 0) 04173 continue; 04174 04175 Q_ASSERT(x<devRect.width()); 04176 Q_ASSERT(y<devRect.height()); 04177 Q_ASSERT(spans[current].y == y); 04178 spans[current].len++; 04179 } 04180 if (spans[current].len > 0) { 04181 ++current; 04182 } 04183 } else { // 0-45 and 180->225 (unit circle degrees) 04184 04185 y1 = qMin(y1, devRect.height() - 1); 04186 04187 incrE = dy * 2; 04188 d = incrE + dx; 04189 incrNE = (dy + dx) * 2; 04190 04191 if (y < 0) 04192 goto flush_and_return; 04193 04194 while (x < x2) { 04195 ++x; 04196 if (d < 0) { 04197 if (spans[NSPANS - 1 - current].len > 0) 04198 ++current; 04199 if (current == NSPANS) { 04200 span_func(NSPANS, spans, data); 04201 current = 0; 04202 } 04203 04204 --y; 04205 d += incrNE; 04206 if (y < 0) 04207 goto flush_and_return; 04208 04209 const int index = NSPANS - 1 - current; 04210 spans[index].len = 0; 04211 spans[index].coverage = 255; 04212 spans[index].x = x; 04213 spans[index].y = y; 04214 } else { 04215 d += incrE; 04216 if (x == 0) 04217 spans[NSPANS - 1 - current].x = 0; 04218 } 04219 04220 if (x < 0 || y > y1) 04221 continue; 04222 04223 Q_ASSERT(x<devRect.width() && y<devRect.height()); 04224 Q_ASSERT(spans[NSPANS - 1 - current].y == y); 04225 spans[NSPANS - 1 - current].len++; 04226 } 04227 if (spans[NSPANS - 1 - current].len > 0) { 04228 ++current; 04229 } 04230 } 04231 04232 } else { 04233 04234 // if y is the major axis: 04235 04236 if (y2 < y1) { /* if coordinates are out of order */ 04237 qt_swap_int(y1, y2); 04238 dy = -dy; 04239 04240 qt_swap_int(x1, x2); 04241 dx = -dx; 04242 } 04243 04244 if (style == LineDrawNormal) 04245 --y2; 04246 04247 // In the loops below we increment before call the span function so 04248 // we need to stop one pixel before 04249 y2 = qMin(y2, devRect.height() - 1); 04250 04251 // completely clipped, so abort 04252 if (y2 <= y1) { 04253 return; 04254 } 04255 04256 x = x1; 04257 y = y1; 04258 04259 if (x>=0 && y>=0 && x < devRect.width()) { 04260 Q_ASSERT(x >= 0 && y >= 0 && x < devRect.width() && y < devRect.height()); 04261 if (current == NSPANS) { 04262 span_func(NSPANS, spans, data); 04263 current = 0; 04264 } 04265 spans[current].len = 1; 04266 spans[current].coverage = 255; 04267 spans[current].x = x; 04268 spans[current].y = y; 04269 ++current; 04270 } 04271 04272 if (x2 > x1) { // 90 -> 135 and 270 -> 315 (unit circle degrees) 04273 x2 = qMin(x2, devRect.width() - 1); 04274 incrE = dx * 2; 04275 d = incrE - dy; 04276 incrNE = (dx - dy) * 2; 04277 04278 if (x > x2) 04279 goto flush_and_return; 04280 04281 while (y < y2) { 04282 if (d > 0) { 04283 ++x; 04284 d += incrNE; 04285 if (x > x2) 04286 goto flush_and_return; 04287 } else { 04288 d += incrE; 04289 } 04290 ++y; 04291 if (x < 0 || y < 0) 04292 continue; 04293 Q_ASSERT(x<devRect.width() && y<devRect.height()); 04294 if (current == NSPANS) { 04295 span_func(NSPANS, spans, data); 04296 current = 0; 04297 } 04298 spans[current].len = 1; 04299 spans[current].coverage = 255; 04300 spans[current].x = x; 04301 spans[current].y = y; 04302 ++current; 04303 } 04304 } else { // 45 -> 90 and 225 -> 270 (unit circle degrees) 04305 x1 = qMin(x1, devRect.width() - 1); 04306 incrE = dx * 2; 04307 d = incrE + dy; 04308 incrNE = (dx + dy) * 2; 04309 04310 if (x < 0) 04311 goto flush_and_return; 04312 04313 while (y < y2) { 04314 if (d < 0) { 04315 --x; 04316 d += incrNE; 04317 if (x < 0) 04318 goto flush_and_return; 04319 } else { 04320 d += incrE; 04321 } 04322 ++y; 04323 if (y < 0 || x > x1) 04324 continue; 04325 Q_ASSERT(x>=0 && x<devRect.width() && y>=0 && y<devRect.height()); 04326 if (current == NSPANS) { 04327 span_func(NSPANS, spans, data); 04328 current = 0; 04329 } 04330 spans[current].len = 1; 04331 spans[current].coverage = 255; 04332 spans[current].x = x; 04333 spans[current].y = y; 04334 ++current; 04335 } 04336 } 04337 } 04338 flush_and_return: 04339 if (current > 0) 04340 span_func(current, ordered ? spans : spans + (NSPANS - current), data); 04341 }
Here is the call graph for this function:

| static int ellipseSpansClipped | ( | QT_FT_Span * | spans, | |
| int | numSpans, | |||
| const QRect & | clip | |||
| ) | [inline, static] |
Definition at line 4770 of file qpaintengine_raster.cpp.
References QRect::bottomRight(), QT_FT_Span_::coverage, QT_FT_Span_::len, n, qMin(), QRect::topLeft(), QT_FT_Span_::x, QPoint::x(), QPoint::y(), and QT_FT_Span_::y.
Referenced by drawEllipsePoints().
04772 { 04773 const short minx = clip.topLeft().x(); 04774 const short miny = clip.topLeft().y(); 04775 const short maxx = clip.bottomRight().x(); 04776 const short maxy = clip.bottomRight().y(); 04777 04778 int n = 0; 04779 for (int i = 0; i < numSpans; ++i) { 04780 if (spans[i].y > maxy 04781 || spans[i].y < miny 04782 || spans[i].x > maxx 04783 || spans[i].x + spans[i].len < minx) { 04784 continue; 04785 } 04786 if (spans[i].x < minx) { 04787 spans[n].len = qMin(spans[i].len - (minx - spans[i].x), maxx - minx + 1); 04788 spans[n].x = minx; 04789 } else { 04790 spans[n].x = spans[i].x; 04791 spans[n].len = qMin(spans[i].len, ushort(maxx - spans[n].x + 1)); 04792 } 04793 spans[n].y = spans[i].y; 04794 spans[n].coverage = spans[i].coverage; 04795 04796 ++n; 04797 } 04798 return n; 04799 }
Here is the call graph for this function:

Definition at line 1282 of file qpaintengine_raster.cpp.
References QT_FT_Span_::coverage, data, QRect::height(), i, len, QT_FT_Span_::len, n, QRect::normalized(), qMax(), qMin(), QRect::width(), QT_FT_Span_::x, QRect::x(), QRect::y(), y, and QT_FT_Span_::y.
Referenced by Q3TextDocument::draw(), QRenderRule::drawBackground(), QCleanlooksStyle::drawComplexControl(), QPlastiqueStyle::drawComplexControl(), QPlastiqueStyle::drawControl(), QRasterPaintEngine::drawImage(), drawLine_midpoint_i(), QPlastiqueStyle::drawPrimitive(), QRasterPaintEngine::drawRects(), and QRasterPaintEngine::drawTiledPixmap().
01284 { 01285 QRect rect = r.normalized(); 01286 int x1 = qMax(rect.x(), 0); 01287 int x2 = qMin(rect.width() + rect.x(), data->rasterBuffer->width()); 01288 int y1 = qMax(rect.y(), 0); 01289 int y2 = qMin(rect.height() + rect.y(), data->rasterBuffer->height()); 01290 QClipData *clip = data->rasterBuffer->clipEnabled ? data->rasterBuffer->clip : 0; 01291 if (clip) { 01292 x1 = qMax(x1, clip->xmin); 01293 x2 = qMin(x2, clip->xmax); 01294 y1 = qMax(y1, clip->ymin); 01295 y2 = qMin(y2, clip->ymax); 01296 } 01297 01298 #ifdef QT_EXPERIMENTAL_REGIONS 01299 ProcessSpans blend = qt_region_strictContains(clipRegion, rect) ? 01300 data->unclipped_blend : data->blend; 01301 #endif 01302 01303 int len = x2 - x1; 01304 01305 if (len > 0) { 01306 const int nspans = 256; 01307 QT_FT_Span spans[nspans]; 01308 01309 Q_ASSERT(data->blend); 01310 int y = y1; 01311 while (y < y2) { 01312 int n = qMin(nspans, y2 - y); 01313 int i = 0; 01314 while (i < n) { 01315 spans[i].x = x1; 01316 spans[i].len = len; 01317 spans[i].y = y + i; 01318 spans[i].coverage = 255; 01319 ++i; 01320 } 01321 01322 #ifdef QT_EXPERIMENTAL_REGIONS 01323 blend(n, spans, data); 01324 #else 01325 data->blend(n, spans, data); 01326 #endif 01327 y += n; 01328 } 01329 } 01330 }
Here is the call graph for this function:

| static void qt_ft_outline_cubic_to | ( | qfixed | c1x, | |
| qfixed | c1y, | |||
| qfixed | c2x, | |||
| qfixed | c2y, | |||
| qfixed | ex, | |||
| qfixed | ey, | |||
| void * | data | |||
| ) | [static] |
Definition at line 505 of file qpaintengine_raster.cpp.
References qt_fixed_to_real.
Referenced by QRasterPaintEngine::init().
00509 { 00510 ((QFTOutlineMapper *) data)->curveTo(QPointF(qt_fixed_to_real(c1x), qt_fixed_to_real(c1y)), 00511 QPointF(qt_fixed_to_real(c2x), qt_fixed_to_real(c2y)), 00512 QPointF(qt_fixed_to_real(ex), qt_fixed_to_real(ey))); 00513 }
Definition at line 500 of file qpaintengine_raster.cpp.
References qt_fixed_to_real.
Referenced by QRasterPaintEngine::init().
00501 { 00502 ((QFTOutlineMapper *) data)->lineTo(QPointF(qt_fixed_to_real(x), qt_fixed_to_real(y))); 00503 }
Definition at line 495 of file qpaintengine_raster.cpp.
References qt_fixed_to_real.
Referenced by QRasterPaintEngine::init().
00496 { 00497 ((QFTOutlineMapper *) data)->moveTo(QPointF(qt_fixed_to_real(x), qt_fixed_to_real(y))); 00498 }
Definition at line 148 of file qimage.cpp.
References QImage::Format_Indexed8, and image.
Referenced by QSpanData::initTexture().
00149 { 00150 return (image.d->format <= QImage::Format_Indexed8 && !image.d->colortable.isEmpty()) ? &image.d->colortable : 0; 00151 }
| static const QSpan* qt_intersect_spans | ( | const QClipData * | clip, | |
| int * | currentClip, | |||
| const QSpan * | spans, | |||
| const QSpan * | end, | |||
| QSpan ** | outSpans, | |||
| int | available | |||
| ) | [static] |
Definition at line 3414 of file qpaintengine_raster.cpp.
References QClipData::clipLines, QClipData::count, QT_FT_Span_::coverage, QT_FT_Span_::len, qMax(), qMin(), qt_div_255(), QClipData::ClipLine::spans, QClipData::spans, QT_FT_Span_::x, and QT_FT_Span_::y.
Referenced by qt_span_clip(), and qt_span_fill_clipped().
03417 { 03418 QSpan *out = *outSpans; 03419 03420 const QSpan *clipSpans = clip->spans + *currentClip; 03421 const QSpan *clipEnd = clip->spans + clip->count; 03422 03423 while (available && spans < end ) { 03424 if (clipSpans >= clipEnd) { 03425 spans = end; 03426 break; 03427 } 03428 if (clipSpans->y > spans->y) { 03429 ++spans; 03430 continue; 03431 } 03432 if (spans->y != clipSpans->y) { 03433 if (spans->y < clip->count && clip->clipLines[spans->y].spans) 03434 clipSpans = clip->clipLines[spans->y].spans; 03435 else 03436 ++clipSpans; 03437 continue; 03438 } 03439 Q_ASSERT(spans->y == clipSpans->y); 03440 03441 int sx1 = spans->x; 03442 int sx2 = sx1 + spans->len; 03443 int cx1 = clipSpans->x; 03444 int cx2 = cx1 + clipSpans->len; 03445 03446 if (cx1 < sx1 && cx2 < sx1) { 03447 ++clipSpans; 03448 continue; 03449 } else if (sx1 < cx1 && sx2 < cx1) { 03450 ++spans; 03451 continue; 03452 } 03453 int x = qMax(sx1, cx1); 03454 int len = qMin(sx2, cx2) - x; 03455 if (len) { 03456 out->x = qMax(sx1, cx1); 03457 out->len = qMin(sx2, cx2) - out->x; 03458 out->y = spans->y; 03459 out->coverage = qt_div_255(spans->coverage * clipSpans->coverage); 03460 ++out; 03461 --available; 03462 } 03463 if (sx2 < cx2) { 03464 ++spans; 03465 } else { 03466 ++clipSpans; 03467 } 03468 } 03469 03470 *outSpans = out; 03471 *currentClip = clipSpans - clip->spans; 03472 return spans; 03473 }
Here is the call graph for this function:

| static void qt_merge_clip | ( | const QClipData * | c1, | |
| const QClipData * | c2, | |||
| QClipData * | result | |||
| ) | [static] |
Definition at line 2766 of file qpaintengine_raster.cpp.
References QClipData::appendSpan(), QClipData::appendSpans(), b, buffer, QClipData::clipLines, QClipData::clipSpanHeight, QClipData::ClipLine::count, i, j, qMax(), and QClipData::ClipLine::spans.
Referenced by QRasterPaintEnginePrivate::updateClip_helper().
02767 { 02768 Q_ASSERT(c1->clipSpanHeight == c2->clipSpanHeight && c1->clipSpanHeight == result->clipSpanHeight); 02769 02770 // ### buffer overflow possible 02771 const int BUFFER_SIZE = 4096; 02772 int buffer[BUFFER_SIZE]; 02773 int *b = buffer; 02774 int bsize = BUFFER_SIZE; 02775 02776 for (int y = 0; y < c1->clipSpanHeight; ++y) { 02777 const QSpan *c1_spans = c1->clipLines[y].spans; 02778 int c1_count = c1->clipLines[y].count; 02779 const QSpan *c2_spans = c2->clipLines[y].spans; 02780 int c2_count = c2->clipLines[y].count; 02781 02782 if (c1_count == 0 && c2_count == 0) 02783 continue; 02784 if (c1_count == 0) { 02785 result->appendSpans(c2_spans, c2_count); 02786 continue; 02787 } else if (c2_count == 0) { 02788 result->appendSpans(c1_spans, c1_count); 02789 continue; 02790 } 02791 02792 // we need to merge the two 02793 02794 // find required length 02795 int max = qMax(c1_spans[c1_count - 1].x + c1_spans[c1_count - 1].len, 02796 c2_spans[c2_count - 1].x + c2_spans[c2_count - 1].len); 02797 if (max > bsize) { 02798 b = (int *)realloc(bsize == BUFFER_SIZE ? 0 : b, max*sizeof(int)); 02799 bsize = max; 02800 } 02801 memset(buffer, 0, BUFFER_SIZE * sizeof(int)); 02802 02803 // Fill with old spans. 02804 for (int i = 0; i < c1_count; ++i) { 02805 const QSpan *cs = c1_spans + i; 02806 for (int j=cs->x; j<cs->x + cs->len; ++j) 02807 buffer[j] = cs->coverage; 02808 } 02809 02810 // Fill with new spans 02811 for (int i = 0; i < c2_count; ++i) { 02812 const QSpan *cs = c2_spans + i; 02813 for (int j = cs->x; j < cs->x + cs->len; ++j) { 02814 buffer[j] += cs->coverage; 02815 if (buffer[j] > 255) 02816 buffer[j] = 255; 02817 } 02818 } 02819 02820 int x = 0; 02821 while (x<max) { 02822 02823 // Skip to next span 02824 while (x < max && buffer[x] == 0) ++x; 02825 if (x >= max) break; 02826 02827 int sx = x; 02828 int coverage = buffer[x]; 02829 02830 // Find length of span 02831 while (x < max && buffer[x] == coverage) 02832 ++x; 02833 02834 result->appendSpan(sx, x - sx, y, coverage); 02835 } 02836 } 02837 if (b != buffer) 02838 free(b); 02839 }
Here is the call graph for this function:

| static void qt_span_clip | ( | int | count, | |
| const QSpan * | spans, | |||
| void * | userData | |||
| ) | [static] |
Definition at line 3500 of file qpaintengine_raster.cpp.
References QClipData::allocated, QClipData::appendSpans(), QClipData::count, Qt::IntersectClip, ClipData::newClip, Qt::NoClip, ClipData::oldClip, ClipData::operation, qt_intersect_spans(), Qt::ReplaceClip, QClipData::spans, and Qt::UniteClip.
Referenced by QRasterPaintEnginePrivate::updateClip_helper().
03501 { 03502 ClipData *clipData = reinterpret_cast<ClipData *>(userData); 03503 // qDebug() << " qt_span_clip: " << count << clipData->operation; 03504 // for (int i = 0; i < count; ++i) { 03505 // qDebug() << " " << spans[i].x << spans[i].y << spans[i].len << spans[i].coverage; 03506 // } 03507 03508 switch (clipData->operation) { 03509 03510 case Qt::IntersectClip: 03511 { 03512 QClipData *newClip = clipData->newClip; 03513 int currentClip = 0; 03514 const QSpan *end = spans + count; 03515 while (spans < end) { 03516 QSpan *newspans = newClip->spans + newClip->count; 03517 spans = qt_intersect_spans(clipData->oldClip, ¤tClip, spans, end, 03518 &newspans, newClip->allocated - newClip->count); 03519 newClip->count = newspans - newClip->spans; 03520 if (spans < end) { 03521 newClip->allocated *= 2; 03522 newClip->spans = (QSpan *)realloc(newClip->spans, newClip->allocated*sizeof(QSpan)); 03523 } 03524 } 03525 } 03526 break; 03527 03528 case Qt::UniteClip: 03529 case Qt::ReplaceClip: 03530 clipData->newClip->appendSpans(spans, count); 03531 break; 03532 case Qt::NoClip: 03533 break; 03534 } 03535 }
Here is the call graph for this function:

| static void qt_span_fill_clipped | ( | int | count, | |
| const QSpan * | spans, | |||
| void * | userData | |||
| ) | [static] |
Definition at line 3475 of file qpaintengine_raster.cpp.
References QSpanData::blend, QRasterBuffer::clip, qt_intersect_spans(), QSpanData::rasterBuffer, and QSpanData::unclipped_blend.
Referenced by QSpanData::adjustSpanMethods(), and QRasterPaintEnginePrivate::rasterize().
03476 { 03477 // qDebug() << "qt_span_fill_clipped" << spanCount; 03478 QSpanData *fillData = reinterpret_cast<QSpanData *>(userData); 03479 03480 Q_ASSERT(fillData->blend && fillData->unclipped_blend); 03481 03482 QRasterBuffer *rb = fillData->rasterBuffer; 03483 Q_ASSERT(rb->clip); 03484 03485 const int NSPANS = 256; 03486 QSpan cspans[NSPANS]; 03487 int currentClip = 0; 03488 const QSpan *end = spans + spanCount; 03489 while (spans < end) { 03490 QSpan *clipped = cspans; 03491 spans = qt_intersect_spans(rb->clip, ¤tClip, spans, end, &clipped, NSPANS); 03492 // qDebug() << "processed " << processed << "clipped" << clipped-cspans 03493 // << "span:" << cspans->x << cspans->y << cspans->len << spans->coverage; 03494 03495 if (clipped - cspans) 03496 fillData->unclipped_blend(clipped - cspans, cspans, fillData); 03497 } 03498 }
Here is the call graph for this function:

| const int QT_RASTER_COORD_LIMIT = 16385 |
Definition at line 127 of file qpaintengine_raster.cpp.
Referenced by QFTOutlineMapper::endOutline().
1.5.1