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