Home | History | Annotate | Download | only in graphics
      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