1 /*
2  * Copyright 2019 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 GrBaseContextPriv_DEFINED
9 #define GrBaseContextPriv_DEFINED
10 
11 #include "include/private/GrContext_Base.h"
12 
13 /** Class that exposes methods on GrContext_Base that are only intended for use internal to Skia.
14     This class is purely a privileged window into GrContext_Base. It should never have
15     additional data members or virtual methods. */
16 class GrBaseContextPriv {
17 public:
18     // from GrContext_Base
contextID()19     uint32_t contextID() const { return fContext->contextID(); }
20 
matches(GrContext_Base * candidate)21     bool matches(GrContext_Base* candidate) const { return fContext->matches(candidate); }
22 
options()23     const GrContextOptions& options() const { return fContext->options(); }
24 
caps()25     const GrCaps* caps() const { return fContext->caps(); }
26     sk_sp<const GrCaps> refCaps() const;
27 
asImageContext()28     GrImageContext* asImageContext() { return fContext->asImageContext(); }
asRecordingContext()29     GrRecordingContext* asRecordingContext() { return fContext->asRecordingContext(); }
asDirectContext()30     GrDirectContext* asDirectContext() { return fContext->asDirectContext(); }
31 
32     GrContextOptions::ShaderErrorHandler* getShaderErrorHandler() const;
33 
34 private:
GrBaseContextPriv(GrContext_Base * context)35     explicit GrBaseContextPriv(GrContext_Base* context) : fContext(context) {}
36     GrBaseContextPriv(const GrBaseContextPriv&) = delete;
37     GrBaseContextPriv& operator=(const GrBaseContextPriv&) = delete;
38 
39     // No taking addresses of this type.
40     const GrBaseContextPriv* operator&() const;
41     GrBaseContextPriv* operator&();
42 
43     GrContext_Base* fContext;
44 
45     friend class GrContext_Base; // to construct/copy this type.
46 };
47 
priv()48 inline GrBaseContextPriv GrContext_Base::priv() { return GrBaseContextPriv(this); }
49 
priv()50 inline const GrBaseContextPriv GrContext_Base::priv () const {  // NOLINT(readability-const-return-type)
51     return GrBaseContextPriv(const_cast<GrContext_Base*>(this));
52 }
53 
54 #endif
55