Changeset 39079 in webkit


Ignore:
Timestamp:
Dec 6, 2008 11:48:53 PM (15 years ago)
Author:
krit@webkit.org
Message:

2008-12-06 Dirk Schulze <krit@webkit.org>

Reviewed by Oliver Hunt.

WebCore:

Add support for setTransform() in canvas.

<canvas> lacks transform() and setTransform()
https://bugs.webkit.org/show_bug.cgi?id=16604

Test: fast/canvas/canvas-setTransform.html

  • html/CanvasRenderingContext2D.cpp: (WebCore::CanvasRenderingContext2D::State::State): (WebCore::CanvasRenderingContext2D::setStrokeStyle): (WebCore::CanvasRenderingContext2D::setFillStyle): (WebCore::CanvasRenderingContext2D::scale): (WebCore::CanvasRenderingContext2D::rotate): (WebCore::CanvasRenderingContext2D::translate): (WebCore::CanvasRenderingContext2D::transform): (WebCore::CanvasRenderingContext2D::setTransform): (WebCore::CanvasRenderingContext2D::beginPath): (WebCore::CanvasRenderingContext2D::closePath): (WebCore::CanvasRenderingContext2D::moveTo): (WebCore::CanvasRenderingContext2D::lineTo): (WebCore::CanvasRenderingContext2D::quadraticCurveTo): (WebCore::CanvasRenderingContext2D::bezierCurveTo): (WebCore::CanvasRenderingContext2D::arcTo): (WebCore::CanvasRenderingContext2D::arc): (WebCore::CanvasRenderingContext2D::rect): (WebCore::CanvasRenderingContext2D::fill): (WebCore::CanvasRenderingContext2D::stroke): (WebCore::CanvasRenderingContext2D::clip): (WebCore::CanvasRenderingContext2D::isPointInPath): (WebCore::CanvasRenderingContext2D::clearRect): (WebCore::CanvasRenderingContext2D::fillRect): (WebCore::CanvasRenderingContext2D::strokeRect): (WebCore::CanvasRenderingContext2D::drawImage): (WebCore::CanvasRenderingContext2D::drawImageFromRect): (WebCore::CanvasRenderingContext2D::willDraw): (WebCore::CanvasRenderingContext2D::drawTextInternal):
  • html/CanvasRenderingContext2D.h:
  • html/CanvasRenderingContext2D.idl:
  • html/HTMLCanvasElement.cpp: (WebCore::HTMLCanvasElement::baseTransform):
  • html/HTMLCanvasElement.h:
  • platform/graphics/ImageBuffer.h: (WebCore::ImageBuffer::baseTransform):

LayoutTests:

Added tests for canvas's setTransform() and updated an existing one.

  • fast/canvas/canvas-setTransform-expected.txt: Added.
  • fast/canvas/canvas-setTransform.html: Added.
  • fast/canvas/resources/canvas-setTransform.js: Added.
  • fast/dom/Window/window-properties-expected.txt:
Location:
trunk
Files:
3 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r39078 r39079  
     12008-12-06  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Oliver Hunt.
     4
     5        Added tests for canvas's setTransform() and updated an existing one.
     6
     7        * fast/canvas/canvas-setTransform-expected.txt: Added.
     8        * fast/canvas/canvas-setTransform.html: Added.
     9        * fast/canvas/resources/canvas-setTransform.js: Added.
     10        * fast/dom/Window/window-properties-expected.txt:
     11
    1122008-12-06  Antti Koivisto  <antti@apple.com>
    213
  • trunk/LayoutTests/fast/dom/Window/window-properties-expected.txt

    r38583 r39079  
    316316window.CanvasRenderingContext2D.prototype.setShadow [function]
    317317window.CanvasRenderingContext2D.prototype.setStrokeColor [function]
     318window.CanvasRenderingContext2D.prototype.setTransform [function]
    318319window.CanvasRenderingContext2D.prototype.stroke [function]
    319320window.CanvasRenderingContext2D.prototype.strokeRect [function]
  • trunk/WebCore/ChangeLog

    r39078 r39079  
     12008-12-06  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Oliver Hunt.
     4
     5        Add support for setTransform() in canvas.
     6
     7        <canvas> lacks transform() and setTransform()
     8        https://bugs.webkit.org/show_bug.cgi?id=16604
     9
     10        Test: fast/canvas/canvas-setTransform.html
     11
     12        * html/CanvasRenderingContext2D.cpp:
     13        (WebCore::CanvasRenderingContext2D::State::State):
     14        (WebCore::CanvasRenderingContext2D::setStrokeStyle):
     15        (WebCore::CanvasRenderingContext2D::setFillStyle):
     16        (WebCore::CanvasRenderingContext2D::scale):
     17        (WebCore::CanvasRenderingContext2D::rotate):
     18        (WebCore::CanvasRenderingContext2D::translate):
     19        (WebCore::CanvasRenderingContext2D::transform):
     20        (WebCore::CanvasRenderingContext2D::setTransform):
     21        (WebCore::CanvasRenderingContext2D::beginPath):
     22        (WebCore::CanvasRenderingContext2D::closePath):
     23        (WebCore::CanvasRenderingContext2D::moveTo):
     24        (WebCore::CanvasRenderingContext2D::lineTo):
     25        (WebCore::CanvasRenderingContext2D::quadraticCurveTo):
     26        (WebCore::CanvasRenderingContext2D::bezierCurveTo):
     27        (WebCore::CanvasRenderingContext2D::arcTo):
     28        (WebCore::CanvasRenderingContext2D::arc):
     29        (WebCore::CanvasRenderingContext2D::rect):
     30        (WebCore::CanvasRenderingContext2D::fill):
     31        (WebCore::CanvasRenderingContext2D::stroke):
     32        (WebCore::CanvasRenderingContext2D::clip):
     33        (WebCore::CanvasRenderingContext2D::isPointInPath):
     34        (WebCore::CanvasRenderingContext2D::clearRect):
     35        (WebCore::CanvasRenderingContext2D::fillRect):
     36        (WebCore::CanvasRenderingContext2D::strokeRect):
     37        (WebCore::CanvasRenderingContext2D::drawImage):
     38        (WebCore::CanvasRenderingContext2D::drawImageFromRect):
     39        (WebCore::CanvasRenderingContext2D::willDraw):
     40        (WebCore::CanvasRenderingContext2D::drawTextInternal):
     41        * html/CanvasRenderingContext2D.h:
     42        * html/CanvasRenderingContext2D.idl:
     43        * html/HTMLCanvasElement.cpp:
     44        (WebCore::HTMLCanvasElement::baseTransform):
     45        * html/HTMLCanvasElement.h:
     46        * platform/graphics/ImageBuffer.h:
     47        (WebCore::ImageBuffer::baseTransform):
     48
    1492008-12-06  Antti Koivisto  <antti@apple.com>
    250
  • trunk/WebCore/html/CanvasRenderingContext2D.cpp

    r39000 r39079  
    44 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
    55 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
     6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org>
    67 *
    78 * Redistribution and use in source and binary forms, with or without
     
    100101    , m_globalAlpha(1)
    101102    , m_globalComposite(CompositeSourceOver)
     103    , m_invertibleCTM(true)
    102104    , m_textAlign(StartTextAlign)
    103105    , m_textBaseline(AlphabeticTextBaseline)
     
    151153    GraphicsContext* c = drawingContext();
    152154    if (!c)
     155        return;
     156    if (!state().m_invertibleCTM)
    153157        return;
    154158    state().m_strokeStyle->applyStrokeColor(c);
     
    176180    if (!c)
    177181        return;
     182    if (!state().m_invertibleCTM)
     183        return;
    178184    state().m_fillStyle->applyFillColor(c);
    179185}
     
    328334    if (!c)
    329335        return;
     336    if (!state().m_invertibleCTM)
     337        return;
     338
     339    AffineTransform newTransform = state().m_transform;
     340    newTransform.scale(sx, sy);
     341    if (!newTransform.isInvertible()) {
     342        state().m_invertibleCTM = false;
     343        return;
     344    }
     345
     346    state().m_transform = newTransform;
    330347    c->scale(FloatSize(sx, sy));
    331     state().m_transform.scale(sx, sy);
    332348    m_path.transform(AffineTransform().scale(1.0/sx, 1.0/sy));
    333349}
     
    338354    if (!c)
    339355        return;
     356    if (!state().m_invertibleCTM)
     357        return;
     358
     359    AffineTransform newTransform = state().m_transform;
     360    newTransform.rotate(angleInRadians / piDouble * 180.0);
     361    if (!newTransform.isInvertible()) {
     362        state().m_invertibleCTM = false;
     363        return;
     364    }
     365
     366    state().m_transform = newTransform;
    340367    c->rotate(angleInRadians);
    341     state().m_transform.rotate(angleInRadians / piDouble * 180.0);
    342368    m_path.transform(AffineTransform().rotate(-angleInRadians / piDouble * 180.0));
    343369}
     
    348374    if (!c)
    349375        return;
     376    if (!state().m_invertibleCTM)
     377        return;
     378
     379    AffineTransform newTransform = state().m_transform;
     380    newTransform.translate(tx, ty);
     381    if (!newTransform.isInvertible()) {
     382        state().m_invertibleCTM = false;
     383        return;
     384    }
     385
     386    state().m_transform = newTransform;
    350387    c->translate(tx, ty);
    351     state().m_transform.translate(tx, ty);
    352388    m_path.transform(AffineTransform().translate(-tx, -ty));
    353389}
     
    357393    GraphicsContext* c = drawingContext();
    358394    if (!c)
     395        return;
     396    if (!state().m_invertibleCTM)
    359397        return;
    360398   
     
    363401        !isfinite(m12) | !isfinite(m22) | !isfinite(dy))
    364402        return;
     403
    365404    AffineTransform transform(m11, m12, m21, m22, dx, dy);
     405
     406    AffineTransform newTransform = state().m_transform;
     407    newTransform.multiply(transform);
     408    if (!newTransform.isInvertible()) {
     409        state().m_invertibleCTM = false;
     410        return;
     411    }
     412
     413    state().m_transform = newTransform;
    366414    c->concatCTM(transform);
    367     state().m_transform.multiply(transform);
    368415    m_path.transform(transform.inverse());
    369416}
    370417
     418void CanvasRenderingContext2D::setTransform(float m11, float m12, float m21, float m22, float dx, float dy)
     419{
     420    GraphicsContext* c = drawingContext();
     421    if (!c)
     422        return;
     423    if (!state().m_invertibleCTM)
     424        return;
     425   
     426    // HTML5 3.14.11.1 -- ignore any calls that pass non-finite numbers
     427    if (!isfinite(m11) | !isfinite(m21) | !isfinite(dx) |
     428        !isfinite(m12) | !isfinite(m22) | !isfinite(dy))
     429        return;
     430
     431    AffineTransform ctm = state().m_transform;
     432    if (!ctm.isInvertible())
     433        return;
     434    c->concatCTM(c->getCTM().inverse());
     435    c->concatCTM(m_canvas->baseTransform());
     436    state().m_transform.multiply(ctm.inverse());
     437    m_path.transform(ctm);
     438
     439    transform(m11, m12, m21, m22, dx, dy);
     440}
     441
    371442void CanvasRenderingContext2D::setStrokeColor(const String& color)
    372443{
     
    431502void CanvasRenderingContext2D::beginPath()
    432503{
     504    if (!state().m_invertibleCTM)
     505        return;
    433506    m_path.clear();
    434507}
     
    436509void CanvasRenderingContext2D::closePath()
    437510{
     511    if (!state().m_invertibleCTM)
     512        return;
    438513    m_path.closeSubpath();
    439514}
     
    443518    if (!isfinite(x) | !isfinite(y))
    444519        return;
     520    if (!state().m_invertibleCTM)
     521        return;
    445522    m_path.moveTo(FloatPoint(x, y));
    446523}
     
    450527    if (!isfinite(x) | !isfinite(y))
    451528        return;
     529    if (!state().m_invertibleCTM)
     530        return;
    452531    m_path.addLineTo(FloatPoint(x, y));
    453532}
     
    457536    if (!isfinite(cpx) | !isfinite(cpy) | !isfinite(x) | !isfinite(y))
    458537        return;
     538    if (!state().m_invertibleCTM)
     539        return;
    459540    m_path.addQuadCurveTo(FloatPoint(cpx, cpy), FloatPoint(x, y));
    460541}
     
    463544{
    464545    if (!isfinite(cp1x) | !isfinite(cp1y) | !isfinite(cp2x) | !isfinite(cp2y) | !isfinite(x) | !isfinite(y))
     546        return;
     547    if (!state().m_invertibleCTM)
    465548        return;
    466549    m_path.addBezierCurveTo(FloatPoint(cp1x, cp1y), FloatPoint(cp2x, cp2y), FloatPoint(x, y));
     
    477560        return;
    478561    }
    479    
     562    if (!state().m_invertibleCTM)
     563        return;
    480564    m_path.addArcTo(FloatPoint(x0, y0), FloatPoint(x1, y1), r);
    481565}
     
    491575        return;
    492576    }
    493    
     577    if (!state().m_invertibleCTM)
     578        return;
    494579    m_path.addArc(FloatPoint(x, y), r, sa, ea, anticlockwise);
    495580}
     
    517602    if (!validateRectForCanvas(x, y, width, height))
    518603        return;
    519        
     604    if (!state().m_invertibleCTM)
     605        return;
    520606    m_path.addRect(FloatRect(x, y, width, height));
    521607}
     
    534620    GraphicsContext* c = drawingContext();
    535621    if (!c)
     622        return;
     623    if (!state().m_invertibleCTM)
    536624        return;
    537625
     
    552640    GraphicsContext* c = drawingContext();
    553641    if (!c)
     642        return;
     643    if (!state().m_invertibleCTM)
    554644        return;
    555645    c->beginPath();
     
    577667    if (!c)
    578668        return;
     669    if (!state().m_invertibleCTM)
     670        return;
    579671    c->clip(m_path);
    580672#if ENABLE(DASHBOARD_SUPPORT)
     
    588680    if (!c)
    589681        return false;
     682    if (!state().m_invertibleCTM)
     683        return false;
     684
    590685    FloatPoint point(x, y);
    591     // We have to invert the current transform to ensure we correctly handle the
    592     // transforms applied to the current path.
    593686    AffineTransform ctm = state().m_transform;
    594     if (!ctm.isInvertible())
    595         return false;
    596687    FloatPoint transformedPoint = ctm.inverse().mapPoint(point);
    597688    return m_path.contains(transformedPoint);
     
    604695    GraphicsContext* c = drawingContext();
    605696    if (!c)
     697        return;
     698    if (!state().m_invertibleCTM)
    606699        return;
    607700    FloatRect rect(x, y, width, height);
     
    618711    if (!c)
    619712        return;
     713    if (!state().m_invertibleCTM)
     714        return;
    620715
    621716    FloatRect rect(x, y, width, height);
     
    644739    GraphicsContext* c = drawingContext();
    645740    if (!c)
     741        return;
     742    if (!state().m_invertibleCTM)
    646743        return;
    647744
     
    888985    if (!c)
    889986        return;
     987    if (!state().m_invertibleCTM)
     988        return;
    890989
    891990    CachedImage* cachedImage = image->cachedImage();
     
    9371036    GraphicsContext* c = drawingContext();
    9381037    if (!c)
     1038        return;
     1039    if (!state().m_invertibleCTM)
    9391040        return;
    9401041       
     
    9771078    if (!c)
    9781079        return;
     1080    if (!state().m_invertibleCTM)
     1081        return;
    9791082
    9801083    CompositeOperator op;
     
    10611164    GraphicsContext* c = drawingContext();
    10621165    if (!c)
     1166        return;
     1167    if (!state().m_invertibleCTM)
    10631168        return;
    10641169
     
    12571362    GraphicsContext* c = drawingContext();
    12581363    if (!c)
     1364        return;
     1365    if (!state().m_invertibleCTM)
    12591366        return;
    12601367   
  • trunk/WebCore/html/CanvasRenderingContext2D.h

    r37538 r39079  
    106106        void translate(float tx, float ty);
    107107        void transform(float m11, float m12, float m21, float m22, float dx, float dy);
     108        void setTransform(float m11, float m12, float m21, float m22, float dx, float dy);
    108109
    109110        void setStrokeColor(const String& color);
     
    210211            CompositeOperator m_globalComposite;
    211212            AffineTransform m_transform;
     213            bool m_invertibleCTM;
    212214           
    213215            // Text state.
  • trunk/WebCore/html/CanvasRenderingContext2D.idl

    r37538 r39079  
    4343        void translate(in float tx, in float ty);
    4444        void transform(in float m11, in float m12, in float m21, in float m22, in float dx, in float dy);
     45        void setTransform(in float m11, in float m12, in float m21, in float m22, in float dx, in float dy);
    4546
    4647        attribute float globalAlpha;
  • trunk/WebCore/html/HTMLCanvasElement.cpp

    r39007 r39079  
    268268    return m_imageBuffer.get();
    269269}
    270 
    271 }
     270   
     271AffineTransform HTMLCanvasElement::baseTransform() const
     272{
     273    ASSERT(m_createdImageBuffer);
     274    return m_imageBuffer->baseTransform();
     275}
     276
     277}
  • trunk/WebCore/html/HTMLCanvasElement.h

    r39007 r39079  
    2828#define HTMLCanvasElement_h
    2929
     30#include "AffineTransform.h"
    3031#include "HTMLElement.h"
    3132#include "IntSize.h"
     
    106107    void setObserver(CanvasObserver* o) { m_observer = o; }
    107108
     109    AffineTransform baseTransform() const;
    108110private:
    109111    void createImageBuffer() const;
  • trunk/WebCore/platform/graphics/ImageBuffer.h

    r37953 r39079  
    2828#define ImageBuffer_h
    2929
     30#include "AffineTransform.h"
    3031#include "Image.h"
    3132#include "IntSize.h"
     
    6869
    6970        String toDataURL(const String& mimeType) const;
    70 
     71#if !PLATFORM(CG)
     72        AffineTransform baseTransform() const { return AffineTransform(); }
     73#else
     74        AffineTransform baseTransform() const { return AffineTransform(1, 0, 0, -1, 0, m_size.height()); }
     75#endif
    7176    private:
    7277        ImageBufferData m_data;
Note: See TracChangeset for help on using the changeset viewer.