| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrAtlasTextContext.h" | 9 #include "GrAtlasTextContext.h" |
| 10 #include "GrBatchTest.h" | 10 #include "GrBatchTest.h" |
| 11 #include "GrColor.h" | 11 #include "GrColor.h" |
| 12 #include "GrDrawContext.h" | 12 #include "GrDrawContext.h" |
| 13 #include "GrOvalRenderer.h" | 13 #include "GrOvalRenderer.h" |
| 14 #include "GrPathRenderer.h" | 14 #include "GrPathRenderer.h" |
| 15 #include "GrRenderTarget.h" | 15 #include "GrRenderTarget.h" |
| 16 #include "GrRenderTargetPriv.h" | 16 #include "GrRenderTargetPriv.h" |
| 17 #include "GrStencilAndCoverTextContext.h" | 17 #include "GrStencilAndCoverTextContext.h" |
| 18 | 18 |
| 19 #include "batches/GrBatch.h" | 19 #include "batches/GrBatch.h" |
| 20 #include "batches/GrDrawAtlasBatch.h" | 20 #include "batches/GrDrawAtlasBatch.h" |
| 21 #include "batches/GrDrawVerticesBatch.h" | 21 #include "batches/GrDrawVerticesBatch.h" |
| 22 #include "batches/GrRectBatchFactory.h" | 22 #include "batches/GrRectBatchFactory.h" |
| 23 | 23 |
| 24 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fContext) | 24 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fContext) |
| 25 #define RETURN_IF_ABANDONED if (!fDrawTarget) { return; } | 25 #define RETURN_IF_ABANDONED if (!fDrawTarget) { return; } |
| 26 #define RETURN_FALSE_IF_ABANDONED if (!fDrawTarget) { return false; } | 26 #define RETURN_FALSE_IF_ABANDONED if (!fDrawTarget) { return false; } |
| 27 #define RETURN_NULL_IF_ABANDONED if (!fDrawTarget) { return NULL; } | 27 #define RETURN_NULL_IF_ABANDONED if (!fDrawTarget) { return nullptr; } |
| 28 | 28 |
| 29 class AutoCheckFlush { | 29 class AutoCheckFlush { |
| 30 public: | 30 public: |
| 31 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} | 31 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} |
| 32 ~AutoCheckFlush() { fContext->flushIfNecessary(); } | 32 ~AutoCheckFlush() { fContext->flushIfNecessary(); } |
| 33 | 33 |
| 34 private: | 34 private: |
| 35 GrContext* fContext; | 35 GrContext* fContext; |
| 36 }; | 36 }; |
| 37 | 37 |
| 38 GrDrawContext::GrDrawContext(GrContext* context, | 38 GrDrawContext::GrDrawContext(GrContext* context, |
| 39 GrDrawTarget* drawTarget, | 39 GrDrawTarget* drawTarget, |
| 40 const SkSurfaceProps& surfaceProps) | 40 const SkSurfaceProps& surfaceProps) |
| 41 : fContext(context) | 41 : fContext(context) |
| 42 , fDrawTarget(SkRef(drawTarget)) | 42 , fDrawTarget(SkRef(drawTarget)) |
| 43 , fTextContext(NULL) | 43 , fTextContext(nullptr) |
| 44 , fSurfaceProps(surfaceProps) { | 44 , fSurfaceProps(surfaceProps) { |
| 45 } | 45 } |
| 46 | 46 |
| 47 GrDrawContext::~GrDrawContext() { | 47 GrDrawContext::~GrDrawContext() { |
| 48 SkSafeUnref(fDrawTarget); | 48 SkSafeUnref(fDrawTarget); |
| 49 delete fTextContext; | 49 delete fTextContext; |
| 50 } | 50 } |
| 51 | 51 |
| 52 void GrDrawContext::copySurface(GrRenderTarget* dst, GrSurface* src, | 52 void GrDrawContext::copySurface(GrRenderTarget* dst, GrSurface* src, |
| 53 const SkIRect& srcRect, const SkIPoint& dstPoint
) { | 53 const SkIRect& srcRect, const SkIPoint& dstPoint
) { |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 return; | 223 return; |
| 224 } | 224 } |
| 225 | 225 |
| 226 AutoCheckFlush acf(fContext); | 226 AutoCheckFlush acf(fContext); |
| 227 if (!this->prepareToDraw(rt)) { | 227 if (!this->prepareToDraw(rt)) { |
| 228 return; | 228 return; |
| 229 } | 229 } |
| 230 | 230 |
| 231 GrPipelineBuilder pipelineBuilder(paint, rt, clip); | 231 GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
| 232 | 232 |
| 233 SkScalar width = NULL == strokeInfo ? -1 : strokeInfo->getWidth(); | 233 SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth(); |
| 234 | 234 |
| 235 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking | 235 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking |
| 236 // cases where the RT is fully inside a stroke. | 236 // cases where the RT is fully inside a stroke. |
| 237 if (width < 0) { | 237 if (width < 0) { |
| 238 SkRect rtRect; | 238 SkRect rtRect; |
| 239 pipelineBuilder.getRenderTarget()->getBoundsRect(&rtRect); | 239 pipelineBuilder.getRenderTarget()->getBoundsRect(&rtRect); |
| 240 SkRect clipSpaceRTRect = rtRect; | 240 SkRect clipSpaceRTRect = rtRect; |
| 241 bool checkClip = GrClip::kWideOpen_ClipType != clip.clipType(); | 241 bool checkClip = GrClip::kWideOpen_ClipType != clip.clipType(); |
| 242 if (checkClip) { | 242 if (checkClip) { |
| 243 clipSpaceRTRect.offset(SkIntToScalar(clip.origin().fX), | 243 clipSpaceRTRect.offset(SkIntToScalar(clip.origin().fX), |
| 244 SkIntToScalar(clip.origin().fY)); | 244 SkIntToScalar(clip.origin().fY)); |
| 245 } | 245 } |
| 246 // Does the clip contain the entire RT? | 246 // Does the clip contain the entire RT? |
| 247 if (!checkClip || clip.quickContains(clipSpaceRTRect)) { | 247 if (!checkClip || clip.quickContains(clipSpaceRTRect)) { |
| 248 SkMatrix invM; | 248 SkMatrix invM; |
| 249 if (!viewMatrix.invert(&invM)) { | 249 if (!viewMatrix.invert(&invM)) { |
| 250 return; | 250 return; |
| 251 } | 251 } |
| 252 // Does the rect bound the RT? | 252 // Does the rect bound the RT? |
| 253 SkPoint srcSpaceRTQuad[4]; | 253 SkPoint srcSpaceRTQuad[4]; |
| 254 invM.mapRectToQuad(srcSpaceRTQuad, rtRect); | 254 invM.mapRectToQuad(srcSpaceRTQuad, rtRect); |
| 255 if (rect_contains_inclusive(rect, srcSpaceRTQuad[0]) && | 255 if (rect_contains_inclusive(rect, srcSpaceRTQuad[0]) && |
| 256 rect_contains_inclusive(rect, srcSpaceRTQuad[1]) && | 256 rect_contains_inclusive(rect, srcSpaceRTQuad[1]) && |
| 257 rect_contains_inclusive(rect, srcSpaceRTQuad[2]) && | 257 rect_contains_inclusive(rect, srcSpaceRTQuad[2]) && |
| 258 rect_contains_inclusive(rect, srcSpaceRTQuad[3])) { | 258 rect_contains_inclusive(rect, srcSpaceRTQuad[3])) { |
| 259 // Will it blend? | 259 // Will it blend? |
| 260 GrColor clearColor; | 260 GrColor clearColor; |
| 261 if (paint.isConstantBlendedColor(&clearColor)) { | 261 if (paint.isConstantBlendedColor(&clearColor)) { |
| 262 fDrawTarget->clear(NULL, clearColor, true, rt); | 262 fDrawTarget->clear(nullptr, clearColor, true, rt); |
| 263 return; | 263 return; |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 } | 266 } |
| 267 } | 267 } |
| 268 | 268 |
| 269 GrColor color = paint.getColor(); | 269 GrColor color = paint.getColor(); |
| 270 bool needAA = paint.isAntiAlias() && | 270 bool needAA = paint.isAntiAlias() && |
| 271 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); | 271 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
| 272 | 272 |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 | 692 |
| 693 const SkPath* pathPtr = &path; | 693 const SkPath* pathPtr = &path; |
| 694 SkTLazy<SkPath> tmpPath; | 694 SkTLazy<SkPath> tmpPath; |
| 695 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; | 695 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; |
| 696 | 696 |
| 697 // Try a 1st time without stroking the path and without allowing the SW rend
erer | 697 // Try a 1st time without stroking the path and without allowing the SW rend
erer |
| 698 GrPathRenderer* pr = fContext->getPathRenderer(target, pipelineBuilder, view
Matrix, *pathPtr, | 698 GrPathRenderer* pr = fContext->getPathRenderer(target, pipelineBuilder, view
Matrix, *pathPtr, |
| 699 *strokeInfoPtr, false, type)
; | 699 *strokeInfoPtr, false, type)
; |
| 700 | 700 |
| 701 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); | 701 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); |
| 702 if (NULL == pr && strokeInfo.isDashed()) { | 702 if (nullptr == pr && strokeInfo.isDashed()) { |
| 703 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. | 703 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. |
| 704 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { | 704 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { |
| 705 return; | 705 return; |
| 706 } | 706 } |
| 707 pathPtr = tmpPath.get(); | 707 pathPtr = tmpPath.get(); |
| 708 if (pathPtr->isEmpty()) { | 708 if (pathPtr->isEmpty()) { |
| 709 return; | 709 return; |
| 710 } | 710 } |
| 711 strokeInfoPtr = &dashlessStrokeInfo; | 711 strokeInfoPtr = &dashlessStrokeInfo; |
| 712 pr = fContext->getPathRenderer(target, pipelineBuilder, viewMatrix, *pat
hPtr, *strokeInfoPtr, | 712 pr = fContext->getPathRenderer(target, pipelineBuilder, viewMatrix, *pat
hPtr, *strokeInfoPtr, |
| 713 false, type); | 713 false, type); |
| 714 } | 714 } |
| 715 | 715 |
| 716 if (NULL == pr) { | 716 if (nullptr == pr) { |
| 717 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*strokeInfoPtr, viewMa
trix, NULL) && | 717 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*strokeInfoPtr, viewMa
trix, nullptr) && |
| 718 !strokeInfoPtr->isFillStyle()) { | 718 !strokeInfoPtr->isFillStyle()) { |
| 719 // It didn't work above, so try again with stroke converted to a fil
l. | 719 // It didn't work above, so try again with stroke converted to a fil
l. |
| 720 if (!tmpPath.isValid()) { | 720 if (!tmpPath.isValid()) { |
| 721 tmpPath.init(); | 721 tmpPath.init(); |
| 722 } | 722 } |
| 723 dashlessStrokeInfo.setResScale(SkScalarAbs(viewMatrix.getMaxScale())
); | 723 dashlessStrokeInfo.setResScale(SkScalarAbs(viewMatrix.getMaxScale())
); |
| 724 if (!dashlessStrokeInfo.applyToPath(tmpPath.get(), *pathPtr)) { | 724 if (!dashlessStrokeInfo.applyToPath(tmpPath.get(), *pathPtr)) { |
| 725 return; | 725 return; |
| 726 } | 726 } |
| 727 pathPtr = tmpPath.get(); | 727 pathPtr = tmpPath.get(); |
| 728 if (pathPtr->isEmpty()) { | 728 if (pathPtr->isEmpty()) { |
| 729 return; | 729 return; |
| 730 } | 730 } |
| 731 dashlessStrokeInfo.setFillStyle(); | 731 dashlessStrokeInfo.setFillStyle(); |
| 732 strokeInfoPtr = &dashlessStrokeInfo; | 732 strokeInfoPtr = &dashlessStrokeInfo; |
| 733 } | 733 } |
| 734 | 734 |
| 735 // This time, allow SW renderer | 735 // This time, allow SW renderer |
| 736 pr = fContext->getPathRenderer(target, pipelineBuilder, viewMatrix, *pat
hPtr, *strokeInfoPtr, | 736 pr = fContext->getPathRenderer(target, pipelineBuilder, viewMatrix, *pat
hPtr, *strokeInfoPtr, |
| 737 true, type); | 737 true, type); |
| 738 } | 738 } |
| 739 | 739 |
| 740 if (NULL == pr) { | 740 if (nullptr == pr) { |
| 741 #ifdef SK_DEBUG | 741 #ifdef SK_DEBUG |
| 742 SkDebugf("Unable to find path renderer compatible with path.\n"); | 742 SkDebugf("Unable to find path renderer compatible with path.\n"); |
| 743 #endif | 743 #endif |
| 744 return; | 744 return; |
| 745 } | 745 } |
| 746 | 746 |
| 747 GrPathRenderer::DrawPathArgs args; | 747 GrPathRenderer::DrawPathArgs args; |
| 748 args.fTarget = target; | 748 args.fTarget = target; |
| 749 args.fResourceProvider = fContext->resourceProvider(); | 749 args.fResourceProvider = fContext->resourceProvider(); |
| 750 args.fPipelineBuilder = pipelineBuilder; | 750 args.fPipelineBuilder = pipelineBuilder; |
| 751 args.fColor = color; | 751 args.fColor = color; |
| 752 args.fViewMatrix = &viewMatrix; | 752 args.fViewMatrix = &viewMatrix; |
| 753 args.fPath = pathPtr; | 753 args.fPath = pathPtr; |
| 754 args.fStroke = strokeInfoPtr; | 754 args.fStroke = strokeInfoPtr; |
| 755 args.fAntiAlias = useCoverageAA; | 755 args.fAntiAlias = useCoverageAA; |
| 756 pr->drawPath(args); | 756 pr->drawPath(args); |
| 757 } | 757 } |
| 758 | 758 |
| 759 bool GrDrawContext::prepareToDraw(GrRenderTarget* rt) { | 759 bool GrDrawContext::prepareToDraw(GrRenderTarget* rt) { |
| 760 RETURN_FALSE_IF_ABANDONED | 760 RETURN_FALSE_IF_ABANDONED |
| 761 | 761 |
| 762 ASSERT_OWNED_RESOURCE(rt); | 762 ASSERT_OWNED_RESOURCE(rt); |
| 763 SkASSERT(rt); | 763 SkASSERT(rt); |
| 764 return true; | 764 return true; |
| 765 } | 765 } |
| 766 | 766 |
| 767 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 767 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 768 fDrawTarget->drawBatch(*pipelineBuilder, batch); | 768 fDrawTarget->drawBatch(*pipelineBuilder, batch); |
| 769 } | 769 } |
| OLD | NEW |