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 SkImage_Gpu_DEFINED
9#define SkImage_Gpu_DEFINED
10
11#include "SkAtomics.h"
12#include "GrTexture.h"
13#include "GrGpuResourcePriv.h"
14#include "SkBitmap.h"
15#include "SkImage_Base.h"
16#include "SkImagePriv.h"
17#include "SkSurface.h"
18
19class SkImage_Gpu : public SkImage_Base {
20public:
21    /**
22     *  An "image" can be a subset/window into a larger texture, so we explicit take the
23     *  width and height.
24     */
25    SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType, GrTexture*, SkBudgeted);
26    ~SkImage_Gpu() override;
27
28    void applyBudgetDecision() const {
29        GrTexture* tex = this->getTexture();
30        SkASSERT(tex);
31        if (SkBudgeted::kYes == fBudgeted) {
32            tex->resourcePriv().makeBudgeted();
33        } else {
34            tex->resourcePriv().makeUnbudgeted();
35        }
36    }
37
38    bool getROPixels(SkBitmap*, CachingHint) const override;
39    GrTexture* asTextureRef(GrContext* ctx, const GrTextureParams& params) const override;
40    SkImage* onNewSubset(const SkIRect&) const override;
41
42    GrTexture* peekTexture() const override { return fTexture; }
43    bool isOpaque() const override;
44    bool onReadPixels(const SkImageInfo&, void* dstPixels, size_t dstRowBytes,
45                      int srcX, int srcY, CachingHint) const override;
46
47    SkSurface* onNewSurface(const SkImageInfo& info) const override {
48        return SkSurface::NewRenderTarget(fTexture->getContext(), SkBudgeted::kNo, info);
49    }
50
51    bool asBitmapForImageFilters(SkBitmap* bitmap) const override;
52
53private:
54    SkAutoTUnref<GrTexture>     fTexture;
55    const SkAlphaType           fAlphaType;
56    const SkBudgeted            fBudgeted;
57    mutable SkAtomic<bool>      fAddedRasterVersionToCache;
58
59
60    typedef SkImage_Base INHERITED;
61};
62
63#endif
64