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

#ifndef GrImageTextureMaker_DEFINED
#define GrImageTextureMaker_DEFINED

#include "include/core/SkImage.h"
#include "src/gpu/GrTextureMaker.h"
#include "src/gpu/SkGr.h"

class SkImage_Lazy;
class SkImage_GpuYUVA;

/** This class manages the conversion of generator-backed images to GrTextures. If the caching hint
    is kAllow the image's ID is used for the cache key. */
class GrImageTextureMaker final : public GrTextureMaker {
public:
    GrImageTextureMaker(GrRecordingContext*, const SkImage* client, GrImageTexGenPolicy);

private:
    GrSurfaceProxyView refOriginalTextureProxyView(GrMipmapped) override;

    const SkImage_Lazy*     fImage;
    GrImageTexGenPolicy     fTexGenPolicy;

    typedef GrTextureMaker INHERITED;
};

/** This class manages the conversion of generator-backed YUVA images to GrTextures. */
class GrYUVAImageTextureMaker final : public GrTextureMaker {
public:
    GrYUVAImageTextureMaker(GrRecordingContext* context, const SkImage* client);

    std::unique_ptr<GrFragmentProcessor> createFragmentProcessor(const SkMatrix& textureMatrix,
                                                                 const SkRect* subset,
                                                                 const SkRect* domain,
                                                                 GrSamplerState) override;

    std::unique_ptr<GrFragmentProcessor> createBicubicFragmentProcessor(
            const SkMatrix& textureMatrix,
            const SkRect* subset,
            const SkRect* domain,
            GrSamplerState::WrapMode wrapX,
            GrSamplerState::WrapMode wrapY) override;

    bool isPlanar() const override { return true; }

private:
    GrSurfaceProxyView refOriginalTextureProxyView(GrMipmapped) override;

    const SkImage_GpuYUVA*  fImage;

    typedef GrTextureMaker INHERITED;
};

#endif
