| Index: src/gpu/GrContext.cpp
|
| diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
|
| index 13de4fec26bce2a2bf5f53f62caed71a97feb103..3c230324169f5c461fe8d855d82a5c1e8ea41817 100755
|
| --- a/src/gpu/GrContext.cpp
|
| +++ b/src/gpu/GrContext.cpp
|
| @@ -315,7 +315,7 @@ GrTexture* GrContext::createResizedTexture(const GrSurfaceDesc& desc,
|
| uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType |
|
| GrDefaultGeoProcFactory::kLocalCoord_GPType;
|
| SkAutoTUnref<const GrGeometryProcessor> gp(
|
| - GrDefaultGeoProcFactory::Create(GrColor_WHITE, flags));
|
| + GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE));
|
|
|
| GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, gp->getVertexStride(), 0);
|
| SkASSERT(gp->getVertexStride() == 2 * sizeof(SkPoint));
|
| @@ -540,7 +540,7 @@ void GrContext::clear(const SkIRect* rect,
|
|
|
| AutoCheckFlush acf(this);
|
| GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::clear", this);
|
| - GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(NULL, NULL, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
| @@ -583,13 +583,13 @@ void GrContext::drawPaint(const GrPaint& origPaint, const SkMatrix& viewMatrix)
|
|
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, paint, &SkMatrix::I(), &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
|
|
| GR_CREATE_TRACE_MARKER("GrContext::drawPaintWithPerspective", target);
|
| - target->drawRect(&drawState, paint->getColor(), r, NULL, &localMatrix);
|
| + target->drawRect(&drawState, paint->getColor(), SkMatrix::I(), r, NULL, &localMatrix);
|
| }
|
| }
|
|
|
| @@ -692,14 +692,13 @@ void GrContext::drawRect(const GrPaint& paint,
|
|
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
|
|
| GR_CREATE_TRACE_MARKER("GrContext::drawRect", target);
|
| SkScalar width = NULL == strokeInfo ? -1 : strokeInfo->getStrokeRec().getWidth();
|
| - SkMatrix matrix = drawState.getViewMatrix();
|
|
|
| // Check if this is a full RT draw and can be replaced with a clear. We don't bother checking
|
| // cases where the RT is fully inside a stroke.
|
| @@ -716,7 +715,7 @@ void GrContext::drawRect(const GrPaint& paint,
|
| // Does the clip contain the entire RT?
|
| if (!checkClip || target->getClip()->fClipStack->quickContains(clipSpaceRTRect)) {
|
| SkMatrix invM;
|
| - if (!matrix.invert(&invM)) {
|
| + if (!viewMatrix.invert(&invM)) {
|
| return;
|
| }
|
| // Does the rect bound the RT?
|
| @@ -739,29 +738,26 @@ void GrContext::drawRect(const GrPaint& paint,
|
| GrColor color = paint.getColor();
|
| SkRect devBoundRect;
|
| bool needAA = paint.isAntiAlias() && !drawState.getRenderTarget()->isMultisampled();
|
| - bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, rect, width, matrix,
|
| - color);
|
| + bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, rect, width,
|
| + viewMatrix, color);
|
|
|
| if (doAA) {
|
| - SkMatrix invert;
|
| - if (!drawState.getViewMatrix().invert(&invert)) {
|
| - return;
|
| - }
|
| - GrDrawState::AutoViewMatrixRestore avmr(&drawState);
|
| -
|
| if (width >= 0) {
|
| const SkStrokeRec& strokeRec = strokeInfo->getStrokeRec();
|
| fAARectRenderer->strokeAARect(target,
|
| &drawState,
|
| color,
|
| - invert,
|
| + viewMatrix,
|
| rect,
|
| - matrix,
|
| devBoundRect,
|
| strokeRec);
|
| } else {
|
| // filled AA rect
|
| - fAARectRenderer->fillAARect(target, &drawState, color, invert, rect, matrix,
|
| + fAARectRenderer->fillAARect(target,
|
| + &drawState,
|
| + color,
|
| + viewMatrix,
|
| + rect,
|
| devBoundRect);
|
| }
|
| return;
|
| @@ -773,7 +769,11 @@ void GrContext::drawRect(const GrPaint& paint,
|
| // unitSquareVertexBuffer()
|
|
|
| static const int worstCaseVertCount = 10;
|
| - SkAutoTUnref<const GrGeometryProcessor> gp(GrDefaultGeoProcFactory::Create(color));
|
| + SkAutoTUnref<const GrGeometryProcessor> gp(
|
| + GrDefaultGeoProcFactory::Create(GrDefaultGeoProcFactory::kPosition_GPType,
|
| + color,
|
| + viewMatrix,
|
| + SkMatrix::I()));
|
| GrDrawTarget::AutoReleaseGeometry geo(target,
|
| worstCaseVertCount,
|
| gp->getVertexStride(),
|
| @@ -807,7 +807,7 @@ void GrContext::drawRect(const GrPaint& paint,
|
| target->drawNonIndexed(&drawState, gp, primType, 0, vertCount);
|
| } else {
|
| // filled BW rect
|
| - target->drawSimpleRect(&drawState, color, rect);
|
| + target->drawSimpleRect(&drawState, color, viewMatrix, rect);
|
| }
|
| }
|
|
|
| @@ -818,21 +818,22 @@ void GrContext::drawNonAARectToRect(const GrPaint& paint,
|
| const SkMatrix* localMatrix) {
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
|
|
| GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target);
|
|
|
| - target->drawRect(&drawState, paint.getColor(), rectToDraw, &localRect, localMatrix);
|
| + target->drawRect(&drawState, paint.getColor(), viewMatrix, rectToDraw, &localRect, localMatrix);
|
| }
|
|
|
| static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords,
|
| const GrColor* colors,
|
| int* colorOffset,
|
| int* texOffset,
|
| - GrColor color) {
|
| + GrColor color,
|
| + const SkMatrix& viewMatrix) {
|
| *texOffset = -1;
|
| *colorOffset = -1;
|
| uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType;
|
| @@ -848,7 +849,7 @@ static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords
|
| *colorOffset = sizeof(SkPoint);
|
| flags |= GrDefaultGeoProcFactory::kColor_GPType;
|
| }
|
| - return GrDefaultGeoProcFactory::Create(color, flags);
|
| + return GrDefaultGeoProcFactory::Create(flags, color, viewMatrix, SkMatrix::I());
|
| }
|
|
|
| void GrContext::drawVertices(const GrPaint& paint,
|
| @@ -864,7 +865,7 @@ void GrContext::drawVertices(const GrPaint& paint,
|
| GrDrawState drawState;
|
| GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scope
|
|
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
| @@ -873,7 +874,8 @@ void GrContext::drawVertices(const GrPaint& paint,
|
|
|
| int colorOffset = -1, texOffset = -1;
|
| SkAutoTUnref<const GrGeometryProcessor> gp(
|
| - set_vertex_attributes(texCoords, colors, &colorOffset, &texOffset, paint.getColor()));
|
| + set_vertex_attributes(texCoords, colors, &colorOffset, &texOffset,
|
| + paint.getColor(), viewMatrix));
|
|
|
| size_t vertexStride = gp->getVertexStride();
|
| SkASSERT(vertexStride == sizeof(SkPoint) + (SkToBool(texCoords) ? sizeof(SkPoint) : 0)
|
| @@ -928,7 +930,7 @@ void GrContext::drawRRect(const GrPaint& paint,
|
|
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
| @@ -938,7 +940,7 @@ void GrContext::drawRRect(const GrPaint& paint,
|
| const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec();
|
|
|
| GrColor color = paint.getColor();
|
| - if (!fOvalRenderer->drawRRect(target, &drawState, color, paint.isAntiAlias(), rrect,
|
| + if (!fOvalRenderer->drawRRect(target, &drawState, color, viewMatrix, paint.isAntiAlias(), rrect,
|
| strokeRec)) {
|
| SkPath path;
|
| path.addRRect(rrect);
|
| @@ -959,12 +961,12 @@ void GrContext::drawDRRect(const GrPaint& paint,
|
|
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
|
|
| GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target);
|
|
|
| GrColor color = paint.getColor();
|
| - if (!fOvalRenderer->drawDRRect(target, &drawState, color, paint.isAntiAlias(), outer, inner)) {
|
| + if (!fOvalRenderer->drawDRRect(target, &drawState, color, viewMatrix, paint.isAntiAlias(), outer, inner)) {
|
| SkPath path;
|
| path.addRRect(inner);
|
| path.addRRect(outer);
|
| @@ -995,7 +997,7 @@ void GrContext::drawOval(const GrPaint& paint,
|
|
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
| @@ -1005,7 +1007,8 @@ void GrContext::drawOval(const GrPaint& paint,
|
| const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec();
|
|
|
| GrColor color = paint.getColor();
|
| - if (!fOvalRenderer->drawOval(target, &drawState, color, paint.isAntiAlias(), oval, strokeRec)) {
|
| + if (!fOvalRenderer->drawOval(target, &drawState, color, viewMatrix, paint.isAntiAlias(), oval,
|
| + strokeRec)) {
|
| SkPath path;
|
| path.addOval(oval);
|
| this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path,
|
| @@ -1017,6 +1020,7 @@ void GrContext::drawOval(const GrPaint& paint,
|
| static bool is_nested_rects(GrDrawTarget* target,
|
| GrDrawState* drawState,
|
| GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| const SkPath& path,
|
| const SkStrokeRec& stroke,
|
| SkRect rects[2]) {
|
| @@ -1028,7 +1032,7 @@ static bool is_nested_rects(GrDrawTarget* target,
|
|
|
| // TODO: this restriction could be lifted if we were willing to apply
|
| // the matrix to all the points individually rather than just to the rect
|
| - if (!drawState->getViewMatrix().preservesAxisAlignment()) {
|
| + if (!viewMatrix.preservesAxisAlignment()) {
|
| return false;
|
| }
|
|
|
| @@ -1088,13 +1092,13 @@ void GrContext::drawPath(const GrPaint& paint,
|
| if (path.isLine(pts)) {
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
|
|
| - if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, color, pts, paint,
|
| - strokeInfo)) {
|
| + if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, color, viewMatrix, pts,
|
| + paint, strokeInfo)) {
|
| return;
|
| }
|
| }
|
| @@ -1120,7 +1124,7 @@ void GrContext::drawPath(const GrPaint& paint,
|
| // OK.
|
| AutoCheckFlush acf(this);
|
| GrDrawState drawState;
|
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
| @@ -1135,17 +1139,8 @@ void GrContext::drawPath(const GrPaint& paint,
|
| // Concave AA paths are expensive - try to avoid them for special cases
|
| SkRect rects[2];
|
|
|
| - if (is_nested_rects(target, &drawState, color, path, strokeRec, rects)) {
|
| - SkMatrix origViewMatrix = drawState.getViewMatrix();
|
| -
|
| - SkMatrix invert;
|
| - if (!drawState.getViewMatrix().invert(&invert)) {
|
| - return;
|
| - }
|
| - GrDrawState::AutoViewMatrixRestore avmr(&drawState);
|
| -
|
| - fAARectRenderer->fillAANestedRects(target, &drawState, color, invert, rects,
|
| - origViewMatrix);
|
| + if (is_nested_rects(target, &drawState, color, viewMatrix, path, strokeRec, rects)) {
|
| + fAARectRenderer->fillAANestedRects(target, &drawState, color, viewMatrix,rects);
|
| return;
|
| }
|
| }
|
| @@ -1153,9 +1148,9 @@ void GrContext::drawPath(const GrPaint& paint,
|
| SkRect ovalRect;
|
| bool isOval = path.isOval(&ovalRect);
|
|
|
| - if (!isOval || path.isInverseFillType()
|
| - || !fOvalRenderer->drawOval(target, &drawState, color, paint.isAntiAlias(), ovalRect,
|
| - strokeRec)) {
|
| + if (!isOval || path.isInverseFillType() ||
|
| + !fOvalRenderer->drawOval(target, &drawState, color, viewMatrix, paint.isAntiAlias(),
|
| + ovalRect, strokeRec)) {
|
| this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path,
|
| strokeInfo);
|
| }
|
| @@ -1191,7 +1186,8 @@ void GrContext::internalDrawPath(GrDrawTarget* target,
|
| SkTCopyOnFirstWrite<SkStrokeRec> stroke(strokeInfo.getStrokeRec());
|
|
|
| // Try a 1st time without stroking the path and without allowing the SW renderer
|
| - GrPathRenderer* pr = this->getPathRenderer(target, drawState, *pathPtr, *stroke, false, type);
|
| + GrPathRenderer* pr = this->getPathRenderer(target, drawState, viewMatrix, *pathPtr, *stroke,
|
| + false, type);
|
|
|
| if (NULL == pr) {
|
| if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*stroke, viewMatrix, NULL)) {
|
| @@ -1206,7 +1202,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target,
|
| }
|
|
|
| // This time, allow SW renderer
|
| - pr = this->getPathRenderer(target, drawState, *pathPtr, *stroke, true, type);
|
| + pr = this->getPathRenderer(target, drawState, viewMatrix, *pathPtr, *stroke, true, type);
|
| }
|
|
|
| if (NULL == pr) {
|
| @@ -1216,7 +1212,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target,
|
| return;
|
| }
|
|
|
| - pr->drawPath(target, drawState, color, *pathPtr, *stroke, useCoverageAA);
|
| + pr->drawPath(target, drawState, color, viewMatrix, *pathPtr, *stroke, useCoverageAA);
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -1351,14 +1347,14 @@ bool GrContext::writeSurfacePixels(GrSurface* surface,
|
| // drawing a rect to the render target.
|
| // The bracket ensures we pop the stack if we wind up flushing below.
|
| {
|
| - GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL, NULL);
|
| + GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL);
|
| GrDrawTarget::AutoGeometryPush agp(drawTarget);
|
|
|
| - GrDrawState drawState(matrix);
|
| + GrDrawState drawState;
|
| drawState.addColorProcessor(fp);
|
| drawState.setRenderTarget(renderTarget);
|
| - drawTarget->drawSimpleRect(&drawState, GrColor_WHITE,SkRect::MakeWH(SkIntToScalar(width),
|
| - SkIntToScalar(height)));
|
| + drawTarget->drawSimpleRect(&drawState, GrColor_WHITE, matrix,
|
| + SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)));
|
| }
|
|
|
| if (kFlushWrites_PixelOp & pixelOpsFlags) {
|
| @@ -1479,7 +1475,7 @@ bool GrContext::readRenderTargetPixels(GrRenderTarget* target,
|
|
|
| drawState.setRenderTarget(tempTexture->asRenderTarget());
|
| SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
|
| - fDrawBuffer->drawSimpleRect(&drawState, GrColor_WHITE, rect);
|
| + fDrawBuffer->drawSimpleRect(&drawState, GrColor_WHITE, SkMatrix::I(), rect);
|
| // we want to read back from the scratch's origin
|
| left = 0;
|
| top = 0;
|
| @@ -1532,7 +1528,7 @@ void GrContext::discardRenderTarget(GrRenderTarget* renderTarget) {
|
| SkASSERT(renderTarget);
|
| ASSERT_OWNED_RESOURCE(renderTarget);
|
| AutoCheckFlush acf(this);
|
| - GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, &acf);
|
| + GrDrawTarget* target = this->prepareToDraw(NULL, NULL, &acf);
|
| if (NULL == target) {
|
| return;
|
| }
|
| @@ -1550,7 +1546,7 @@ void GrContext::copySurface(GrSurface* dst, GrSurface* src, const SkIRect& srcRe
|
| // Since we're going to the draw target and not GPU, no need to check kNoFlush
|
| // here.
|
|
|
| - GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, NULL);
|
| + GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL);
|
| if (NULL == target) {
|
| return;
|
| }
|
| @@ -1569,7 +1565,6 @@ void GrContext::flushSurfaceWrites(GrSurface* surface) {
|
|
|
| GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds,
|
| const GrPaint* paint,
|
| - const SkMatrix* viewMatrix,
|
| const AutoCheckFlush* acf) {
|
| if (NULL == fGpu) {
|
| return NULL;
|
| @@ -1577,10 +1572,9 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds,
|
|
|
| ASSERT_OWNED_RESOURCE(fRenderTarget.get());
|
| if (ds) {
|
| - SkASSERT(viewMatrix);
|
| if (paint) {
|
| SkASSERT(acf);
|
| - ds->setFromPaint(*paint, *viewMatrix, fRenderTarget.get());
|
| + ds->setFromPaint(*paint, fRenderTarget.get());
|
| #if GR_DEBUG_PARTIAL_COVERAGE_CHECK
|
| if ((paint->hasMask()) &&
|
| !fDrawState->canUseFracCoveragePrimProc(paint.getColor(), fGpu->caps())) {
|
| @@ -1588,7 +1582,7 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds,
|
| }
|
| #endif
|
| } else {
|
| - ds->reset(*viewMatrix);
|
| + ds->reset();
|
| ds->setRenderTarget(fRenderTarget.get());
|
| }
|
| ds->setState(GrDrawState::kClip_StateBit, fClip && !fClip->fClipStack->isWideOpen());
|
| @@ -1605,6 +1599,7 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds,
|
| */
|
| GrPathRenderer* GrContext::getPathRenderer(const GrDrawTarget* target,
|
| const GrDrawState* drawState,
|
| + const SkMatrix& viewMatrix,
|
| const SkPath& path,
|
| const SkStrokeRec& stroke,
|
| bool allowSW,
|
| @@ -1617,6 +1612,7 @@ GrPathRenderer* GrContext::getPathRenderer(const GrDrawTarget* target,
|
|
|
| GrPathRenderer* pr = fPathRendererChain->getPathRenderer(target,
|
| drawState,
|
| + viewMatrix,
|
| path,
|
| stroke,
|
| drawType,
|
| @@ -1674,7 +1670,7 @@ void GrContext::setupDrawBuffer() {
|
| }
|
|
|
| GrDrawTarget* GrContext::getTextTarget() {
|
| - return this->prepareToDraw(NULL, NULL, NULL, NULL);
|
| + return this->prepareToDraw(NULL, NULL, NULL);
|
| }
|
|
|
| const GrIndexBuffer* GrContext::getQuadIndexBuffer() const {
|
|
|