//-------------------------------------------------------------------- template<class Scanline> void render(const Scanline& sl) { int y = sl.y(); unsigned num_spans = sl.num_spans(); typename Scanline::const_iterator span = sl.begin(); do { int x = span->x; const typename Scanline::cover_type* covers = span->covers; int num_pix = span->len; do { int a = (*covers++ * m_color.a) >> 8; m_ren.color(rgba8(m_color.r, m_color.g, m_color.b, a)); m_square.draw(m_ras, m_sl, m_ren, x, y); ++x; } while(--num_pix); } while(--num_spans); }
void QTessellatorPrivate::addEdges() { while (currentVertex < vertices.nPoints) { const Vertex *v = vertices.sorted[currentVertex]; if (v->y > y) break; if (v->flags & LineBeforeStarts) { // add new edge int start = vertices.prevPos(v); Edge e(vertices, start); int pos = scanline.findEdgePosition(e); QDEBUG() << " adding edge" << start << "at position" << pos; scanline.insert(pos, e); if (!mark_clever || !(v->flags & LineAfterEnds)) { if (pos > 0) scanline.edges[pos - 1]->mark = true; if (pos < scanline.size - 1) scanline.edges[pos + 1]->mark = true; } } if (v->flags & LineAfterStarts) { Edge e(vertices, vertices.position(v)); int pos = scanline.findEdgePosition(e); QDEBUG() << " adding edge" << vertices.position(v) << "at position" << pos; scanline.insert(pos, e); if (!mark_clever || !(v->flags & LineBeforeEnds)) { if (pos > 0) scanline.edges[pos - 1]->mark = true; if (pos < scanline.size - 1) scanline.edges[pos + 1]->mark = true; } } if (v->flags & LineAfterHorizontal) { int pos1 = scanline.findEdgePosition(v->x, v->y); const Vertex *next = vertices.next(v); Q_ASSERT(v->y == next->y); int pos2 = scanline.findEdgePosition(next->x, next->y); if (pos2 < pos1) qSwap(pos1, pos2); if (pos1 > 0) --pos1; if (pos2 == scanline.size) --pos2; //QDEBUG() << "marking horizontal edge from " << pos1 << "to" << pos2; scanline.markEdges(pos1, pos2); } ++currentVertex; } }
void SkRgnBuilder::blitH(int x, int y, int width) { if (fCurrScanline == NULL) { // first time fTop = (SkRegion::RunType)(y); fCurrScanline = (Scanline*)fStorage; fCurrScanline->fLastY = (SkRegion::RunType)(y); fCurrXPtr = fCurrScanline->firstX(); } else { SkASSERT(y >= fCurrScanline->fLastY); if (y > fCurrScanline->fLastY) { // if we get here, we're done with fCurrScanline fCurrScanline->fXCount = (SkRegion::RunType)((int)(fCurrXPtr - fCurrScanline->firstX())); int prevLastY = fCurrScanline->fLastY; if (!this->collapsWithPrev()) { fPrevScanline = fCurrScanline; fCurrScanline = fCurrScanline->nextScanline(); } if (y - 1 > prevLastY) { // insert empty run fCurrScanline->fLastY = (SkRegion::RunType)(y - 1); fCurrScanline->fXCount = 0; fCurrScanline = fCurrScanline->nextScanline(); } // setup for the new curr line fCurrScanline->fLastY = (SkRegion::RunType)(y); fCurrXPtr = fCurrScanline->firstX(); } } // check if we should extend the current run, or add a new one if (fCurrXPtr > fCurrScanline->firstX() && fCurrXPtr[-1] == x) { fCurrXPtr[-1] = (SkRegion::RunType)(x + width); } else { fCurrXPtr[0] = (SkRegion::RunType)(x); fCurrXPtr[1] = (SkRegion::RunType)(x + width); fCurrXPtr += 2; } SkASSERT(fCurrXPtr - fStorage < fStorageCount); }
void QTessellatorPrivate::processIntersections() { QDEBUG() << "PROCESS INTERSECTIONS"; // process intersections while (!intersections.isEmpty()) { Intersections::iterator it = intersections.begin(); if (it.key().y != y) break; // swap edges QDEBUG() << " swapping intersecting edges "; int min = scanline.size; int max = 0; Q27Dot5 xmin = INT_MAX; Q27Dot5 xmax = INT_MIN; int num = 0; while (1) { const Intersection &i = it.key(); int next = it->next; int edgePos = scanline.findEdge(i.edge); if (edgePos >= 0) { ++num; min = qMin(edgePos, min); max = qMax(edgePos, max); Edge *edge = scanline.edges[edgePos]; xmin = qMin(xmin, edge->positionAt(y)); xmax = qMax(xmax, edge->positionAt(y)); } Intersection key; key.y = y; key.edge = next; it = intersections.find(key); intersections.remove(i); if (it == intersections.end()) break; } if (num < 2) continue; Q_ASSERT(min != max); QDEBUG() << "sorting between" << min << "and" << max << "xpos=" << xmin << xmax; while (min > 0 && scanline.edges[min - 1]->positionAt(y) >= xmin) { QDEBUG() << " adding edge on left"; --min; } while (max + 1 < scanline.size && scanline.edges[max + 1]->positionAt(y) <= xmax) { QDEBUG() << " adding edge on right"; ++max; } qSort(scanline.edges + min, scanline.edges + max + 1, EdgeSorter(y)); #ifdef DEBUG for (int i = min; i <= max; ++i) QDEBUG() << " " << scanline.edges[i]->edge << "at pos" << i; #endif for (int i = min; i <= max; ++i) { Edge *edge = scanline.edges[i]; edge->intersect_left = true; edge->intersect_right = true; edge->mark = true; } } }