• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "SkGrPixelRef.h"
15 
16 class SkImage_Gpu : public SkImage_Base {
17 public:
18     SK_DECLARE_INST_COUNT(SkImage_Gpu)
19 
20     SkImage_Gpu(GrTexture*);
21     virtual ~SkImage_Gpu();
22 
23     virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) SK_OVERRIDE;
24 
getTexture()25     GrTexture* getTexture() { return fTexture; }
26 
27     void setTexture(GrTexture* texture);
28 
29 private:
30     GrTexture*  fTexture;
31     SkBitmap    fBitmap;
32 
33     typedef SkImage_Base INHERITED;
34 };
35 
SK_DEFINE_INST_COUNT(SkImage_Gpu)36 SK_DEFINE_INST_COUNT(SkImage_Gpu)
37 
38 ///////////////////////////////////////////////////////////////////////////////
39 
40 SkImage_Gpu::SkImage_Gpu(GrTexture* texture)
41     : INHERITED(texture->width(), texture->height())
42     , fTexture(texture) {
43 
44     SkASSERT(NULL != fTexture);
45     fTexture->ref();
46     fBitmap.setConfig(SkBitmap::kARGB_8888_Config, fTexture->width(), fTexture->height());
47     fBitmap.setPixelRef(new SkGrPixelRef(fTexture))->unref();
48 }
49 
~SkImage_Gpu()50 SkImage_Gpu::~SkImage_Gpu() {
51     SkSafeUnref(fTexture);
52 }
53 
onDraw(SkCanvas * canvas,SkScalar x,SkScalar y,const SkPaint * paint)54 void SkImage_Gpu::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y,
55                          const SkPaint* paint) {
56     canvas->drawBitmap(fBitmap, x, y, paint);
57 }
58 
setTexture(GrTexture * texture)59 void SkImage_Gpu::setTexture(GrTexture* texture) {
60 
61     if (texture == fTexture) {
62         return;
63     }
64 
65     SkRefCnt_SafeAssign(fTexture, texture);
66     fBitmap.setPixelRef(new SkGrPixelRef(texture))->unref();
67 }
68 
69 ///////////////////////////////////////////////////////////////////////////////
70 
NewTexture(GrTexture * texture)71 SkImage* SkImage::NewTexture(GrTexture* texture) {
72     if (NULL == texture) {
73         return NULL;
74     }
75 
76     return SkNEW_ARGS(SkImage_Gpu, (texture));
77 }
78 
SkTextureImageGetTexture(SkImage * image)79 GrTexture* SkTextureImageGetTexture(SkImage* image) {
80     return ((SkImage_Gpu*)image)->getTexture();
81 }
82 
SkTextureImageSetTexture(SkImage * image,GrTexture * texture)83 void SkTextureImageSetTexture(SkImage* image, GrTexture* texture) {
84     ((SkImage_Gpu*)image)->setTexture(texture);
85 }
86