Changeset 63025 in webkit


Ignore:
Timestamp:
Jul 9, 2010 6:26:56 PM (14 years ago)
Author:
jamesr@google.com
Message:

2010-07-09 James Robinson <jamesr@chromium.org>

Reviewed by Darin Adler.

Removes CanvasSurface and moves all of its functionality to HTMLCanvasElement.
https://bugs.webkit.org/show_bug.cgi?id=42005

http://trac.webkit.org/changeset/55201 introduced a new base class for HTMLCanvasElement called CanvasSurface.
The intention was that this would allow for code sharing with the then-proposed OffscreenCanvas. However,
there is no OffscreenCanvas and there's unlikely to be one soon. Additionally CanvasSurface breaks
encapsulation pretty badly by doing "static_cast<HTMLCanvasElement* const>(this)". Until an abstraction is
really needed we should just use HTMLCanvasElement when we want to talk about a canvas.

This patch moves all of CanvasSurface's functionality back up to HTMLCanvasElement and reorders the header
to be a bit more logical.

Refactor with no behavior change, thus no new tests.

  • CMakeLists.txt:
  • GNUmakefile.am:
  • WebCore.gypi:
  • WebCore.pro:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/CanvasSurface.cpp: Removed.
  • dom/CanvasSurface.h: Removed.
  • html/HTMLCanvasElement.cpp: (WebCore::HTMLCanvasElement::HTMLCanvasElement): (WebCore::HTMLCanvasElement::willDraw): (WebCore::HTMLCanvasElement::setSurfaceSize): (WebCore::HTMLCanvasElement::toDataURL): (WebCore::HTMLCanvasElement::convertLogicalToDevice): (WebCore::HTMLCanvasElement::securityOrigin): (WebCore::HTMLCanvasElement::styleSelector): (WebCore::HTMLCanvasElement::createImageBuffer): (WebCore::HTMLCanvasElement::drawingContext): (WebCore::HTMLCanvasElement::buffer): (WebCore::HTMLCanvasElement::baseTransform):
  • html/HTMLCanvasElement.h: (WebCore::HTMLCanvasElement::setObserver): (WebCore::HTMLCanvasElement::width): (WebCore::HTMLCanvasElement::height): (WebCore::HTMLCanvasElement::size): (WebCore::HTMLCanvasElement::toDataURL): (WebCore::HTMLCanvasElement::setOriginTainted): (WebCore::HTMLCanvasElement::originClean): (WebCore::HTMLCanvasElement::hasCreatedImageBuffer):
Location:
trunk/WebCore
Files:
2 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/CMakeLists.txt

    r62998 r63025  
    759759    dom/BeforeTextInsertedEvent.cpp
    760760    dom/BeforeUnloadEvent.cpp
    761     dom/CanvasSurface.cpp
    762761    dom/CDATASection.cpp
    763762    dom/CharacterData.cpp
  • trunk/WebCore/ChangeLog

    r63022 r63025  
     12010-07-09  James Robinson  <jamesr@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Removes CanvasSurface and moves all of its functionality to HTMLCanvasElement.
     6        https://bugs.webkit.org/show_bug.cgi?id=42005
     7
     8        http://trac.webkit.org/changeset/55201 introduced a new base class for HTMLCanvasElement called CanvasSurface.
     9        The intention was that this would allow for code sharing with the then-proposed OffscreenCanvas.  However,
     10        there is no OffscreenCanvas and there's unlikely to be one soon.  Additionally CanvasSurface breaks
     11        encapsulation pretty badly by doing "static_cast<HTMLCanvasElement* const>(this)".  Until an abstraction is
     12        really needed we should just use HTMLCanvasElement when we want to talk about a canvas.
     13
     14        This patch moves all of CanvasSurface's functionality back up to HTMLCanvasElement and reorders the header
     15        to be a bit more logical.
     16
     17        Refactor with no behavior change, thus no new tests.
     18
     19        * CMakeLists.txt:
     20        * GNUmakefile.am:
     21        * WebCore.gypi:
     22        * WebCore.pro:
     23        * WebCore.vcproj/WebCore.vcproj:
     24        * WebCore.xcodeproj/project.pbxproj:
     25        * dom/CanvasSurface.cpp: Removed.
     26        * dom/CanvasSurface.h: Removed.
     27        * html/HTMLCanvasElement.cpp:
     28        (WebCore::HTMLCanvasElement::HTMLCanvasElement):
     29        (WebCore::HTMLCanvasElement::willDraw):
     30        (WebCore::HTMLCanvasElement::setSurfaceSize):
     31        (WebCore::HTMLCanvasElement::toDataURL):
     32        (WebCore::HTMLCanvasElement::convertLogicalToDevice):
     33        (WebCore::HTMLCanvasElement::securityOrigin):
     34        (WebCore::HTMLCanvasElement::styleSelector):
     35        (WebCore::HTMLCanvasElement::createImageBuffer):
     36        (WebCore::HTMLCanvasElement::drawingContext):
     37        (WebCore::HTMLCanvasElement::buffer):
     38        (WebCore::HTMLCanvasElement::baseTransform):
     39        * html/HTMLCanvasElement.h:
     40        (WebCore::HTMLCanvasElement::setObserver):
     41        (WebCore::HTMLCanvasElement::width):
     42        (WebCore::HTMLCanvasElement::height):
     43        (WebCore::HTMLCanvasElement::size):
     44        (WebCore::HTMLCanvasElement::toDataURL):
     45        (WebCore::HTMLCanvasElement::setOriginTainted):
     46        (WebCore::HTMLCanvasElement::originClean):
     47        (WebCore::HTMLCanvasElement::hasCreatedImageBuffer):
     48
    1492010-07-09  Simon Fraser  <simon.fraser@apple.com>
    250
  • trunk/WebCore/GNUmakefile.am

    r62876 r63025  
    756756        WebCore/dom/CSSMappedAttributeDeclaration.cpp \
    757757        WebCore/dom/CSSMappedAttributeDeclaration.h \
    758         WebCore/dom/CanvasSurface.cpp \
    759         WebCore/dom/CanvasSurface.h \
    760758        WebCore/dom/CharacterData.cpp \
    761759        WebCore/dom/CharacterData.h \
  • trunk/WebCore/WebCore.gypi

    r62876 r63025  
    10771077            'dom/CSSMappedAttributeDeclaration.cpp',
    10781078            'dom/CSSMappedAttributeDeclaration.h',
    1079             'dom/CanvasSurface.cpp',
    1080             'dom/CanvasSurface.h',
    10811079            'dom/CharacterData.cpp',
    10821080            'dom/CharacterData.h',
  • trunk/WebCore/WebCore.pro

    r62953 r63025  
    448448    dom/BeforeUnloadEvent.cpp \
    449449    dom/CDATASection.cpp \
    450     dom/CanvasSurface.cpp \
    451450    dom/CharacterData.cpp \
    452451    dom/CheckedRadioButtons.cpp \
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r62792 r63025  
    3223832238                        </File>
    3223932239                        <File
    32240                                 RelativePath="..\dom\CanvasSurface.cpp"
    32241                                 >
    32242                         </File>
    32243                         <File
    32244                                 RelativePath="..\dom\CanvasSurface.h"
    32245                                 >
    32246                         </File>
    32247                         <File
    3224832240                                RelativePath="..\dom\CDATASection.cpp"
    3224932241                                >
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r62876 r63025  
    206206                0B9056F80F2685F30095FF6A /* WorkerThreadableLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0B9056F60F2685F30095FF6A /* WorkerThreadableLoader.cpp */; };
    207207                0B9056F90F2685F30095FF6A /* WorkerThreadableLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B9056F70F2685F30095FF6A /* WorkerThreadableLoader.h */; settings = {ATTRIBUTES = (); }; };
    208                 0BC2C7771134A8FC000B2F61 /* CanvasSurface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BC2C7751134A8FC000B2F61 /* CanvasSurface.cpp */; };
    209                 0BC2C7781134A8FC000B2F61 /* CanvasSurface.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BC2C7761134A8FC000B2F61 /* CanvasSurface.h */; };
    210208                0BE030A20F3112FB003C1A46 /* RenderLineBoxList.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BE030A10F3112FB003C1A46 /* RenderLineBoxList.h */; settings = {ATTRIBUTES = (Private, ); }; };
    211209                0C3F1F5A10C8871200D72CE1 /* WebGLUniformLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */; };
     
    58115809                0B9056F60F2685F30095FF6A /* WorkerThreadableLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerThreadableLoader.cpp; sourceTree = "<group>"; };
    58125810                0B9056F70F2685F30095FF6A /* WorkerThreadableLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerThreadableLoader.h; sourceTree = "<group>"; };
    5813                 0BC2C7751134A8FC000B2F61 /* CanvasSurface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CanvasSurface.cpp; sourceTree = "<group>"; };
    5814                 0BC2C7761134A8FC000B2F61 /* CanvasSurface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanvasSurface.h; sourceTree = "<group>"; };
    58155811                0BE030A10F3112FB003C1A46 /* RenderLineBoxList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderLineBoxList.h; sourceTree = "<group>"; };
    58165812                0C3F1F5710C8871200D72CE1 /* WebGLUniformLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebGLUniformLocation.cpp; path = canvas/WebGLUniformLocation.cpp; sourceTree = "<group>"; };
     
    1679516791                                85031B260A44EFC700F992E0 /* BeforeUnloadEvent.cpp */,
    1679616792                                85031B270A44EFC700F992E0 /* BeforeUnloadEvent.h */,
    16797                                 0BC2C7751134A8FC000B2F61 /* CanvasSurface.cpp */,
    16798                                 0BC2C7761134A8FC000B2F61 /* CanvasSurface.h */,
    1679916793                                6550B693099DF0270090D781 /* CDATASection.cpp */,
    1680016794                                6550B694099DF0270090D781 /* CDATASection.h */,
     
    1720417198                                49484FCB102CF23C00187DD3 /* CanvasRenderingContext2D.h in Headers */,
    1720517199                                49484FCE102CF23C00187DD3 /* CanvasStyle.h in Headers */,
    17206                                 0BC2C7781134A8FC000B2F61 /* CanvasSurface.h in Headers */,
    1720717200                                6550B69E099DF0270090D781 /* CDATASection.h in Headers */,
    1720817201                                514185EE0CD65F0400763C99 /* ChangeVersionWrapper.h in Headers */,
     
    2012320116                                49484FCA102CF23C00187DD3 /* CanvasRenderingContext2D.cpp in Sources */,
    2012420117                                49484FCD102CF23C00187DD3 /* CanvasStyle.cpp in Sources */,
    20125                                 0BC2C7771134A8FC000B2F61 /* CanvasSurface.cpp in Sources */,
    2012620118                                6550B69D099DF0270090D781 /* CDATASection.cpp in Sources */,
    2012720119                                514185EF0CD65F0400763C99 /* ChangeVersionWrapper.cpp in Sources */,
  • trunk/WebCore/html/HTMLCanvasElement.cpp

    r62299 r63025  
    4141#include "HTMLNames.h"
    4242#include "ImageBuffer.h"
     43#include "MIMETypeRegistry.h"
    4344#include "Page.h"
    4445#include "RenderHTMLCanvas.h"
     
    5657using namespace HTMLNames;
    5758
     59// These values come from the WhatWG spec.
     60static const int DefaultWidth = 300;
     61static const int DefaultHeight = 150;
     62
     63// Firefox limits width/height to 32767 pixels, but slows down dramatically before it
     64// reaches that limit. We limit by area instead, giving us larger maximum dimensions,
     65// in exchange for a smaller maximum canvas size.
     66static const float MaxCanvasArea = 32768 * 8192; // Maximum canvas area in CSS pixels
     67
    5868HTMLCanvasElement::HTMLCanvasElement(const QualifiedName& tagName, Document* document)
    5969    : HTMLElement(tagName, document)
    60     , CanvasSurface(document->frame() ? document->frame()->page()->chrome()->scaleFactor() : 1)
    6170    , m_observer(0)
     71    , m_size(DefaultWidth, DefaultHeight)
    6272    , m_ignoreReset(false)
     73    , m_pageScaleFactor(document->frame() ? document->frame()->page()->chrome()->scaleFactor() : 1)
     74    , m_originClean(true)
     75    , m_hasCreatedImageBuffer(false)
    6376{
    6477    ASSERT(hasTagName(canvasTag));
     
    187200void HTMLCanvasElement::willDraw(const FloatRect& rect)
    188201{
    189     CanvasSurface::willDraw(rect);
     202    if (m_imageBuffer)
     203        m_imageBuffer->clearImage();
    190204
    191205    if (RenderBox* ro = renderBox()) {
     
    291305}
    292306
    293 }
     307void HTMLCanvasElement::setSurfaceSize(const IntSize& size)
     308{
     309    m_size = size;
     310    m_hasCreatedImageBuffer = false;
     311    m_imageBuffer.clear();
     312}
     313
     314String HTMLCanvasElement::toDataURL(const String& mimeType, const double* quality, ExceptionCode& ec)
     315{
     316    if (!m_originClean) {
     317        ec = SECURITY_ERR;
     318        return String();
     319    }
     320
     321    if (m_size.isEmpty() || !buffer())
     322        return String("data:,");
     323
     324    String lowercaseMimeType = mimeType.lower();
     325
     326    // FIXME: Make isSupportedImageMIMETypeForEncoding threadsafe (to allow this method to be used on a worker thread).
     327    if (mimeType.isNull() || !MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(lowercaseMimeType))
     328        return buffer()->toDataURL("image/png");
     329
     330    return buffer()->toDataURL(lowercaseMimeType, quality);
     331}
     332
     333IntRect HTMLCanvasElement::convertLogicalToDevice(const FloatRect& logicalRect) const
     334{
     335    return IntRect(convertLogicalToDevice(logicalRect.location()), convertLogicalToDevice(logicalRect.size()));
     336}
     337
     338IntSize HTMLCanvasElement::convertLogicalToDevice(const FloatSize& logicalSize) const
     339{
     340    float wf = ceilf(logicalSize.width() * m_pageScaleFactor);
     341    float hf = ceilf(logicalSize.height() * m_pageScaleFactor);
     342
     343    if (!(wf >= 1 && hf >= 1 && wf * hf <= MaxCanvasArea))
     344        return IntSize();
     345
     346    return IntSize(static_cast<unsigned>(wf), static_cast<unsigned>(hf));
     347}
     348
     349IntPoint HTMLCanvasElement::convertLogicalToDevice(const FloatPoint& logicalPos) const
     350{
     351    float xf = logicalPos.x() * m_pageScaleFactor;
     352    float yf = logicalPos.y() * m_pageScaleFactor;
     353
     354    return IntPoint(static_cast<unsigned>(xf), static_cast<unsigned>(yf));
     355}
     356
     357const SecurityOrigin& HTMLCanvasElement::securityOrigin() const
     358{
     359    return *document()->securityOrigin();
     360}
     361
     362CSSStyleSelector* HTMLCanvasElement::styleSelector()
     363{
     364    return document()->styleSelector();
     365}
     366
     367void HTMLCanvasElement::createImageBuffer() const
     368{
     369    ASSERT(!m_imageBuffer);
     370
     371    m_hasCreatedImageBuffer = true;
     372
     373    FloatSize unscaledSize(width(), height());
     374    IntSize size = convertLogicalToDevice(unscaledSize);
     375    if (!size.width() || !size.height())
     376        return;
     377
     378    m_imageBuffer = ImageBuffer::create(size);
     379    // The convertLogicalToDevice MaxCanvasArea check should prevent common cases
     380    // where ImageBuffer::create() returns 0, however we could still be low on memory.
     381    if (!m_imageBuffer)
     382        return;
     383    m_imageBuffer->context()->scale(FloatSize(size.width() / unscaledSize.width(), size.height() / unscaledSize.height()));
     384    m_imageBuffer->context()->setShadowsIgnoreTransforms(true);
     385}
     386
     387GraphicsContext* HTMLCanvasElement::drawingContext() const
     388{
     389    return buffer() ? m_imageBuffer->context() : 0;
     390}
     391
     392ImageBuffer* HTMLCanvasElement::buffer() const
     393{
     394    if (!m_hasCreatedImageBuffer)
     395        createImageBuffer();
     396    return m_imageBuffer.get();
     397}
     398
     399AffineTransform HTMLCanvasElement::baseTransform() const
     400{
     401    ASSERT(m_hasCreatedImageBuffer);
     402    FloatSize unscaledSize(width(), height());
     403    IntSize size = convertLogicalToDevice(unscaledSize);
     404    AffineTransform transform;
     405    if (size.width() && size.height())
     406        transform.scaleNonUniform(size.width() / unscaledSize.width(), size.height() / unscaledSize.height());
     407    transform.multiply(m_imageBuffer->baseTransform());
     408    return transform;
     409}
     410
     411}
  • trunk/WebCore/html/HTMLCanvasElement.h

    r62016 r63025  
    2929#define HTMLCanvasElement_h
    3030
    31 #include "CanvasSurface.h"
    3231#include "FloatRect.h"
    3332#include "HTMLElement.h"
     
    4443class GraphicsContext;
    4544class HTMLCanvasElement;
     45class ImageBuffer;
    4646class IntSize;
    4747
     
    5555};
    5656
    57 class HTMLCanvasElement : public HTMLElement, public CanvasSurface {
     57class HTMLCanvasElement : public HTMLElement {
    5858public:
    5959    static PassRefPtr<HTMLCanvasElement> create(Document*);
     
    6161    virtual ~HTMLCanvasElement();
    6262
     63    void setObserver(CanvasObserver* observer) { m_observer = observer; }
     64
     65    // Attributes and functions exposed to script
     66    int width() const { return size().width(); }
     67    int height() const { return size().height(); }
     68
     69    const IntSize& size() const { return m_size; }
     70
    6371    void setWidth(int);
    6472    void setHeight(int);
    65 
    66     CanvasRenderingContext* getContext(const String&, CanvasContextAttributes* attributes = 0);
    6773
    6874    void setSize(const IntSize& newSize)
     
    7783    }
    7884
    79     virtual void willDraw(const FloatRect&);
     85    CanvasRenderingContext* getContext(const String&, CanvasContextAttributes* attributes = 0);
     86
     87    String toDataURL(const String& mimeType, const double* quality, ExceptionCode&);
     88    String toDataURL(const String& mimeType, ExceptionCode& ec) { return toDataURL(mimeType, 0, ec); }
     89
     90    // Used for rendering
     91    void willDraw(const FloatRect&);
    8092
    8193    void paint(GraphicsContext*, const IntRect&);
    8294
    83     void setObserver(CanvasObserver* observer) { m_observer = observer; }
     95    GraphicsContext* drawingContext() const;
    8496
    8597    CanvasRenderingContext* renderingContext() const { return m_context.get(); }
    8698
    87     RenderBox* renderBox() const { return HTMLElement::renderBox(); }
    88     RenderStyle* computedStyle() { return HTMLElement::computedStyle(); }
     99    ImageBuffer* buffer() const;
     100
     101    IntRect convertLogicalToDevice(const FloatRect&) const;
     102    IntSize convertLogicalToDevice(const FloatSize&) const;
     103    IntPoint convertLogicalToDevice(const FloatPoint&) const;
     104
     105    const SecurityOrigin& securityOrigin() const;
     106    void setOriginTainted() { m_originClean = false; }
     107    bool originClean() const { return m_originClean; }
     108
     109    CSSStyleSelector* styleSelector();
     110
     111    AffineTransform baseTransform() const;
    89112
    90113#if ENABLE(3D_CANVAS)   
     
    107130    void reset();
    108131
    109     bool m_rendererIsCanvas;
     132    void createImageBuffer() const;
     133
     134    void setSurfaceSize(const IntSize&);
     135    bool hasCreatedImageBuffer() const { return m_hasCreatedImageBuffer; }
     136
     137    CanvasObserver* m_observer;
     138
     139    IntSize m_size;
    110140
    111141    OwnPtr<CanvasRenderingContext> m_context;
    112     CanvasObserver* m_observer;
     142
     143    bool m_rendererIsCanvas;
    113144
    114145    bool m_ignoreReset;
    115146    FloatRect m_dirtyRect;
     147
     148    float m_pageScaleFactor;
     149    bool m_originClean;
     150
     151    // m_createdImageBuffer means we tried to malloc the buffer.  We didn't necessarily get it.
     152    mutable bool m_hasCreatedImageBuffer;
     153    mutable OwnPtr<ImageBuffer> m_imageBuffer;
    116154};
    117155
Note: See TracChangeset for help on using the changeset viewer.