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 "SkImage.h" 12#include "SkSurface.h" 13 14static SkSurfaceProps copy_or_safe_defaults(const SkSurfaceProps* props) { 15 return props ? *props : SkSurfaceProps(0, kUnknown_SkPixelGeometry); 16} 17 18class SkImage_Base : public SkImage { 19public: 20 SkImage_Base(int width, int height, const SkSurfaceProps* props) 21 : INHERITED(width, height) 22 , fProps(copy_or_safe_defaults(props)) 23 {} 24 25 /** 26 * If the props weren't know at constructor time, call this but only before the image is 27 * ever released into the wild (since the props field must appear to be immutable). 28 */ 29 void initWithProps(const SkSurfaceProps& props) { 30 SkASSERT(this->unique()); // only viewed by one thread 31 SkSurfaceProps* mutableProps = const_cast<SkSurfaceProps*>(&fProps); 32 SkASSERT(mutableProps != &props); // check for self-assignment 33 mutableProps->~SkSurfaceProps(); 34 new (mutableProps) SkSurfaceProps(props); 35 } 36 37 const SkSurfaceProps& props() const { return fProps; } 38 39 virtual SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const = 0; 40 41 virtual const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const { 42 return NULL; 43 } 44 45 // Default impl calls onDraw 46 virtual bool onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, 47 int srcX, int srcY) const; 48 49 virtual GrTexture* onGetTexture() const { return NULL; } 50 51 // return a read-only copy of the pixels. We promise to not modify them, 52 // but only inspect them (or encode them). 53 virtual bool getROPixels(SkBitmap*) const { return false; } 54 55 virtual SkShader* onNewShader(SkShader::TileMode, 56 SkShader::TileMode, 57 const SkMatrix* localMatrix) const { return NULL; }; 58 59 // newWidth > 0, newHeight > 0, subset either NULL or a proper subset of this bounds 60 virtual SkImage* onNewImage(int newWidth, int newHeight, const SkIRect* subset, 61 SkFilterQuality) const; 62 63private: 64 const SkSurfaceProps fProps; 65 66 typedef SkImage INHERITED; 67}; 68 69static inline SkImage_Base* as_IB(SkImage* image) { 70 return static_cast<SkImage_Base*>(image); 71} 72 73static inline const SkImage_Base* as_IB(const SkImage* image) { 74 return static_cast<const SkImage_Base*>(image); 75} 76 77#endif 78