/*
 * Copyright 2018 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrContextThreadSafeProxyPriv_DEFINED
#define GrContextThreadSafeProxyPriv_DEFINED

#include "include/gpu/GrContextThreadSafeProxy.h"
#include "include/private/gpu/ganesh/GrContext_Base.h"

#include "src/gpu/ganesh/GrCaps.h"
#include "src/text/gpu/TextBlobRedrawCoordinator.h"

/**
 * Class that adds methods to GrContextThreadSafeProxy that are only intended for use internal to
 * Skia. This class is purely a privileged window into GrContextThreadSafeProxy. It should never
 * have additional data members or virtual methods.
 */
class GrContextThreadSafeProxyPriv {
public:
    void init(sk_sp<const GrCaps>, sk_sp<GrThreadSafePipelineBuilder>) const;

    bool matches(GrContext_Base* candidate) const {
        return fProxy == candidate->threadSafeProxy().get();
    }

    GrBackend backend() const { return fProxy->fBackend; }
    const GrContextOptions& options() const { return fProxy->fOptions; }
    uint32_t contextID() const { return fProxy->fContextID; }

    const GrCaps* caps() const { return fProxy->fCaps.get(); }
    sk_sp<const GrCaps> refCaps() const { return fProxy->fCaps; }

    sktext::gpu::TextBlobRedrawCoordinator* getTextBlobRedrawCoordinator() {
        return fProxy->fTextBlobRedrawCoordinator.get();
    }
    const sktext::gpu::TextBlobRedrawCoordinator* getTextBlobRedrawCoordinator() const {
        return fProxy->fTextBlobRedrawCoordinator.get();
    }

    GrThreadSafeCache* threadSafeCache() { return fProxy->fThreadSafeCache.get(); }
    const GrThreadSafeCache* threadSafeCache() const { return fProxy->fThreadSafeCache.get(); }

    void abandonContext() { fProxy->abandonContext(); }
    bool abandoned() const { return fProxy->abandoned(); }

    // GrContextThreadSafeProxyPriv
    static sk_sp<GrContextThreadSafeProxy> Make(GrBackendApi, const GrContextOptions&);

private:
    explicit GrContextThreadSafeProxyPriv(GrContextThreadSafeProxy* proxy) : fProxy(proxy) {}
    GrContextThreadSafeProxyPriv& operator=(const GrContextThreadSafeProxyPriv&) = delete;

    // No taking addresses of this type.
    const GrContextThreadSafeProxyPriv* operator&() const = delete;
    GrContextThreadSafeProxyPriv* operator&() = delete;

    GrContextThreadSafeProxy* fProxy;

    friend class GrContextThreadSafeProxy;  // to construct/copy this type.
};

inline GrContextThreadSafeProxyPriv GrContextThreadSafeProxy::priv() {
    return GrContextThreadSafeProxyPriv(this);
}

inline const GrContextThreadSafeProxyPriv GrContextThreadSafeProxy::priv() const {  // NOLINT(readability-const-return-type)
    return GrContextThreadSafeProxyPriv(const_cast<GrContextThreadSafeProxy*>(this));
}

#endif
