
#ifndef GrRecordingContextPriv_DEFINED
#  define GrRecordingContextPriv_DEFINED
#  include "include/private/GrRecordingContext.h"
/** Class that exposes methods to GrRecordingContext that are only intended for use internal to
    Skia. This class is purely a privileged window into GrRecordingContext. It should never have
    additional data members or virtual methods. */
class GrRecordingContextPriv
{
public:
    // from GrContext_Base
  uint32_t contextID() const
  {
    return fContext->contextID();
  }
  bool matches(GrContext_Base* candidate) const
  {
    return fContext->matches(candidate);
  }
  const GrContextOptions& options() const
  {
    return fContext->options();
  }
  const GrCaps* caps() const
  {
    return fContext->caps();
  }
  sk_sp<const GrCaps> refCaps() const;
  sk_sp<GrSkSLFPFactoryCache> fpFactoryCache();
  GrImageContext* asImageContext()
  {
    return fContext->asImageContext();
  }
  GrRecordingContext* asRecordingContext()
  {
    return fContext->asRecordingContext();
  }
  GrContext* asDirectContext()
  {
    return fContext->asDirectContext();
  }
    // from GrImageContext
  GrProxyProvider* proxyProvider()
  {
    return fContext->proxyProvider();
  }
  const GrProxyProvider* proxyProvider() const
  {
    return fContext->proxyProvider();
  }
  bool abandoned() const
  {
    return fContext->abandoned();
  }
    /** This is only useful for debug purposes */
  GrDrawingManager* drawingManager()
  {
    return fContext->drawingManager();
  }
  sk_sp<GrOpMemoryPool> refOpMemoryPool();
  GrOpMemoryPool* opMemoryPool()
  {
    return fContext->opMemoryPool();
  }
  GrStrikeCache* getGrStrikeCache()
  {
    return fContext->getGrStrikeCache();
  }
  GrTextBlobCache* getTextBlobCache()
  {
    return fContext->getTextBlobCache();
  }
    /**
     * Registers an object for flush-related callbacks. (See GrOnFlushCallbackObject.)
     *
     * NOTE: the drawing manager tracks this object as a raw pointer; it is up to the caller to
     * ensure its lifetime is tied to that of the context.
     */
  void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
  std::unique_ptr<GrSurfaceContext> makeWrappedSurfaceContext(sk_sp<GrSurfaceProxy>, GrColorType, SkAlphaType, sk_sp<SkColorSpace> = nullptr, const SkSurfaceProps* = nullptr);
    /** Create a new texture context backed by a deferred-style GrTextureProxy. */
  std::unique_ptr<GrTextureContext> makeDeferredTextureContext(SkBackingFit, int width, int height, GrColorType, SkAlphaType, sk_sp<SkColorSpace>, GrMipMapped = GrMipMapped::kNo, GrSurfaceOrigin = kTopLeft_GrSurfaceOrigin, SkBudgeted = SkBudgeted::kYes, GrProtected = GrProtected::kNo);
    /*
     * Create a new render target context backed by a deferred-style
     * GrRenderTargetProxy. We guarantee that "asTextureProxy" will succeed for
     * renderTargetContexts created via this entry point.
     */
  std::unique_ptr<GrRenderTargetContext> makeDeferredRenderTargetContext(SkBackingFit fit, int width, int height, GrColorType, sk_sp<SkColorSpace> colorSpace, int sampleCnt = 1, GrMipMapped = GrMipMapped::kNo, GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin, const SkSurfaceProps* surfaceProps = nullptr, SkBudgeted = SkBudgeted::kYes, GrProtected isProtected = GrProtected::kNo);
    /*
     * This method will attempt to create a renderTargetContext that has, at least, the number of
     * channels and precision per channel as requested in 'config' (e.g., A8 and 888 can be
     * converted to 8888). It may also swizzle the channels (e.g., BGRA -> RGBA).
     * SRGB-ness will be preserved.
     */
  std::unique_ptr<GrRenderTargetContext> makeDeferredRenderTargetContextWithFallback(SkBackingFit fit, int width, int height, GrColorType, sk_sp<SkColorSpace> colorSpace, int sampleCnt = 1, GrMipMapped = GrMipMapped::kNo, GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin, const SkSurfaceProps* surfaceProps = nullptr, SkBudgeted budgeted = SkBudgeted::kYes, GrProtected isProtected = GrProtected::kNo);
  GrAuditTrail* auditTrail()
  {
    return fContext->auditTrail();
  }
    // CONTEXT TODO: remove this backdoor
    // In order to make progress we temporarily need a way to break CL impasses.
  GrContext* backdoor();
private:
  explicit GrRecordingContextPriv(GrRecordingContext* context)
    : fContext(context)
  {
  }
  GrRecordingContextPriv(const GrRecordingContextPriv&);
  GrRecordingContextPriv& operator=(const GrRecordingContextPriv&);
    // No taking addresses of this type.
  const GrRecordingContextPriv* operator&() const;
  GrRecordingContextPriv* operator&();
  GrRecordingContext* fContext;
  friend class GrRecordingContext;
};
inline GrRecordingContextPriv GrRecordingContext::priv()
{
  return GrRecordingContextPriv(this);
}
inline const GrRecordingContextPriv GrRecordingContext::priv() const
{
  return GrRecordingContextPriv(const_cast<GrRecordingContext*>(this));
}
#endif
