1 | /* |
2 | * Copyright 2015 Google Inc. |
3 | * |
4 | * Use of this source code is governed by a BSD-style license that can be |
5 | * found in the LICENSE file. |
6 | */ |
7 | |
8 | #ifndef GrRenderTargetPriv_DEFINED |
9 | #define GrRenderTargetPriv_DEFINED |
10 | |
11 | #include "src/gpu/GrGpu.h" |
12 | #include "src/gpu/GrRenderTarget.h" |
13 | |
14 | class GrStencilSettings; |
15 | |
16 | /** Class that adds methods to GrRenderTarget that are only intended for use internal to Skia. |
17 | This class is purely a privileged window into GrRenderTarget. It should never have additional |
18 | data members or virtual methods. */ |
19 | class GrRenderTargetPriv { |
20 | public: |
21 | /** |
22 | * GrStencilAttachment is not part of the public API. |
23 | */ |
24 | GrStencilAttachment* getStencilAttachment() const { |
25 | return fRenderTarget->fStencilAttachment.get(); |
26 | } |
27 | |
28 | /** |
29 | * Attaches the GrStencilAttachment onto the render target. If stencil is a nullptr then the |
30 | * currently attached GrStencilAttachment will be removed if one was previously attached. This |
31 | * function returns false if there were any failure in attaching the GrStencilAttachment. |
32 | */ |
33 | void attachStencilAttachment(sk_sp<GrStencilAttachment> stencil); |
34 | |
35 | int numStencilBits() const; |
36 | |
37 | /** |
38 | * Returns a unique key that identifies this render target's sample pattern. (Must be |
39 | * multisampled.) |
40 | */ |
41 | int getSamplePatternKey() const; |
42 | |
43 | /** |
44 | * Retrieves the per-pixel HW sample locations for this render target, and, as a by-product, the |
45 | * actual number of samples in use. (This may differ from fSampleCnt.) Sample locations are |
46 | * returned as 0..1 offsets relative to the top-left corner of the pixel. |
47 | */ |
48 | const SkTArray<SkPoint>& getSampleLocations() const { |
49 | int samplePatternKey = this->getSamplePatternKey(); |
50 | return fRenderTarget->getGpu()->retrieveSampleLocations(samplePatternKey); |
51 | } |
52 | |
53 | private: |
54 | explicit GrRenderTargetPriv(GrRenderTarget* renderTarget) : fRenderTarget(renderTarget) {} |
55 | GrRenderTargetPriv(const GrRenderTargetPriv&) {} // unimpl |
56 | GrRenderTargetPriv& operator=(const GrRenderTargetPriv&); // unimpl |
57 | |
58 | // No taking addresses of this type. |
59 | const GrRenderTargetPriv* operator&() const; |
60 | GrRenderTargetPriv* operator&(); |
61 | |
62 | GrRenderTarget* fRenderTarget; |
63 | |
64 | friend class GrRenderTarget; // to construct/copy this type. |
65 | }; |
66 | |
67 | inline GrRenderTargetPriv GrRenderTarget::renderTargetPriv() { return GrRenderTargetPriv(this); } |
68 | |
69 | inline const GrRenderTargetPriv GrRenderTarget::renderTargetPriv () const { |
70 | return GrRenderTargetPriv(const_cast<GrRenderTarget*>(this)); |
71 | } |
72 | |
73 | #endif |
74 | |