1 /* 2 * Copyright (C) 2006 Nikolas Zimmermann <zimmermann (at) kde.org> 3 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef ImageBuffer_h 28 #define ImageBuffer_h 29 30 #include "AffineTransform.h" 31 #include "Image.h" 32 #include "IntSize.h" 33 #include "ImageBufferData.h" 34 #include <wtf/OwnPtr.h> 35 #include <wtf/PassOwnPtr.h> 36 #include <wtf/PassRefPtr.h> 37 38 namespace WebCore { 39 40 class GraphicsContext; 41 class ImageData; 42 class IntPoint; 43 class IntRect; 44 class String; 45 46 enum ImageColorSpace { 47 Unknown, 48 DeviceRGB, // like sRGB 49 GrayScale, 50 LinearRGB 51 }; 52 53 enum Multiply { 54 Premultiplied, 55 Unmultiplied 56 }; 57 58 class ImageBuffer : public Noncopyable { 59 public: 60 // Will return a null pointer on allocation failure. 61 static PassOwnPtr<ImageBuffer> create(const IntSize& size, ImageColorSpace colorSpace = DeviceRGB) 62 { 63 bool success = false; 64 OwnPtr<ImageBuffer> buf(new ImageBuffer(size, colorSpace, success)); 65 if (success) 66 return buf.release(); 67 return 0; 68 } 69 70 ~ImageBuffer(); 71 72 const IntSize& size() const { return m_size; } 73 GraphicsContext* context() const; 74 75 Image* image() const; 76 77 void clearImage() { m_image.clear(); } 78 79 PassRefPtr<ImageData> getUnmultipliedImageData(const IntRect&) const; 80 PassRefPtr<ImageData> getPremultipliedImageData(const IntRect&) const; 81 82 void putUnmultipliedImageData(ImageData*, const IntRect& sourceRect, const IntPoint& destPoint); 83 void putPremultipliedImageData(ImageData*, const IntRect& sourceRect, const IntPoint& destPoint); 84 85 String toDataURL(const String& mimeType) const; 86 #if !PLATFORM(CG) 87 AffineTransform baseTransform() const { return AffineTransform(); } 88 void transformColorSpace(ImageColorSpace srcColorSpace, ImageColorSpace dstColorSpace); 89 void platformTransformColorSpace(const Vector<int>&); 90 #else 91 AffineTransform baseTransform() const { return AffineTransform(1, 0, 0, -1, 0, m_size.height()); } 92 #endif 93 private: 94 ImageBufferData m_data; 95 96 IntSize m_size; 97 OwnPtr<GraphicsContext> m_context; 98 mutable RefPtr<Image> m_image; 99 100 #if !PLATFORM(CG) 101 Vector<int> m_linearRgbLUT; 102 Vector<int> m_deviceRgbLUT; 103 #endif 104 105 // This constructor will place its success into the given out-variable 106 // so that create() knows when it should return failure. 107 ImageBuffer(const IntSize&, ImageColorSpace colorSpace, bool& success); 108 }; 109 110 } // namespace WebCore 111 112 #endif // ImageBuffer_h 113