| 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 "GrResourceProvider.h" | 17 #include "GrResourceProvider.h" |
| 18 #include "GrStencilAndCoverTextContext.h" | 18 #include "GrStencilAndCoverTextContext.h" |
| 19 #include "SkSurfacePriv.h" |
| 19 | 20 |
| 20 #include "batches/GrBatch.h" | 21 #include "batches/GrBatch.h" |
| 21 #include "batches/GrDrawAtlasBatch.h" | 22 #include "batches/GrDrawAtlasBatch.h" |
| 22 #include "batches/GrDrawVerticesBatch.h" | 23 #include "batches/GrDrawVerticesBatch.h" |
| 23 #include "batches/GrRectBatchFactory.h" | 24 #include "batches/GrRectBatchFactory.h" |
| 24 | 25 |
| 25 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fContext) | 26 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fContext) |
| 26 #define RETURN_IF_ABANDONED if (!fDrawTarget) { return; } | 27 #define RETURN_IF_ABANDONED if (fContext->abandoned()) { return; } |
| 27 #define RETURN_FALSE_IF_ABANDONED if (!fDrawTarget) { return false; } | 28 #define RETURN_FALSE_IF_ABANDONED if (fContext->abandoned()) { return false; } |
| 28 #define RETURN_NULL_IF_ABANDONED if (!fDrawTarget) { return nullptr; } | 29 #define RETURN_NULL_IF_ABANDONED if (fContext->abandoned()) { return nullptr;
} |
| 29 | 30 |
| 30 class AutoCheckFlush { | 31 class AutoCheckFlush { |
| 31 public: | 32 public: |
| 32 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} | 33 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(context);
} |
| 33 ~AutoCheckFlush() { fContext->flushIfNecessary(); } | 34 ~AutoCheckFlush() { fContext->flushIfNecessary(); } |
| 34 | 35 |
| 35 private: | 36 private: |
| 36 GrContext* fContext; | 37 GrContext* fContext; |
| 37 }; | 38 }; |
| 38 | 39 |
| 39 GrDrawContext::GrDrawContext(GrContext* context, | 40 GrDrawContext::GrDrawContext(GrContext* context, |
| 40 GrDrawTarget* drawTarget, | 41 GrDrawTarget* drawTarget, |
| 41 const SkSurfaceProps& surfaceProps) | 42 const SkSurfaceProps* surfaceProps) |
| 42 : fContext(context) | 43 : fContext(context) |
| 43 , fDrawTarget(SkRef(drawTarget)) | 44 , fDrawTarget(SkRef(drawTarget)) |
| 44 , fTextContext(nullptr) | 45 , fTextContext(nullptr) |
| 45 , fSurfaceProps(surfaceProps) { | 46 , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) { |
| 46 } | 47 } |
| 47 | 48 |
| 48 GrDrawContext::~GrDrawContext() { | 49 GrDrawContext::~GrDrawContext() { |
| 49 SkSafeUnref(fDrawTarget); | 50 SkSafeUnref(fDrawTarget); |
| 50 delete fTextContext; | |
| 51 } | 51 } |
| 52 | 52 |
| 53 void GrDrawContext::copySurface(GrRenderTarget* dst, GrSurface* src, | 53 void GrDrawContext::copySurface(GrRenderTarget* dst, GrSurface* src, |
| 54 const SkIRect& srcRect, const SkIPoint& dstPoint
) { | 54 const SkIRect& srcRect, const SkIPoint& dstPoint
) { |
| 55 RETURN_IF_ABANDONED |
| 56 |
| 55 if (!this->prepareToDraw(dst)) { | 57 if (!this->prepareToDraw(dst)) { |
| 56 return; | 58 return; |
| 57 } | 59 } |
| 58 | 60 |
| 59 fDrawTarget->copySurface(dst, src, srcRect, dstPoint); | 61 fDrawTarget->copySurface(dst, src, srcRect, dstPoint); |
| 60 } | 62 } |
| 61 | 63 |
| 62 GrTextContext* GrDrawContext::createTextContext(GrRenderTarget* renderTarget, | |
| 63 const SkSurfaceProps& surfacePro
ps) { | |
| 64 if (fContext->caps()->shaderCaps()->pathRenderingSupport() && | |
| 65 renderTarget->isStencilBufferMultisampled() && | |
| 66 fSurfaceProps.isUseDeviceIndependentFonts()) { | |
| 67 GrStencilAttachment* sb = | |
| 68 fContext->resourceProvider()->attachStencilAttachment(renderTarget); | |
| 69 if (sb) { | |
| 70 return GrStencilAndCoverTextContext::Create(fContext, surfaceProps); | |
| 71 } | |
| 72 } | |
| 73 | |
| 74 return GrAtlasTextContext::Create(fContext, surfaceProps); | |
| 75 } | |
| 76 | 64 |
| 77 void GrDrawContext::drawText(GrRenderTarget* rt, const GrClip& clip, const GrPai
nt& grPaint, | 65 void GrDrawContext::drawText(GrRenderTarget* rt, const GrClip& clip, const GrPai
nt& grPaint, |
| 78 const SkPaint& skPaint, | 66 const SkPaint& skPaint, |
| 79 const SkMatrix& viewMatrix, | 67 const SkMatrix& viewMatrix, |
| 80 const char text[], size_t byteLength, | 68 const char text[], size_t byteLength, |
| 81 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ | 69 SkScalar x, SkScalar y, const SkIRect& clipBounds)
{ |
| 70 RETURN_IF_ABANDONED |
| 71 |
| 82 if (!fTextContext) { | 72 if (!fTextContext) { |
| 83 fTextContext = this->createTextContext(rt, fSurfaceProps); | 73 fTextContext = fContext->textContext(fSurfaceProps, rt); |
| 84 } | 74 } |
| 85 | 75 |
| 86 fTextContext->drawText(this, rt, clip, grPaint, skPaint, viewMatrix, | 76 fTextContext->drawText(this, rt, clip, grPaint, skPaint, viewMatrix, |
| 87 text, byteLength, x, y, clipBounds); | 77 text, byteLength, x, y, clipBounds); |
| 88 | 78 |
| 89 } | 79 } |
| 90 void GrDrawContext::drawPosText(GrRenderTarget* rt, const GrClip& clip, const Gr
Paint& grPaint, | 80 void GrDrawContext::drawPosText(GrRenderTarget* rt, const GrClip& clip, const Gr
Paint& grPaint, |
| 91 const SkPaint& skPaint, | 81 const SkPaint& skPaint, |
| 92 const SkMatrix& viewMatrix, | 82 const SkMatrix& viewMatrix, |
| 93 const char text[], size_t byteLength, | 83 const char text[], size_t byteLength, |
| 94 const SkScalar pos[], int scalarsPerPosition, | 84 const SkScalar pos[], int scalarsPerPosition, |
| 95 const SkPoint& offset, const SkIRect& clipBounds
) { | 85 const SkPoint& offset, const SkIRect& clipBounds
) { |
| 86 RETURN_IF_ABANDONED |
| 87 |
| 96 if (!fTextContext) { | 88 if (!fTextContext) { |
| 97 fTextContext = this->createTextContext(rt, fSurfaceProps); | 89 fTextContext = fContext->textContext(fSurfaceProps, rt); |
| 98 } | 90 } |
| 99 | 91 |
| 100 fTextContext->drawPosText(this, rt, clip, grPaint, skPaint, viewMatrix, text
, byteLength, | 92 fTextContext->drawPosText(this, rt, clip, grPaint, skPaint, viewMatrix, text
, byteLength, |
| 101 pos, scalarsPerPosition, offset, clipBounds); | 93 pos, scalarsPerPosition, offset, clipBounds); |
| 102 | 94 |
| 103 } | 95 } |
| 104 void GrDrawContext::drawTextBlob(GrRenderTarget* rt, const GrClip& clip, const S
kPaint& skPaint, | 96 void GrDrawContext::drawTextBlob(GrRenderTarget* rt, const GrClip& clip, const S
kPaint& skPaint, |
| 105 const SkMatrix& viewMatrix, const SkTextBlob* b
lob, | 97 const SkMatrix& viewMatrix, const SkTextBlob* b
lob, |
| 106 SkScalar x, SkScalar y, | 98 SkScalar x, SkScalar y, |
| 107 SkDrawFilter* filter, const SkIRect& clipBounds
) { | 99 SkDrawFilter* filter, const SkIRect& clipBounds
) { |
| 100 RETURN_IF_ABANDONED |
| 101 |
| 108 if (!fTextContext) { | 102 if (!fTextContext) { |
| 109 fTextContext = this->createTextContext(rt, fSurfaceProps); | 103 fTextContext = fContext->textContext(fSurfaceProps, rt); |
| 110 } | 104 } |
| 111 | 105 |
| 112 fTextContext->drawTextBlob(this, rt, | 106 fTextContext->drawTextBlob(this, rt, |
| 113 clip, skPaint, viewMatrix, blob, x, y, filter, cl
ipBounds); | 107 clip, skPaint, viewMatrix, blob, x, y, filter, cl
ipBounds); |
| 114 } | 108 } |
| 115 | 109 |
| 116 void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder, | 110 void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder, |
| 117 const SkMatrix& viewMatrix, | 111 const SkMatrix& viewMatrix, |
| 118 const SkMatrix& localMatrix, | 112 const SkMatrix& localMatrix, |
| 119 GrColor color, | 113 GrColor color, |
| 120 GrPathRangeDraw* draw, | 114 GrPathRangeDraw* draw, |
| 121 int /*GrPathRendering::FillType*/ fill) { | 115 int /*GrPathRendering::FillType*/ fill) { |
| 116 RETURN_IF_ABANDONED |
| 117 |
| 122 fDrawTarget->drawPathsFromRange(*pipelineBuilder, viewMatrix, localMatrix, c
olor, draw, | 118 fDrawTarget->drawPathsFromRange(*pipelineBuilder, viewMatrix, localMatrix, c
olor, draw, |
| 123 (GrPathRendering::FillType) fill); | 119 (GrPathRendering::FillType) fill); |
| 124 } | 120 } |
| 125 | 121 |
| 126 void GrDrawContext::discard(GrRenderTarget* renderTarget) { | 122 void GrDrawContext::discard(GrRenderTarget* renderTarget) { |
| 127 RETURN_IF_ABANDONED | 123 RETURN_IF_ABANDONED |
| 128 SkASSERT(renderTarget); | 124 SkASSERT(renderTarget); |
| 129 AutoCheckFlush acf(fContext); | 125 AutoCheckFlush acf(fContext); |
| 130 if (!this->prepareToDraw(renderTarget)) { | 126 if (!this->prepareToDraw(renderTarget)) { |
| 131 return; | 127 return; |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 | 750 |
| 755 bool GrDrawContext::prepareToDraw(GrRenderTarget* rt) { | 751 bool GrDrawContext::prepareToDraw(GrRenderTarget* rt) { |
| 756 RETURN_FALSE_IF_ABANDONED | 752 RETURN_FALSE_IF_ABANDONED |
| 757 | 753 |
| 758 ASSERT_OWNED_RESOURCE(rt); | 754 ASSERT_OWNED_RESOURCE(rt); |
| 759 SkASSERT(rt); | 755 SkASSERT(rt); |
| 760 return true; | 756 return true; |
| 761 } | 757 } |
| 762 | 758 |
| 763 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 759 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 760 RETURN_IF_ABANDONED |
| 761 |
| 764 fDrawTarget->drawBatch(*pipelineBuilder, batch); | 762 fDrawTarget->drawBatch(*pipelineBuilder, batch); |
| 765 } | 763 } |
| OLD | NEW |