180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkImage_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkImage_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkImageEncoder.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRefCnt.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkScalar.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkData; 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkCanvas; 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkPaint; 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkShader; 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrContext; 20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrTexture; 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// need for TileMode 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkShader.h" 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * SkImage is an abstraction for drawing a rectagle of pixels, though the 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * particular type of image could be actually storing its data on the GPU, or 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * as drawing commands (picture or PDF or otherwise), ready to be played back 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * into another canvas. 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The content of SkImage is always immutable, though the actual storage may 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * change, if for example that image can be re-created via encoded data or 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * other means. 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass SK_API SkImage : public SkRefCnt { 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SK_DECLARE_INST_COUNT(SkImage) 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum ColorType { 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kAlpha_8_ColorType, 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kRGB_565_ColorType, 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kRGBA_8888_ColorType, 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kBGRA_8888_ColorType, 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kPMColor_ColorType, 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kLastEnum_ColorType = kPMColor_ColorType 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum AlphaType { 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kIgnore_AlphaType, 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kOpaque_AlphaType, 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kPremul_AlphaType, 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kUnpremul_AlphaType, 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kLastEnum_AlphaType = kUnpremul_AlphaType 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct Info { 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fWidth; 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fHeight; 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ColorType fColorType; 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AlphaType fAlphaType; 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static SkImage* NewRasterCopy(const Info&, const void* pixels, size_t rowBytes); 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static SkImage* NewRasterData(const Info&, SkData* pixels, size_t rowBytes); 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImage* NewEncodedData(SkData*); 68e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger 69e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger /** 70e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger * GrTexture is a more logical parameter for this factory, but its 71e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger * interactions with scratch cache still has issues, so for now we take 72e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger * SkBitmap instead. This will be changed in the future. skbug.com/1449 73e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger */ 74e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger static SkImage* NewTexture(const SkBitmap&); 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int width() const { return fWidth; } 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int height() const { return fHeight; } 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uint32_t uniqueID() const { return fUniqueID; } 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger /** 817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Return the GrTexture that stores the image pixels. Calling getTexture 827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * does not affect the reference count of the GrTexture object. 837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Will return NULL if the image does not use a texture. 847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrTexture* getTexture(); 867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader* newShaderClamp() const; 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader* newShader(SkShader::TileMode, SkShader::TileMode) const; 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void draw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*); 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Draw the image, cropped to the src rect, to the dst rect of a canvas. 9458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * If src is larger than the bounds of the image, the rest of the image is 9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * filled with transparent black pixels. 9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * 9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * See SkCanvas::drawBitmapRectToRect for similar behavior. 9858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 9958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void draw(SkCanvas*, const SkRect* src, const SkRect& dst, const SkPaint*); 10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger /** 1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Encode the image's pixels and return the result as a new SkData, which 1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * the caller must manage (i.e. call unref() when they are done). 1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * 1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * If the image type cannot be encoded, or the requested encoder type is 1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * not supported, this will return NULL. 1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 10858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkData* encode(SkImageEncoder::Type t = SkImageEncoder::kPNG_Type, 10958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int quality = 80) const; 1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkImage(int width, int height) : 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fWidth(width), 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fHeight(height), 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fUniqueID(NextUniqueID()) { 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(width >= 0); 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(height >= 0); 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const int fWidth; 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const int fHeight; 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const uint32_t fUniqueID; 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static uint32_t NextUniqueID(); 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkRefCnt INHERITED; 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 132