• 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 #ifndef SkImage_Base_DEFINED
9 #define SkImage_Base_DEFINED
10 
11 #include "SkAtomics.h"
12 #include "SkImage.h"
13 #include "SkSurface.h"
14 
15 #include <new>
16 
17 class GrTextureParams;
18 class SkImageCacherator;
19 
20 enum {
21     kNeedNewImageUniqueID = 0
22 };
23 
24 class SkImage_Base : public SkImage {
25 public:
26     SkImage_Base(int width, int height, uint32_t uniqueID);
27     virtual ~SkImage_Base();
28 
onPeekPixels(SkImageInfo *,size_t *)29     virtual const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const { return nullptr; }
30 
31     // Default impl calls onDraw
32     virtual bool onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
33                               int srcX, int srcY, CachingHint) const;
34 
peekTexture()35     virtual GrTexture* peekTexture() const { return nullptr; }
peekCacherator()36     virtual SkImageCacherator* peekCacherator() const { return nullptr; }
37 
38     // return a read-only copy of the pixels. We promise to not modify them,
39     // but only inspect them (or encode them).
40     virtual bool getROPixels(SkBitmap*, CachingHint = kAllow_CachingHint) const = 0;
41 
onNewSurface(const SkImageInfo & info)42     virtual SkSurface* onNewSurface(const SkImageInfo& info) const {
43         return SkSurface::NewRaster(info);
44     }
45 
46     // Caller must call unref when they are done.
47     virtual GrTexture* asTextureRef(GrContext*, const GrTextureParams&) const = 0;
48 
49     virtual SkImage* onNewSubset(const SkIRect&) const = 0;
50 
51     // If a ctx is specified, then only gpu-specific formats are requested.
onRefEncoded(GrContext *)52     virtual SkData* onRefEncoded(GrContext*) const { return nullptr; }
53 
54     virtual bool onAsLegacyBitmap(SkBitmap*, LegacyBitmapMode) const;
55 
onIsLazyGenerated()56     virtual bool onIsLazyGenerated() const { return false; }
57 
58     // Return a bitmap suitable for passing to image-filters
59     // For now, that means wrapping textures into SkGrPixelRefs...
asBitmapForImageFilters(SkBitmap * bitmap)60     virtual bool asBitmapForImageFilters(SkBitmap* bitmap) const {
61         return this->getROPixels(bitmap, kAllow_CachingHint);
62     }
63 
64     // Call when this image is part of the key to a resourcecache entry. This allows the cache
65     // to know automatically those entries can be purged when this SkImage deleted.
notifyAddedToCache()66     void notifyAddedToCache() const {
67         fAddedToCache.store(true);
68     }
69 
70 private:
71     // Set true by caches when they cache content that's derived from the current pixels.
72     mutable SkAtomic<bool> fAddedToCache;
73 
74     typedef SkImage INHERITED;
75 };
76 
as_IB(SkImage * image)77 static inline SkImage_Base* as_IB(SkImage* image) {
78     return static_cast<SkImage_Base*>(image);
79 }
80 
as_IB(const SkImage * image)81 static inline const SkImage_Base* as_IB(const SkImage* image) {
82     return static_cast<const SkImage_Base*>(image);
83 }
84 
85 #endif
86