1/*
2 * Copyright 2012 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#include "SkImage_Base.h"
9#include "SkImagePriv.h"
10#include "SkBitmap.h"
11#include "SkCanvas.h"
12#include "GrContext.h"
13#include "GrTexture.h"
14
15class SkImage_Gpu : public SkImage_Base {
16public:
17    SK_DECLARE_INST_COUNT(SkImage_Gpu)
18
19    explicit SkImage_Gpu(const SkBitmap&);
20    virtual ~SkImage_Gpu();
21
22    virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const SK_OVERRIDE;
23    virtual void onDrawRectToRect(SkCanvas*, const SkRect* src, const SkRect& dst,
24                                  const SkPaint*) const SK_OVERRIDE;
25    virtual GrTexture* onGetTexture() const SK_OVERRIDE;
26    virtual bool getROPixels(SkBitmap*) const SK_OVERRIDE;
27
28    GrTexture* getTexture() const { return fBitmap.getTexture(); }
29
30    virtual SkShader* onNewShader(SkShader::TileMode,
31                                  SkShader::TileMode,
32                                  const SkMatrix* localMatrix) const SK_OVERRIDE;
33
34    virtual bool isOpaque() const SK_OVERRIDE;
35
36private:
37    SkBitmap    fBitmap;
38
39    typedef SkImage_Base INHERITED;
40};
41
42///////////////////////////////////////////////////////////////////////////////
43
44SkImage_Gpu::SkImage_Gpu(const SkBitmap& bitmap)
45    : INHERITED(bitmap.width(), bitmap.height())
46    , fBitmap(bitmap) {
47    SkASSERT(fBitmap.getTexture());
48}
49
50SkImage_Gpu::~SkImage_Gpu() {
51}
52
53SkShader* SkImage_Gpu::onNewShader(SkShader::TileMode tileX,
54                                   SkShader::TileMode tileY,
55                                   const SkMatrix* localMatrix) const
56{
57    return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, localMatrix);
58}
59
60void SkImage_Gpu::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const {
61    canvas->drawBitmap(fBitmap, x, y, paint);
62}
63
64void SkImage_Gpu::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst,
65                                   const SkPaint* paint) const {
66    canvas->drawBitmapRectToRect(fBitmap, src, dst, paint);
67}
68
69GrTexture* SkImage_Gpu::onGetTexture() const {
70    return fBitmap.getTexture();
71}
72
73bool SkImage_Gpu::getROPixels(SkBitmap* dst) const {
74    return fBitmap.copyTo(dst, kN32_SkColorType);
75}
76
77bool SkImage_Gpu::isOpaque() const {
78    return fBitmap.isOpaque();
79}
80
81///////////////////////////////////////////////////////////////////////////////
82
83SkImage* SkImage::NewTexture(const SkBitmap& bitmap) {
84    if (NULL == bitmap.getTexture()) {
85        return NULL;
86    }
87
88    return SkNEW_ARGS(SkImage_Gpu, (bitmap));
89}
90
91GrTexture* SkTextureImageGetTexture(SkImage* image) {
92    return ((SkImage_Gpu*)image)->getTexture();
93}
94