src/gui/painting/qpaintengine_raster.cpp File Reference

#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 QSpanqt_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 Documentation

#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 (  )     (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,
 )     { 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,
 )     { qreal tmp = (x); (x) = (y); (y) = tmp; }

Definition at line 82 of file qpaintengine_raster.cpp.


Enumeration Type Documentation

enum LineDrawMode

Definition at line 105 of file qpaintengine_raster.cpp.

00105                   {
00106     LineDrawClipped,
00107     LineDrawNormal,
00108     LineDrawIncludeLastPixel
00109 };


Function Documentation

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:

static void fillRect ( const QRect r,
QSpanData data 
) [static]

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 }

static void qt_ft_outline_line_to ( qfixed  x,
qfixed  y,
void *  data 
) [static]

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 }

static void qt_ft_outline_move_to ( qfixed  x,
qfixed  y,
void *  data 
) [static]

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 }

const QVector<QRgb>* qt_image_colortable ( const QImage image  ) 

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, &currentClip, 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, &currentClip, 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:


Variable Documentation

const int QT_RASTER_COORD_LIMIT = 16385

Definition at line 127 of file qpaintengine_raster.cpp.

Referenced by QFTOutlineMapper::endOutline().


Generated on Thu Mar 15 13:34:49 2007 for Qt 4.2 User's Guide by  doxygen 1.5.1