Home | History | Annotate | Download | only in html
      1 /*
      2  * Copyright (C) 2004, 2006, 2009, 2010 Apple Inc. All rights reserved.
      3  * Copyright (C) 2007 Alp Toker <alp (at) atoker.com>
      4  * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #ifndef HTMLCanvasElement_h
     29 #define HTMLCanvasElement_h
     30 
     31 #include "FloatRect.h"
     32 #include "HTMLElement.h"
     33 #include "IntSize.h"
     34 
     35 #if PLATFORM(CHROMIUM) || PLATFORM(QT)
     36 #define DefaultInterpolationQuality InterpolationMedium
     37 #elif USE(CG)
     38 #define DefaultInterpolationQuality InterpolationLow
     39 #else
     40 #define DefaultInterpolationQuality InterpolationDefault
     41 #endif
     42 
     43 namespace WebCore {
     44 
     45 class CanvasContextAttributes;
     46 class CanvasRenderingContext;
     47 class GraphicsContext;
     48 class HTMLCanvasElement;
     49 class Image;
     50 class ImageData;
     51 class ImageBuffer;
     52 class IntSize;
     53 
     54 class CanvasObserver {
     55 public:
     56     virtual ~CanvasObserver() { }
     57 
     58     virtual void canvasChanged(HTMLCanvasElement*, const FloatRect& changedRect) = 0;
     59     virtual void canvasResized(HTMLCanvasElement*) = 0;
     60     virtual void canvasDestroyed(HTMLCanvasElement*) = 0;
     61 };
     62 
     63 class HTMLCanvasElement : public HTMLElement {
     64 public:
     65     static PassRefPtr<HTMLCanvasElement> create(Document*);
     66     static PassRefPtr<HTMLCanvasElement> create(const QualifiedName&, Document*);
     67     virtual ~HTMLCanvasElement();
     68 
     69     void addObserver(CanvasObserver*);
     70     void removeObserver(CanvasObserver*);
     71 
     72     // Attributes and functions exposed to script
     73     int width() const { return size().width(); }
     74     int height() const { return size().height(); }
     75 
     76     const IntSize& size() const { return m_size; }
     77 
     78     void setWidth(int);
     79     void setHeight(int);
     80 
     81     void setSize(const IntSize& newSize)
     82     {
     83         if (newSize == size())
     84             return;
     85         m_ignoreReset = true;
     86         setWidth(newSize.width());
     87         setHeight(newSize.height());
     88         m_ignoreReset = false;
     89         reset();
     90     }
     91 
     92     CanvasRenderingContext* getContext(const String&, CanvasContextAttributes* attributes = 0);
     93 
     94     String toDataURL(const String& mimeType, const double* quality, ExceptionCode&);
     95     String toDataURL(const String& mimeType, ExceptionCode& ec) { return toDataURL(mimeType, 0, ec); }
     96 
     97     // Used for rendering
     98     void didDraw(const FloatRect&);
     99 
    100     void paint(GraphicsContext*, const IntRect&);
    101 
    102     GraphicsContext* drawingContext() const;
    103 
    104     CanvasRenderingContext* renderingContext() const { return m_context.get(); }
    105 
    106     ImageBuffer* buffer() const;
    107     Image* copiedImage() const;
    108     void clearCopiedImage();
    109     PassRefPtr<ImageData> getImageData();
    110     void makePresentationCopy();
    111     void clearPresentationCopy();
    112 
    113     IntRect convertLogicalToDevice(const FloatRect&) const;
    114     IntSize convertLogicalToDevice(const FloatSize&) const;
    115     IntSize convertToValidDeviceSize(float width, float height) const;
    116 
    117     const SecurityOrigin& securityOrigin() const;
    118     void setOriginTainted() { m_originClean = false; }
    119     bool originClean() const { return m_originClean; }
    120 
    121     CSSStyleSelector* styleSelector();
    122 
    123     AffineTransform baseTransform() const;
    124 
    125 #if ENABLE(WEBGL)
    126     bool is3D() const;
    127 #endif
    128 
    129     void makeRenderingResultsAvailable();
    130 
    131 #if PLATFORM(ANDROID)
    132     void clearDirtyRect() { m_dirtyRect = FloatRect(); }
    133 #endif
    134 
    135 private:
    136     HTMLCanvasElement(const QualifiedName&, Document*);
    137 
    138     virtual void parseMappedAttribute(Attribute*);
    139     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
    140 
    141     void reset();
    142 
    143     void createImageBuffer() const;
    144 
    145     void setSurfaceSize(const IntSize&);
    146     bool hasCreatedImageBuffer() const { return m_hasCreatedImageBuffer; }
    147 
    148     HashSet<CanvasObserver*> m_observers;
    149 
    150     IntSize m_size;
    151 
    152     OwnPtr<CanvasRenderingContext> m_context;
    153 
    154     bool m_rendererIsCanvas;
    155 
    156     bool m_ignoreReset;
    157     FloatRect m_dirtyRect;
    158 
    159     float m_pageScaleFactor;
    160     bool m_originClean;
    161 
    162     // m_createdImageBuffer means we tried to malloc the buffer.  We didn't necessarily get it.
    163     mutable bool m_hasCreatedImageBuffer;
    164     mutable OwnPtr<ImageBuffer> m_imageBuffer;
    165 
    166     mutable RefPtr<Image> m_presentedImage;
    167     mutable RefPtr<Image> m_copiedImage; // FIXME: This is temporary for platforms that have to copy the image buffer to render (and for CSSCanvasValue).
    168 };
    169 
    170 } //namespace
    171 
    172 #endif
    173