#ifndef ImageBuffer_h
#define ImageBuffer_h
#include "platform/PlatformExport.h"
#include "platform/geometry/FloatRect.h"
#include "platform/geometry/IntSize.h"
#include "platform/graphics/Canvas2DLayerBridge.h"
#include "platform/graphics/ColorSpace.h"
#include "platform/graphics/GraphicsContext.h"
#include "platform/graphics/GraphicsTypes.h"
#include "platform/graphics/GraphicsTypes3D.h"
#include "platform/graphics/ImageBufferSurface.h"
#include "platform/transforms/AffineTransform.h"
#include "wtf/Forward.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/PassRefPtr.h"
#include "wtf/Uint8ClampedArray.h"
#include "wtf/Vector.h"
class SkCanvas;
namespace blink {
class WebGraphicsContext3D;
}
namespace WebCore {
class DrawingBuffer;
class Image;
class ImageBufferClient;
class IntPoint;
class IntRect;
enum Multiply {
Premultiplied,
Unmultiplied
};
enum BackingStoreCopy {
CopyBackingStore,
DontCopyBackingStore
};
enum ScaleBehavior {
Scaled,
Unscaled
};
class PLATFORM_EXPORT ImageBuffer {
WTF_MAKE_NONCOPYABLE(ImageBuffer); WTF_MAKE_FAST_ALLOCATED;
public:
static PassOwnPtr<ImageBuffer> create(const IntSize&, OpacityMode = NonOpaque);
static PassOwnPtr<ImageBuffer> create(PassOwnPtr<ImageBufferSurface>);
~ImageBuffer();
void setClient(ImageBufferClient* client) { m_client = client; }
const IntSize& size() const { return m_surface->size(); }
bool isAccelerated() const { return m_surface->isAccelerated(); }
bool isSurfaceValid() const;
bool restoreSurface() const;
void setIsHidden(bool hidden) { m_surface->setIsHidden(hidden); }
GraphicsContext* context() const;
const SkBitmap& bitmap() const;
PassRefPtr<Image> copyImage(BackingStoreCopy = CopyBackingStore, ScaleBehavior = Scaled) const;
static BackingStoreCopy fastCopyImageMode();
PassRefPtr<Uint8ClampedArray> getUnmultipliedImageData(const IntRect&) const;
PassRefPtr<Uint8ClampedArray> getPremultipliedImageData(const IntRect&) const;
void putByteArray(Multiply multiplied, Uint8ClampedArray*, const IntSize& sourceSize, const IntRect& sourceRect, const IntPoint& destPoint);
String toDataURL(const String& mimeType, const double* quality = 0) const;
AffineTransform baseTransform() const { return AffineTransform(); }
void transformColorSpace(ColorSpace srcColorSpace, ColorSpace dstColorSpace);
blink::WebLayer* platformLayer() const;
bool copyToPlatformTexture(blink::WebGraphicsContext3D*, Platform3DObject, GLenum, GLenum, GLint, bool, bool);
Platform3DObject getBackingTexture();
bool copyRenderingResultsFromDrawingBuffer(DrawingBuffer*);
void flush();
void notifySurfaceInvalid();
private:
ImageBuffer(PassOwnPtr<ImageBufferSurface>);
void draw(GraphicsContext*, const FloatRect&, const FloatRect& = FloatRect(0, 0, -1, -1), CompositeOperator = CompositeSourceOver, blink::WebBlendMode = blink::WebBlendModeNormal);
void drawPattern(GraphicsContext*, const FloatRect&, const FloatSize&, const FloatPoint&, CompositeOperator, const FloatRect&, blink::WebBlendMode, const IntSize& repeatSpacing = IntSize());
static PassRefPtr<SkColorFilter> createColorSpaceFilter(ColorSpace srcColorSpace, ColorSpace dstColorSpace);
friend class GraphicsContext;
friend class GeneratedImage;
friend class CrossfadeGeneratedImage;
friend class GradientGeneratedImage;
friend class SkiaImageFilterBuilder;
OwnPtr<ImageBufferSurface> m_surface;
OwnPtr<GraphicsContext> m_context;
ImageBufferClient* m_client;
};
struct ImageDataBuffer {
ImageDataBuffer(const IntSize& size, PassRefPtr<Uint8ClampedArray> data) : m_size(size), m_data(data) { }
IntSize size() const { return m_size; }
unsigned char* data() const { return m_data->data(); }
IntSize m_size;
RefPtr<Uint8ClampedArray> m_data;
};
String PLATFORM_EXPORT ImageDataToDataURL(const ImageDataBuffer&, const String& mimeType, const double* quality);
}
#endif