| 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 "GrDrawingManager.h" |
| 13 #include "GrOvalRenderer.h" | 14 #include "GrOvalRenderer.h" |
| 14 #include "GrPathRenderer.h" | 15 #include "GrPathRenderer.h" |
| 15 #include "GrRenderTarget.h" | 16 #include "GrRenderTarget.h" |
| 16 #include "GrRenderTargetPriv.h" | 17 #include "GrRenderTargetPriv.h" |
| 17 #include "GrResourceProvider.h" | 18 #include "GrResourceProvider.h" |
| 18 #include "GrStencilAndCoverTextContext.h" | 19 #include "GrStencilAndCoverTextContext.h" |
| 19 #include "SkSurfacePriv.h" | 20 #include "SkSurfacePriv.h" |
| 20 | 21 |
| 21 #include "batches/GrBatch.h" | 22 #include "batches/GrBatch.h" |
| 22 #include "batches/GrDrawAtlasBatch.h" | 23 #include "batches/GrDrawAtlasBatch.h" |
| 23 #include "batches/GrDrawVerticesBatch.h" | 24 #include "batches/GrDrawVerticesBatch.h" |
| 24 #include "batches/GrRectBatchFactory.h" | 25 #include "batches/GrRectBatchFactory.h" |
| 25 | 26 |
| 26 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fContext) | 27 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fDrawingM
anager->getContext()) |
| 27 #define RETURN_IF_ABANDONED if (fContext->abandoned()) { return; } | 28 #define RETURN_IF_ABANDONED if (fDrawingManager->abandoned()) { return; } |
| 28 #define RETURN_FALSE_IF_ABANDONED if (fContext->abandoned()) { return false; } | 29 #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->abandoned()) { return fa
lse; } |
| 29 #define RETURN_NULL_IF_ABANDONED if (fContext->abandoned()) { return nullptr;
} | 30 #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->abandoned()) { return nu
llptr; } |
| 30 | 31 |
| 31 class AutoCheckFlush { | 32 class AutoCheckFlush { |
| 32 public: | 33 public: |
| 33 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} | 34 AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingMa
nager) { |
| 34 ~AutoCheckFlush() { fContext->flushIfNecessary(); } | 35 SkASSERT(fDrawingManager); |
| 36 } |
| 37 ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); } |
| 35 | 38 |
| 36 private: | 39 private: |
| 37 GrContext* fContext; | 40 GrDrawingManager* fDrawingManager; |
| 38 }; | 41 }; |
| 39 | 42 |
| 40 // In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-pr
ogress | 43 // In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-pr
ogress |
| 41 // drawTargets to be picked up and added to by drawContexts lower in the call | 44 // drawTargets to be picked up and added to by drawContexts lower in the call |
| 42 // stack. When this occurs with a closed drawTarget, a new one will be allocated | 45 // stack. When this occurs with a closed drawTarget, a new one will be allocated |
| 43 // when the drawContext attempts to use it (via getDrawTarget). | 46 // when the drawContext attempts to use it (via getDrawTarget). |
| 44 GrDrawContext::GrDrawContext(GrContext* context, | 47 GrDrawContext::GrDrawContext(GrDrawingManager* drawingMgr, |
| 45 GrRenderTarget* rt, | 48 GrRenderTarget* rt, |
| 46 const SkSurfaceProps* surfaceProps) | 49 const SkSurfaceProps* surfaceProps) |
| 47 : fContext(context) | 50 : fDrawingManager(drawingMgr) |
| 48 , fRenderTarget(rt) | 51 , fRenderTarget(rt) |
| 49 , fDrawTarget(SkSafeRef(rt->getLastDrawTarget())) | 52 , fDrawTarget(SkSafeRef(rt->getLastDrawTarget())) |
| 50 , fTextContext(nullptr) | 53 , fTextContext(nullptr) |
| 51 , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) { | 54 , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) { |
| 52 SkDEBUGCODE(this->validate();) | 55 SkDEBUGCODE(this->validate();) |
| 53 } | 56 } |
| 54 | 57 |
| 55 #ifdef SK_DEBUG | 58 #ifdef SK_DEBUG |
| 56 void GrDrawContext::validate() const { | 59 void GrDrawContext::validate() const { |
| 57 SkASSERT(fRenderTarget); | 60 SkASSERT(fRenderTarget); |
| 58 ASSERT_OWNED_RESOURCE(fRenderTarget); | 61 ASSERT_OWNED_RESOURCE(fRenderTarget); |
| 59 | 62 |
| 60 if (fDrawTarget && !fDrawTarget->isClosed()) { | 63 if (fDrawTarget && !fDrawTarget->isClosed()) { |
| 61 SkASSERT(fRenderTarget->getLastDrawTarget() == fDrawTarget); | 64 SkASSERT(fRenderTarget->getLastDrawTarget() == fDrawTarget); |
| 62 } | 65 } |
| 63 } | 66 } |
| 64 #endif | 67 #endif |
| 65 | 68 |
| 66 GrDrawContext::~GrDrawContext() { | 69 GrDrawContext::~GrDrawContext() { |
| 67 SkSafeUnref(fDrawTarget); | 70 SkSafeUnref(fDrawTarget); |
| 68 } | 71 } |
| 69 | 72 |
| 70 GrDrawTarget* GrDrawContext::getDrawTarget() { | 73 GrDrawTarget* GrDrawContext::getDrawTarget() { |
| 71 SkDEBUGCODE(this->validate();) | 74 SkDEBUGCODE(this->validate();) |
| 72 | 75 |
| 73 if (!fDrawTarget || fDrawTarget->isClosed()) { | 76 if (!fDrawTarget || fDrawTarget->isClosed()) { |
| 74 fDrawTarget = fContext->newDrawTarget(fRenderTarget); | 77 fDrawTarget = fDrawingManager->newDrawTarget(fRenderTarget); |
| 75 fRenderTarget->setLastDrawTarget(fDrawTarget); | 78 fRenderTarget->setLastDrawTarget(fDrawTarget); |
| 76 } | 79 } |
| 77 | 80 |
| 78 return fDrawTarget; | 81 return fDrawTarget; |
| 79 } | 82 } |
| 80 | 83 |
| 81 void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const Sk
IPoint& dstPoint) { | 84 void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const Sk
IPoint& dstPoint) { |
| 82 RETURN_IF_ABANDONED | 85 RETURN_IF_ABANDONED |
| 83 SkDEBUGCODE(this->validate();) | 86 SkDEBUGCODE(this->validate();) |
| 84 | 87 |
| 85 this->getDrawTarget()->copySurface(fRenderTarget, src, srcRect, dstPoint); | 88 this->getDrawTarget()->copySurface(fRenderTarget, src, srcRect, dstPoint); |
| 86 } | 89 } |
| 87 | 90 |
| 88 | 91 |
| 89 void GrDrawContext::drawText(const GrClip& clip, const GrPaint& grPaint, | 92 void GrDrawContext::drawText(const GrClip& clip, const GrPaint& grPaint, |
| 90 const SkPaint& skPaint, | 93 const SkPaint& skPaint, |
| 91 const SkMatrix& viewMatrix, | 94 const SkMatrix& viewMatrix, |
| 92 const char text[], size_t byteLength, | 95 const char text[], size_t byteLength, |
| 93 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ | 96 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ |
| 94 RETURN_IF_ABANDONED | 97 RETURN_IF_ABANDONED |
| 95 SkDEBUGCODE(this->validate();) | 98 SkDEBUGCODE(this->validate();) |
| 96 | 99 |
| 97 if (!fTextContext) { | 100 if (!fTextContext) { |
| 98 fTextContext = fContext->textContext(fSurfaceProps, fRenderTarget); | 101 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); |
| 99 } | 102 } |
| 100 | 103 |
| 101 fTextContext->drawText(this, fRenderTarget, clip, grPaint, skPaint, viewMatr
ix, | 104 fTextContext->drawText(this, fRenderTarget, clip, grPaint, skPaint, viewMatr
ix, |
| 102 text, byteLength, x, y, clipBounds); | 105 text, byteLength, x, y, clipBounds); |
| 103 | 106 |
| 104 } | 107 } |
| 105 void GrDrawContext::drawPosText(const GrClip& clip, const GrPaint& grPaint, | 108 void GrDrawContext::drawPosText(const GrClip& clip, const GrPaint& grPaint, |
| 106 const SkPaint& skPaint, | 109 const SkPaint& skPaint, |
| 107 const SkMatrix& viewMatrix, | 110 const SkMatrix& viewMatrix, |
| 108 const char text[], size_t byteLength, | 111 const char text[], size_t byteLength, |
| 109 const SkScalar pos[], int scalarsPerPosition, | 112 const SkScalar pos[], int scalarsPerPosition, |
| 110 const SkPoint& offset, const SkIRect& clipBounds
) { | 113 const SkPoint& offset, const SkIRect& clipBounds
) { |
| 111 RETURN_IF_ABANDONED | 114 RETURN_IF_ABANDONED |
| 112 SkDEBUGCODE(this->validate();) | 115 SkDEBUGCODE(this->validate();) |
| 113 | 116 |
| 114 if (!fTextContext) { | 117 if (!fTextContext) { |
| 115 fTextContext = fContext->textContext(fSurfaceProps, fRenderTarget); | 118 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); |
| 116 } | 119 } |
| 117 | 120 |
| 118 fTextContext->drawPosText(this, fRenderTarget, clip, grPaint, skPaint, viewM
atrix, text, byteLength, | 121 fTextContext->drawPosText(this, fRenderTarget, clip, grPaint, skPaint, viewM
atrix, text, byteLength, |
| 119 pos, scalarsPerPosition, offset, clipBounds); | 122 pos, scalarsPerPosition, offset, clipBounds); |
| 120 | 123 |
| 121 } | 124 } |
| 122 void GrDrawContext::drawTextBlob(const GrClip& clip, const SkPaint& skPaint, | 125 void GrDrawContext::drawTextBlob(const GrClip& clip, const SkPaint& skPaint, |
| 123 const SkMatrix& viewMatrix, const SkTextBlob* b
lob, | 126 const SkMatrix& viewMatrix, const SkTextBlob* b
lob, |
| 124 SkScalar x, SkScalar y, | 127 SkScalar x, SkScalar y, |
| 125 SkDrawFilter* filter, const SkIRect& clipBounds
) { | 128 SkDrawFilter* filter, const SkIRect& clipBounds
) { |
| 126 RETURN_IF_ABANDONED | 129 RETURN_IF_ABANDONED |
| 127 SkDEBUGCODE(this->validate();) | 130 SkDEBUGCODE(this->validate();) |
| 128 | 131 |
| 129 if (!fTextContext) { | 132 if (!fTextContext) { |
| 130 fTextContext = fContext->textContext(fSurfaceProps, fRenderTarget); | 133 fTextContext = fDrawingManager->textContext(fSurfaceProps, fRenderTarget
); |
| 131 } | 134 } |
| 132 | 135 |
| 133 fTextContext->drawTextBlob(this, fRenderTarget, | 136 fTextContext->drawTextBlob(this, fRenderTarget, |
| 134 clip, skPaint, viewMatrix, blob, x, y, filter, cl
ipBounds); | 137 clip, skPaint, viewMatrix, blob, x, y, filter, cl
ipBounds); |
| 135 } | 138 } |
| 136 | 139 |
| 137 void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder, | 140 void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder, |
| 138 const SkMatrix& viewMatrix, | 141 const SkMatrix& viewMatrix, |
| 139 const SkMatrix& localMatrix, | 142 const SkMatrix& localMatrix, |
| 140 GrColor color, | 143 GrColor color, |
| 141 GrPathRange* range, | 144 GrPathRange* range, |
| 142 GrPathRangeDraw* draw, | 145 GrPathRangeDraw* draw, |
| 143 int /*GrPathRendering::FillType*/ fill) { | 146 int /*GrPathRendering::FillType*/ fill) { |
| 144 RETURN_IF_ABANDONED | 147 RETURN_IF_ABANDONED |
| 145 SkDEBUGCODE(this->validate();) | 148 SkDEBUGCODE(this->validate();) |
| 146 | 149 |
| 147 this->getDrawTarget()->drawPathsFromRange(*pipelineBuilder, viewMatrix, loca
lMatrix, color, | 150 this->getDrawTarget()->drawPathsFromRange(*pipelineBuilder, viewMatrix, loca
lMatrix, color, |
| 148 range, draw, (GrPathRendering::Fil
lType) fill); | 151 range, draw, (GrPathRendering::Fil
lType) fill); |
| 149 } | 152 } |
| 150 | 153 |
| 151 void GrDrawContext::discard() { | 154 void GrDrawContext::discard() { |
| 152 RETURN_IF_ABANDONED | 155 RETURN_IF_ABANDONED |
| 153 SkDEBUGCODE(this->validate();) | 156 SkDEBUGCODE(this->validate();) |
| 154 | 157 |
| 155 AutoCheckFlush acf(fContext); | 158 AutoCheckFlush acf(fDrawingManager); |
| 156 this->getDrawTarget()->discard(fRenderTarget); | 159 this->getDrawTarget()->discard(fRenderTarget); |
| 157 } | 160 } |
| 158 | 161 |
| 159 void GrDrawContext::clear(const SkIRect* rect, | 162 void GrDrawContext::clear(const SkIRect* rect, |
| 160 const GrColor color, | 163 const GrColor color, |
| 161 bool canIgnoreRect) { | 164 bool canIgnoreRect) { |
| 162 RETURN_IF_ABANDONED | 165 RETURN_IF_ABANDONED |
| 163 SkDEBUGCODE(this->validate();) | 166 SkDEBUGCODE(this->validate();) |
| 164 | 167 |
| 165 AutoCheckFlush acf(fContext); | 168 AutoCheckFlush acf(fDrawingManager); |
| 166 this->getDrawTarget()->clear(rect, color, canIgnoreRect, fRenderTarget); | 169 this->getDrawTarget()->clear(rect, color, canIgnoreRect, fRenderTarget); |
| 167 } | 170 } |
| 168 | 171 |
| 169 | 172 |
| 170 void GrDrawContext::drawPaint(const GrClip& clip, | 173 void GrDrawContext::drawPaint(const GrClip& clip, |
| 171 const GrPaint& origPaint, | 174 const GrPaint& origPaint, |
| 172 const SkMatrix& viewMatrix) { | 175 const SkMatrix& viewMatrix) { |
| 173 RETURN_IF_ABANDONED | 176 RETURN_IF_ABANDONED |
| 174 SkDEBUGCODE(this->validate();) | 177 SkDEBUGCODE(this->validate();) |
| 175 | 178 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 199 } | 202 } |
| 200 inverse.mapRect(&r); | 203 inverse.mapRect(&r); |
| 201 this->drawRect(clip, *paint, viewMatrix, r); | 204 this->drawRect(clip, *paint, viewMatrix, r); |
| 202 } else { | 205 } else { |
| 203 SkMatrix localMatrix; | 206 SkMatrix localMatrix; |
| 204 if (!viewMatrix.invert(&localMatrix)) { | 207 if (!viewMatrix.invert(&localMatrix)) { |
| 205 SkDebugf("Could not invert matrix\n"); | 208 SkDebugf("Could not invert matrix\n"); |
| 206 return; | 209 return; |
| 207 } | 210 } |
| 208 | 211 |
| 209 AutoCheckFlush acf(fContext); | 212 AutoCheckFlush acf(fDrawingManager); |
| 210 | 213 |
| 211 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip); | 214 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip); |
| 212 this->getDrawTarget()->drawNonAARect(pipelineBuilder, | 215 this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
| 213 paint->getColor(), | 216 paint->getColor(), |
| 214 SkMatrix::I(), | 217 SkMatrix::I(), |
| 215 r, | 218 r, |
| 216 localMatrix); | 219 localMatrix); |
| 217 } | 220 } |
| 218 } | 221 } |
| 219 | 222 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 231 SkDEBUGCODE(this->validate();) | 234 SkDEBUGCODE(this->validate();) |
| 232 | 235 |
| 233 if (strokeInfo && strokeInfo->isDashed()) { | 236 if (strokeInfo && strokeInfo->isDashed()) { |
| 234 SkPath path; | 237 SkPath path; |
| 235 path.setIsVolatile(true); | 238 path.setIsVolatile(true); |
| 236 path.addRect(rect); | 239 path.addRect(rect); |
| 237 this->drawPath(clip, paint, viewMatrix, path, *strokeInfo); | 240 this->drawPath(clip, paint, viewMatrix, path, *strokeInfo); |
| 238 return; | 241 return; |
| 239 } | 242 } |
| 240 | 243 |
| 241 AutoCheckFlush acf(fContext); | 244 AutoCheckFlush acf(fDrawingManager); |
| 242 | 245 |
| 243 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 246 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 244 | 247 |
| 245 SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth(); | 248 SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth(); |
| 246 | 249 |
| 247 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking | 250 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking |
| 248 // cases where the RT is fully inside a stroke. | 251 // cases where the RT is fully inside a stroke. |
| 249 if (width < 0) { | 252 if (width < 0) { |
| 250 SkRect rtRect; | 253 SkRect rtRect; |
| 251 pipelineBuilder.getRenderTarget()->getBoundsRect(&rtRect); | 254 pipelineBuilder.getRenderTarget()->getBoundsRect(&rtRect); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 } | 323 } |
| 321 | 324 |
| 322 void GrDrawContext::drawNonAARectToRect(const GrClip& clip, | 325 void GrDrawContext::drawNonAARectToRect(const GrClip& clip, |
| 323 const GrPaint& paint, | 326 const GrPaint& paint, |
| 324 const SkMatrix& viewMatrix, | 327 const SkMatrix& viewMatrix, |
| 325 const SkRect& rectToDraw, | 328 const SkRect& rectToDraw, |
| 326 const SkRect& localRect) { | 329 const SkRect& localRect) { |
| 327 RETURN_IF_ABANDONED | 330 RETURN_IF_ABANDONED |
| 328 SkDEBUGCODE(this->validate();) | 331 SkDEBUGCODE(this->validate();) |
| 329 | 332 |
| 330 AutoCheckFlush acf(fContext); | 333 AutoCheckFlush acf(fDrawingManager); |
| 331 | 334 |
| 332 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 335 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 333 this->getDrawTarget()->drawNonAARect(pipelineBuilder, | 336 this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
| 334 paint.getColor(), | 337 paint.getColor(), |
| 335 viewMatrix, | 338 viewMatrix, |
| 336 rectToDraw, | 339 rectToDraw, |
| 337 localRect); | 340 localRect); |
| 338 } | 341 } |
| 339 | 342 |
| 340 void GrDrawContext::drawNonAARectWithLocalMatrix(const GrClip& clip, | 343 void GrDrawContext::drawNonAARectWithLocalMatrix(const GrClip& clip, |
| 341 const GrPaint& paint, | 344 const GrPaint& paint, |
| 342 const SkMatrix& viewMatrix, | 345 const SkMatrix& viewMatrix, |
| 343 const SkRect& rectToDraw, | 346 const SkRect& rectToDraw, |
| 344 const SkMatrix& localMatrix) { | 347 const SkMatrix& localMatrix) { |
| 345 RETURN_IF_ABANDONED | 348 RETURN_IF_ABANDONED |
| 346 SkDEBUGCODE(this->validate();) | 349 SkDEBUGCODE(this->validate();) |
| 347 | 350 |
| 348 AutoCheckFlush acf(fContext); | 351 AutoCheckFlush acf(fDrawingManager); |
| 349 | 352 |
| 350 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 353 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 351 this->getDrawTarget()->drawNonAARect(pipelineBuilder, | 354 this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
| 352 paint.getColor(), | 355 paint.getColor(), |
| 353 viewMatrix, | 356 viewMatrix, |
| 354 rectToDraw, | 357 rectToDraw, |
| 355 localMatrix); | 358 localMatrix); |
| 356 } | 359 } |
| 357 | 360 |
| 358 void GrDrawContext::drawVertices(const GrClip& clip, | 361 void GrDrawContext::drawVertices(const GrClip& clip, |
| 359 const GrPaint& paint, | 362 const GrPaint& paint, |
| 360 const SkMatrix& viewMatrix, | 363 const SkMatrix& viewMatrix, |
| 361 GrPrimitiveType primitiveType, | 364 GrPrimitiveType primitiveType, |
| 362 int vertexCount, | 365 int vertexCount, |
| 363 const SkPoint positions[], | 366 const SkPoint positions[], |
| 364 const SkPoint texCoords[], | 367 const SkPoint texCoords[], |
| 365 const GrColor colors[], | 368 const GrColor colors[], |
| 366 const uint16_t indices[], | 369 const uint16_t indices[], |
| 367 int indexCount) { | 370 int indexCount) { |
| 368 RETURN_IF_ABANDONED | 371 RETURN_IF_ABANDONED |
| 369 SkDEBUGCODE(this->validate();) | 372 SkDEBUGCODE(this->validate();) |
| 370 | 373 |
| 371 AutoCheckFlush acf(fContext); | 374 AutoCheckFlush acf(fDrawingManager); |
| 372 | 375 |
| 373 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 376 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 374 | 377 |
| 375 // TODO clients should give us bounds | 378 // TODO clients should give us bounds |
| 376 SkRect bounds; | 379 SkRect bounds; |
| 377 if (!bounds.setBoundsCheck(positions, vertexCount)) { | 380 if (!bounds.setBoundsCheck(positions, vertexCount)) { |
| 378 SkDebugf("drawVertices call empty bounds\n"); | 381 SkDebugf("drawVertices call empty bounds\n"); |
| 379 return; | 382 return; |
| 380 } | 383 } |
| 381 | 384 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 402 void GrDrawContext::drawAtlas(const GrClip& clip, | 405 void GrDrawContext::drawAtlas(const GrClip& clip, |
| 403 const GrPaint& paint, | 406 const GrPaint& paint, |
| 404 const SkMatrix& viewMatrix, | 407 const SkMatrix& viewMatrix, |
| 405 int spriteCount, | 408 int spriteCount, |
| 406 const SkRSXform xform[], | 409 const SkRSXform xform[], |
| 407 const SkRect texRect[], | 410 const SkRect texRect[], |
| 408 const SkColor colors[]) { | 411 const SkColor colors[]) { |
| 409 RETURN_IF_ABANDONED | 412 RETURN_IF_ABANDONED |
| 410 SkDEBUGCODE(this->validate();) | 413 SkDEBUGCODE(this->validate();) |
| 411 | 414 |
| 412 AutoCheckFlush acf(fContext); | 415 AutoCheckFlush acf(fDrawingManager); |
| 413 | 416 |
| 414 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 417 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 415 | 418 |
| 416 GrDrawAtlasBatch::Geometry geometry; | 419 GrDrawAtlasBatch::Geometry geometry; |
| 417 geometry.fColor = paint.getColor(); | 420 geometry.fColor = paint.getColor(); |
| 418 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, | 421 SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatri
x, spriteCount, |
| 419 xform, texRect, col
ors)); | 422 xform, texRect, col
ors)); |
| 420 | 423 |
| 421 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 424 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 422 } | 425 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 436 } | 439 } |
| 437 | 440 |
| 438 if (strokeInfo.isDashed()) { | 441 if (strokeInfo.isDashed()) { |
| 439 SkPath path; | 442 SkPath path; |
| 440 path.setIsVolatile(true); | 443 path.setIsVolatile(true); |
| 441 path.addRRect(rrect); | 444 path.addRRect(rrect); |
| 442 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); | 445 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); |
| 443 return; | 446 return; |
| 444 } | 447 } |
| 445 | 448 |
| 446 AutoCheckFlush acf(fContext); | 449 AutoCheckFlush acf(fDrawingManager); |
| 447 | 450 |
| 448 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 451 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 449 GrColor color = paint.getColor(); | 452 GrColor color = paint.getColor(); |
| 450 | 453 |
| 451 if (!GrOvalRenderer::DrawRRect(this->getDrawTarget(), | 454 if (!GrOvalRenderer::DrawRRect(this->getDrawTarget(), |
| 452 pipelineBuilder, | 455 pipelineBuilder, |
| 453 color, | 456 color, |
| 454 viewMatrix, | 457 viewMatrix, |
| 455 paint.isAntiAlias(), | 458 paint.isAntiAlias(), |
| 456 rrect, | 459 rrect, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 470 const SkMatrix& viewMatrix, | 473 const SkMatrix& viewMatrix, |
| 471 const SkRRect& outer, | 474 const SkRRect& outer, |
| 472 const SkRRect& inner) { | 475 const SkRRect& inner) { |
| 473 RETURN_IF_ABANDONED | 476 RETURN_IF_ABANDONED |
| 474 SkDEBUGCODE(this->validate();) | 477 SkDEBUGCODE(this->validate();) |
| 475 | 478 |
| 476 if (outer.isEmpty()) { | 479 if (outer.isEmpty()) { |
| 477 return; | 480 return; |
| 478 } | 481 } |
| 479 | 482 |
| 480 AutoCheckFlush acf(fContext); | 483 AutoCheckFlush acf(fDrawingManager); |
| 481 | 484 |
| 482 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 485 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 483 GrColor color = paint.getColor(); | 486 GrColor color = paint.getColor(); |
| 484 if (!GrOvalRenderer::DrawDRRect(this->getDrawTarget(), | 487 if (!GrOvalRenderer::DrawDRRect(this->getDrawTarget(), |
| 485 pipelineBuilder, | 488 pipelineBuilder, |
| 486 color, | 489 color, |
| 487 viewMatrix, | 490 viewMatrix, |
| 488 paint.isAntiAlias(), | 491 paint.isAntiAlias(), |
| 489 outer, | 492 outer, |
| 490 inner)) { | 493 inner)) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 515 } | 518 } |
| 516 | 519 |
| 517 if (strokeInfo.isDashed()) { | 520 if (strokeInfo.isDashed()) { |
| 518 SkPath path; | 521 SkPath path; |
| 519 path.setIsVolatile(true); | 522 path.setIsVolatile(true); |
| 520 path.addOval(oval); | 523 path.addOval(oval); |
| 521 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); | 524 this->drawPath(clip, paint, viewMatrix, path, strokeInfo); |
| 522 return; | 525 return; |
| 523 } | 526 } |
| 524 | 527 |
| 525 AutoCheckFlush acf(fContext); | 528 AutoCheckFlush acf(fDrawingManager); |
| 526 | 529 |
| 527 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 530 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 528 GrColor color = paint.getColor(); | 531 GrColor color = paint.getColor(); |
| 529 | 532 |
| 530 if (!GrOvalRenderer::DrawOval(this->getDrawTarget(), | 533 if (!GrOvalRenderer::DrawOval(this->getDrawTarget(), |
| 531 pipelineBuilder, | 534 pipelineBuilder, |
| 532 color, | 535 color, |
| 533 viewMatrix, | 536 viewMatrix, |
| 534 paint.isAntiAlias(), | 537 paint.isAntiAlias(), |
| 535 oval, | 538 oval, |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 } | 593 } |
| 591 | 594 |
| 592 return allEq || allGoE1; | 595 return allEq || allGoE1; |
| 593 } | 596 } |
| 594 | 597 |
| 595 void GrDrawContext::drawBatch(const GrClip& clip, | 598 void GrDrawContext::drawBatch(const GrClip& clip, |
| 596 const GrPaint& paint, GrDrawBatch* batch) { | 599 const GrPaint& paint, GrDrawBatch* batch) { |
| 597 RETURN_IF_ABANDONED | 600 RETURN_IF_ABANDONED |
| 598 SkDEBUGCODE(this->validate();) | 601 SkDEBUGCODE(this->validate();) |
| 599 | 602 |
| 600 AutoCheckFlush acf(fContext); | 603 AutoCheckFlush acf(fDrawingManager); |
| 601 | 604 |
| 602 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 605 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 603 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | 606 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 604 } | 607 } |
| 605 | 608 |
| 606 void GrDrawContext::drawPath(const GrClip& clip, | 609 void GrDrawContext::drawPath(const GrClip& clip, |
| 607 const GrPaint& paint, | 610 const GrPaint& paint, |
| 608 const SkMatrix& viewMatrix, | 611 const SkMatrix& viewMatrix, |
| 609 const SkPath& path, | 612 const SkPath& path, |
| 610 const GrStrokeInfo& strokeInfo) { | 613 const GrStrokeInfo& strokeInfo) { |
| 611 RETURN_IF_ABANDONED | 614 RETURN_IF_ABANDONED |
| 612 SkDEBUGCODE(this->validate();) | 615 SkDEBUGCODE(this->validate();) |
| 613 | 616 |
| 614 if (path.isEmpty()) { | 617 if (path.isEmpty()) { |
| 615 if (path.isInverseFillType()) { | 618 if (path.isInverseFillType()) { |
| 616 this->drawPaint(clip, paint, viewMatrix); | 619 this->drawPaint(clip, paint, viewMatrix); |
| 617 } | 620 } |
| 618 return; | 621 return; |
| 619 } | 622 } |
| 620 | 623 |
| 621 GrColor color = paint.getColor(); | 624 GrColor color = paint.getColor(); |
| 622 | 625 |
| 623 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. | 626 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. |
| 624 // Scratch textures can be recycled after they are returned to the texture | 627 // Scratch textures can be recycled after they are returned to the texture |
| 625 // cache. This presents a potential hazard for buffered drawing. However, | 628 // cache. This presents a potential hazard for buffered drawing. However, |
| 626 // the writePixels that uploads to the scratch will perform a flush so we're | 629 // the writePixels that uploads to the scratch will perform a flush so we're |
| 627 // OK. | 630 // OK. |
| 628 AutoCheckFlush acf(fContext); | 631 AutoCheckFlush acf(fDrawingManager); |
| 629 | 632 |
| 630 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 633 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 631 if (!strokeInfo.isDashed()) { | 634 if (!strokeInfo.isDashed()) { |
| 632 bool useCoverageAA = paint.isAntiAlias() && | 635 bool useCoverageAA = paint.isAntiAlias() && |
| 633 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); | 636 !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
| 634 | 637 |
| 635 if (useCoverageAA && strokeInfo.getWidth() < 0 && !path.isConvex()) { | 638 if (useCoverageAA && strokeInfo.getWidth() < 0 && !path.isConvex()) { |
| 636 // Concave AA paths are expensive - try to avoid them for special ca
ses | 639 // Concave AA paths are expensive - try to avoid them for special ca
ses |
| 637 SkRect rects[2]; | 640 SkRect rects[2]; |
| 638 | 641 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 | 685 |
| 683 GrPathRendererChain::DrawType type = | 686 GrPathRendererChain::DrawType type = |
| 684 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : | 687 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : |
| 685 GrPathRendererChain::kColor_DrawType; | 688 GrPathRendererChain::kColor_DrawType; |
| 686 | 689 |
| 687 const SkPath* pathPtr = &path; | 690 const SkPath* pathPtr = &path; |
| 688 SkTLazy<SkPath> tmpPath; | 691 SkTLazy<SkPath> tmpPath; |
| 689 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; | 692 const GrStrokeInfo* strokeInfoPtr = &strokeInfo; |
| 690 | 693 |
| 691 // Try a 1st time without stroking the path and without allowing the SW rend
erer | 694 // Try a 1st time without stroking the path and without allowing the SW rend
erer |
| 692 GrPathRenderer* pr = fContext->getPathRenderer(target, pipelineBuilder, view
Matrix, *pathPtr, | 695 GrPathRenderer* pr = fDrawingManager->getContext()->getPathRenderer(target,
pipelineBuilder, |
| 693 *strokeInfoPtr, false, type)
; | 696 viewMatr
ix, *pathPtr, |
| 697 *strokeI
nfoPtr, false, |
| 698 type); |
| 694 | 699 |
| 695 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); | 700 GrStrokeInfo dashlessStrokeInfo(strokeInfo, false); |
| 696 if (nullptr == pr && strokeInfo.isDashed()) { | 701 if (nullptr == pr && strokeInfo.isDashed()) { |
| 697 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. | 702 // It didn't work above, so try again with dashed stroke converted to a
dashless stroke. |
| 698 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { | 703 if (!strokeInfo.applyDashToPath(tmpPath.init(), &dashlessStrokeInfo, *pa
thPtr)) { |
| 699 return; | 704 return; |
| 700 } | 705 } |
| 701 pathPtr = tmpPath.get(); | 706 pathPtr = tmpPath.get(); |
| 702 if (pathPtr->isEmpty()) { | 707 if (pathPtr->isEmpty()) { |
| 703 return; | 708 return; |
| 704 } | 709 } |
| 705 strokeInfoPtr = &dashlessStrokeInfo; | 710 strokeInfoPtr = &dashlessStrokeInfo; |
| 706 pr = fContext->getPathRenderer(target, pipelineBuilder, viewMatrix, *pat
hPtr, *strokeInfoPtr, | 711 pr = fDrawingManager->getContext()->getPathRenderer(target, pipelineBuil
der, viewMatrix, |
| 707 false, type); | 712 *pathPtr, *strokeInf
oPtr, |
| 713 false, type); |
| 708 } | 714 } |
| 709 | 715 |
| 710 if (nullptr == pr) { | 716 if (nullptr == pr) { |
| 711 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*strokeInfoPtr, viewMa
trix, nullptr) && | 717 if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*strokeInfoPtr, viewMa
trix, nullptr) && |
| 712 !strokeInfoPtr->isFillStyle()) { | 718 !strokeInfoPtr->isFillStyle()) { |
| 713 // 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. |
| 714 if (!tmpPath.isValid()) { | 720 if (!tmpPath.isValid()) { |
| 715 tmpPath.init(); | 721 tmpPath.init(); |
| 716 } | 722 } |
| 717 dashlessStrokeInfo.setResScale(SkScalarAbs(viewMatrix.getMaxScale())
); | 723 dashlessStrokeInfo.setResScale(SkScalarAbs(viewMatrix.getMaxScale())
); |
| 718 if (!dashlessStrokeInfo.applyToPath(tmpPath.get(), *pathPtr)) { | 724 if (!dashlessStrokeInfo.applyToPath(tmpPath.get(), *pathPtr)) { |
| 719 return; | 725 return; |
| 720 } | 726 } |
| 721 pathPtr = tmpPath.get(); | 727 pathPtr = tmpPath.get(); |
| 722 if (pathPtr->isEmpty()) { | 728 if (pathPtr->isEmpty()) { |
| 723 return; | 729 return; |
| 724 } | 730 } |
| 725 dashlessStrokeInfo.setFillStyle(); | 731 dashlessStrokeInfo.setFillStyle(); |
| 726 strokeInfoPtr = &dashlessStrokeInfo; | 732 strokeInfoPtr = &dashlessStrokeInfo; |
| 727 } | 733 } |
| 728 | 734 |
| 729 // This time, allow SW renderer | 735 // This time, allow SW renderer |
| 730 pr = fContext->getPathRenderer(target, pipelineBuilder, viewMatrix, *pat
hPtr, *strokeInfoPtr, | 736 pr = fDrawingManager->getContext()->getPathRenderer(target, pipelineBuil
der, viewMatrix, |
| 731 true, type); | 737 *pathPtr, *strokeInf
oPtr, |
| 738 true, type); |
| 732 } | 739 } |
| 733 | 740 |
| 734 if (nullptr == pr) { | 741 if (nullptr == pr) { |
| 735 #ifdef SK_DEBUG | 742 #ifdef SK_DEBUG |
| 736 SkDebugf("Unable to find path renderer compatible with path.\n"); | 743 SkDebugf("Unable to find path renderer compatible with path.\n"); |
| 737 #endif | 744 #endif |
| 738 return; | 745 return; |
| 739 } | 746 } |
| 740 | 747 |
| 741 GrPathRenderer::DrawPathArgs args; | 748 GrPathRenderer::DrawPathArgs args; |
| 742 args.fTarget = target; | 749 args.fTarget = target; |
| 743 args.fResourceProvider = fContext->resourceProvider(); | 750 args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); |
| 744 args.fPipelineBuilder = pipelineBuilder; | 751 args.fPipelineBuilder = pipelineBuilder; |
| 745 args.fColor = color; | 752 args.fColor = color; |
| 746 args.fViewMatrix = &viewMatrix; | 753 args.fViewMatrix = &viewMatrix; |
| 747 args.fPath = pathPtr; | 754 args.fPath = pathPtr; |
| 748 args.fStroke = strokeInfoPtr; | 755 args.fStroke = strokeInfoPtr; |
| 749 args.fAntiAlias = useCoverageAA; | 756 args.fAntiAlias = useCoverageAA; |
| 750 pr->drawPath(args); | 757 pr->drawPath(args); |
| 751 } | 758 } |
| 752 | 759 |
| 753 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 760 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 754 RETURN_IF_ABANDONED | 761 RETURN_IF_ABANDONED |
| 755 SkDEBUGCODE(this->validate();) | 762 SkDEBUGCODE(this->validate();) |
| 756 | 763 |
| 757 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 764 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
| 758 } | 765 } |
| OLD | NEW |