Changeset 90646 in webkit


Ignore:
Timestamp:
Jul 8, 2011 11:33:00 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

Patch by David Reveman <reveman@chromium.org> on 2011-07-08
Reviewed by Stephen White.

[Chromium] Edge anti-aliasing for composited layers.
https://bugs.webkit.org/show_bug.cgi?id=61388

Source/WebCore:

Add transparent outer border to tiled layers and adjust vertex
coordinates so that use of a bilinear filter creates a smooth
layer edge.

Tests: platform/chromium/compositing/tiny-layer-rotated.html

platform/chromium/compositing/huge-layer-rotated.html (existing)
TilingDataTest in webkit_unit_tests

  • platform/graphics/chromium/ContentLayerChromium.cpp:

Change maxUntiledSize to 510 to ensure that tiles are not greater
than 512 with outer borders.
(WebCore::ContentLayerChromium::updateLayerSize): We can't use the
layer size as tile size when we want to avoid tiling as this will
not be enough space to include possible outer borders. We instead use
an empty size, which allows the tiler to automatically adjust the
tile size to be large enough for the layer to fit in one tile.
(WebCore::ContentLayerChromium::createTilerIfNeeded):
(WebCore::ContentLayerChromium::setIsMask): Don't use border texels
for layer used as mask.

  • platform/graphics/chromium/ContentLayerChromium.h:

(WebCore::ContentLayerChromium::m_borderTexels) Added.

  • platform/graphics/chromium/LayerTilerChromium.cpp:

(WebCore::LayerTilerChromium::tileTexRect): Added.
(WebCore::LayerTilerChromium::tileLayerRect): m_tileSize is no
longer the correct layer size. Size of bounds with border should
be the correct layer size.
(WebCore::LayerTilerChromium::growLayerToContain): Adjust texture
size to include outer borders and handle empty m_tileSize.
(WebCore::LayerTilerChromium::invalidateRect): Use size of rectangle
returned by tileTexRect instead of m_tileSize for texture size.
(WebCore::LayerTilerChromium::prepareToUpdate): Ditto.
(WebCore::LayerTilerChromium::draw): Compute and intersect tile edges
instead of using tile coordinates directly. Edges are adjusted to
include outer borders and make sure all partially covered pixels are
processed.
(WebCore::LayerTilerChromium::drawTexturedQuad): Pass quad to
shader using point uniform.
(WebCore::LayerTilerChromium::invalidateRect): Invalidate old layer
area to clear any contents left from previous layer size.

  • platform/graphics/chromium/LayerTilerChromium.h:

(WebCore::LayerTilerChromium::tileTexRect) Added.
(WebCore::LayerTilerChromium::drawTexturedQuad): Add quad parameter.

  • platform/graphics/chromium/ShaderChromium.cpp:

(WebCore::VertexShaderPosTexTransform::getShaderString) Get X/Y vertex
components from point uniform.
(WebCore::VertexShaderPosTexTransform::VertexShaderPosTexTransform)
Added point uniform.
(WebCore::VertexShaderPosTexTransform::init) Ditto.
(WebCore::VertexShaderPosTexTransform::pointLocation) Added.

  • platform/graphics/chromium/ShaderChromium.h:

(WebCore::VertexShaderPosTexTransform::pointLocation) Added.

  • platform/graphics/gpu/TilingData.cpp:

(WebCore::TilingData::tileBoundsWithOuterBorder): Added.
(WebCore::TilingData::computeNumTiles): Adjust for outer border.
(WebCore::TilingData::tileXIndexFromSrcCoord): Ditto.
(WebCore::TilingData::tileYIndexFromSrcCoord): Ditto.
(WebCore::TilingData::tileSizeX): Ditto.
(WebCore::TilingData::tileSizeY): Ditto.
(WebCore::TilingData::intersectDrawQuad): Ditto.
(WebCore::TilingData::textureOffset): Ditto.

  • platform/graphics/gpu/TilingData.h:

(WebCore::TilingData::tileBoundsWithOuterBorder): Added.

Source/WebKit:

Track changes to TilingData class which now uses an outer border.

  • chromium/tests/TilingDataTest.cpp:

LayoutTests:

  • platform/chromium/compositing/tiny-layer-rotated-expected.png: Added.
  • platform/chromium/compositing/tiny-layer-rotated-expected.txt: Added.
  • platform/chromium/compositing/tiny-layer-rotated.html: Added.
  • platform/chromium/test_expectations.txt:
Location:
trunk
Files:
3 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r90642 r90646  
     12011-07-08  David Reveman  <reveman@chromium.org>
     2
     3        Reviewed by Stephen White.
     4
     5        [Chromium] Edge anti-aliasing for composited layers.
     6        https://bugs.webkit.org/show_bug.cgi?id=61388
     7
     8        * platform/chromium/compositing/tiny-layer-rotated-expected.png: Added.
     9        * platform/chromium/compositing/tiny-layer-rotated-expected.txt: Added.
     10        * platform/chromium/compositing/tiny-layer-rotated.html: Added.
     11        * platform/chromium/test_expectations.txt:
     12
    1132011-07-08  Mihnea Ovidenie  <mihnea@adobe.com>
    214
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r90609 r90646  
    29672967
    29682968// Chromium GPU draws scrollbars slightly differently in debug vs. release.
    2969 BUGWK58587 DEBUG GPU LINUX : compositing/direct-image-compositing.html = IMAGE
    2970 BUGWK58587 DEBUG GPU LINUX : compositing/geometry/horizontal-scroll-composited.html = IMAGE
    2971 BUGWK58587 DEBUG GPU LINUX : compositing/geometry/tall-page-composited.html = IMAGE
    2972 BUGWK58587 DEBUG GPU LINUX : compositing/geometry/video-fixed-scrolling.html = IMAGE
    2973 BUGWK58587 DEBUG GPU LINUX : media/video-zoom.html = IMAGE
     2969// Commented because of BUGWK61388
     2970//BUGWK58587 DEBUG GPU LINUX : compositing/direct-image-compositing.html = IMAGE
     2971//BUGWK58587 DEBUG GPU LINUX : compositing/geometry/horizontal-scroll-composited.html = IMAGE
     2972//BUGWK58587 DEBUG GPU LINUX : compositing/geometry/tall-page-composited.html = IMAGE
     2973//BUGWK58587 DEBUG GPU LINUX : compositing/geometry/video-fixed-scrolling.html = IMAGE
     2974//BUGWK58587 DEBUG GPU LINUX : media/video-zoom.html = IMAGE
    29742975
    29752976// WebKit roll 80564:80631: rendering on Leopard is shifted to the top right
     
    32953296
    32963297BUGWK58308 GPU WIN LINUX DEBUG : compositing/z-order/negative-z-index.html = PASS CRASH
    3297 BUGWK58328 GPU WIN MAC LINUX DEBUG : compositing/webgl/webgl-reflection.html = IMAGE PASS CRASH
     3298// Commented because of BUGWK61388
     3299//BUGWK58328 GPU WIN MAC LINUX DEBUG : compositing/webgl/webgl-reflection.html = IMAGE PASS CRASH
    32983300
    32993301BUGCR79173 GPU LINUX DEBUG : fast/canvas/access-zero-sized-canvas.html = PASS CRASH
     
    34533455BUGWK60097 DEBUG : fast/dom/HTMLLinkElement/link-and-subresource-test.html = TEXT PASS
    34543456
    3455 BUGWK60102 LINUX DEBUG GPU : compositing/geometry/fixed-in-composited.html = IMAGE
     3457// Commented because of BUGWK61388
     3458//BUGWK60102 LINUX DEBUG GPU : compositing/geometry/fixed-in-composited.html = IMAGE
    34563459BUGWK60102 LINUX GPU : compositing/masks/masked-ancestor.html = IMAGE
    3457 BUGWK60102 LINUX DEBUG GPU : compositing/masks/simple-composited-mask.html = IMAGE
     3460// Commented because of BUGWK61388
     3461//BUGWK60102 LINUX DEBUG GPU : compositing/masks/simple-composited-mask.html = IMAGE
    34583462
    34593463// Looks like some uninitialized memory at the bottom.
     
    39163920
    39173921// Started failing at WebKit r90259-90261.
    3918 BUGCR88400 GPU : compositing/geometry/vertical-scroll-composited.html = IMAGE
     3922// Commented because of BUGWK61388
     3923//BUGCR88400 GPU : compositing/geometry/vertical-scroll-composited.html = IMAGE
    39193924BUGCR88400 GPU : compositing/overflow/overflow-scroll.html = IMAGE
    39203925
     
    39543959BUGCR88577 WIN LINUX GPU : canvas/philip/tests/2d.pattern.repeat.null.html = TEXT
    39553960BUGCR88577 WIN LINUX GPU : fast/canvas/canvas-pattern-behaviour.html = TEXT
     3961
     3962BUGWK61388 GPU : compositing/color-matching/image-color-matching.html = IMAGE
     3963BUGWK61388 GPU : compositing/direct-image-compositing.html = IMAGE
     3964BUGWK61388 GPU : compositing/geometry/fixed-in-composited.html = IMAGE
     3965BUGWK61388 GPU : compositing/geometry/fixed-position.html = IMAGE
     3966BUGWK61388 GPU : compositing/geometry/horizontal-scroll-composited.html = IMAGE
     3967BUGWK61388 GPU : compositing/geometry/layer-due-to-layer-children-deep.html = IMAGE
     3968BUGWK61388 GPU : compositing/geometry/layer-due-to-layer-children.html = IMAGE
     3969BUGWK61388 GPU : compositing/geometry/tall-page-composited.html = IMAGE
     3970BUGWK61388 GPU : compositing/geometry/video-fixed-scrolling.html = IMAGE
     3971BUGWK61388 GPU : compositing/geometry/vertical-scroll-composited.html = IMAGE
     3972BUGWK61388 GPU : compositing/geometry/video-opacity-overlay.html = IMAGE
     3973BUGWK61388 GPU : compositing/iframes/nested-iframe-scrolling.html = IMAGE
     3974BUGWK61388 GPU : compositing/masks/direct-image-mask.html = IMAGE
     3975BUGWK61388 GPU : compositing/masks/simple-composited-mask.html = IMAGE
     3976BUGWK61388 GPU : compositing/overflow/fixed-position-ancestor-clip.html = IMAGE
     3977BUGWK61388 GPU : compositing/reflections/deeply-nested-reflections.html = IMAGE
     3978BUGWK61388 GPU : compositing/reflections/nested-reflection-on-overflow.html = IMAGE
     3979BUGWK61388 GPU : compositing/reflections/nested-reflection-transformed.html = IMAGE
     3980BUGWK61388 GPU : compositing/reflections/nested-reflection-transformed2.html = IMAGE
     3981BUGWK61388 GPU : compositing/reflections/nested-reflection-transition.html = IMAGE
     3982BUGWK61388 GPU : compositing/reflections/reflection-in-composited.html = IMAGE
     3983BUGWK61388 GPU : compositing/reflections/reflection-on-composited.html = IMAGE
     3984BUGWK61388 GPU : compositing/reflections/reflection-ordering.html = IMAGE
     3985BUGWK61388 GPU : compositing/reflections/reflection-positioning.html = IMAGE
     3986BUGWK61388 GPU : compositing/reflections/reflection-positioning2.html = IMAGE
     3987BUGWK61388 GPU : compositing/reflections/simple-composited-reflections.html = IMAGE
     3988BUGWK61388 GPU : compositing/reflections/transform-inside-reflection.html = IMAGE
     3989BUGWK61388 GPU : compositing/rtl/rtl-iframe-absolute-overflow.html = IMAGE
     3990BUGWK61388 GPU : compositing/rtl/rtl-iframe-fixed-overflow.html = IMAGE
     3991BUGWK61388 GPU : compositing/shadows/shadow-drawing.html = IMAGE
     3992BUGWK61388 GPU : compositing/text-on-large-layer.html = IMAGE
     3993BUGWK61388 GPU : compositing/transitions/scale-transition-no-start.html = IMAGE
     3994BUGWK61388 GPU : compositing/webgl/webgl-reflection.html = IMAGE
     3995BUGWK61388 GPU : platform/chromium/compositing/huge-layer-rotated.html = IMAGE
     3996BUGWK61388 GPU : platform/chromium/compositing/backface-visibility-transformed.html = IMAGE
     3997BUGWK61388 GPU : media/video-zoom.html = IMAGE
     3998BUGWK61388 GPU : media/video-zoom-controls.html = IMAGE
     3999BUGWK61388 GPU : media/video-transformed.html = IMAGE
     4000BUGWK61388 GPU : media/video-layer-crash.html = IMAGE
  • trunk/Source/WebCore/ChangeLog

    r90645 r90646  
     12011-07-08  David Reveman  <reveman@chromium.org>
     2
     3        Reviewed by Stephen White.
     4
     5        [Chromium] Edge anti-aliasing for composited layers.
     6        https://bugs.webkit.org/show_bug.cgi?id=61388
     7
     8        Add transparent outer border to tiled layers and adjust vertex
     9        coordinates so that use of a bilinear filter creates a smooth
     10        layer edge.
     11
     12        Tests: platform/chromium/compositing/tiny-layer-rotated.html
     13               platform/chromium/compositing/huge-layer-rotated.html (existing)
     14               TilingDataTest in webkit_unit_tests
     15
     16        * platform/graphics/chromium/ContentLayerChromium.cpp:
     17        Change maxUntiledSize to 510 to ensure that tiles are not greater
     18        than 512 with outer borders.
     19        (WebCore::ContentLayerChromium::updateLayerSize): We can't use the
     20        layer size as tile size when we want to avoid tiling as this will
     21        not be enough space to include possible outer borders. We instead use
     22        an empty size, which allows the tiler to automatically adjust the
     23        tile size to be large enough for the layer to fit in one tile.
     24        (WebCore::ContentLayerChromium::createTilerIfNeeded):
     25        (WebCore::ContentLayerChromium::setIsMask): Don't use border texels
     26        for layer used as mask.
     27
     28        * platform/graphics/chromium/ContentLayerChromium.h:
     29        (WebCore::ContentLayerChromium::m_borderTexels) Added.
     30
     31        * platform/graphics/chromium/LayerTilerChromium.cpp:
     32        (WebCore::LayerTilerChromium::tileTexRect): Added.
     33        (WebCore::LayerTilerChromium::tileLayerRect): m_tileSize is no
     34        longer the correct layer size. Size of bounds with border should
     35        be the correct layer size.
     36        (WebCore::LayerTilerChromium::growLayerToContain): Adjust texture
     37        size to include outer borders and handle empty m_tileSize.
     38        (WebCore::LayerTilerChromium::invalidateRect): Use size of rectangle
     39        returned by tileTexRect instead of m_tileSize for texture size.
     40        (WebCore::LayerTilerChromium::prepareToUpdate): Ditto.
     41        (WebCore::LayerTilerChromium::draw): Compute and intersect tile edges
     42        instead of using tile coordinates directly. Edges are adjusted to
     43        include outer borders and make sure all partially covered pixels are
     44        processed.
     45        (WebCore::LayerTilerChromium::drawTexturedQuad): Pass quad to
     46        shader using point uniform.
     47        (WebCore::LayerTilerChromium::invalidateRect): Invalidate old layer
     48        area to clear any contents left from previous layer size.
     49
     50        * platform/graphics/chromium/LayerTilerChromium.h:
     51        (WebCore::LayerTilerChromium::tileTexRect) Added.
     52        (WebCore::LayerTilerChromium::drawTexturedQuad): Add quad parameter.
     53
     54        * platform/graphics/chromium/ShaderChromium.cpp:
     55        (WebCore::VertexShaderPosTexTransform::getShaderString) Get X/Y vertex
     56        components from point uniform.
     57        (WebCore::VertexShaderPosTexTransform::VertexShaderPosTexTransform)
     58        Added point uniform.
     59        (WebCore::VertexShaderPosTexTransform::init) Ditto.
     60        (WebCore::VertexShaderPosTexTransform::pointLocation) Added.
     61
     62        * platform/graphics/chromium/ShaderChromium.h:
     63        (WebCore::VertexShaderPosTexTransform::pointLocation) Added.
     64
     65        * platform/graphics/gpu/TilingData.cpp:
     66        (WebCore::TilingData::tileBoundsWithOuterBorder): Added.
     67        (WebCore::TilingData::computeNumTiles): Adjust for outer border.
     68        (WebCore::TilingData::tileXIndexFromSrcCoord): Ditto.
     69        (WebCore::TilingData::tileYIndexFromSrcCoord): Ditto.
     70        (WebCore::TilingData::tileSizeX): Ditto.
     71        (WebCore::TilingData::tileSizeY): Ditto.
     72        (WebCore::TilingData::intersectDrawQuad): Ditto.
     73        (WebCore::TilingData::textureOffset): Ditto.
     74
     75        * platform/graphics/gpu/TilingData.h:
     76        (WebCore::TilingData::tileBoundsWithOuterBorder): Added.
     77
    1782011-07-08  Mike Reed  <reed@google.com>
    279
  • trunk/Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp

    r90492 r90646  
    4848
    4949// Start tiling when the width and height of a layer are larger than this size.
    50 static int maxUntiledSize = 512;
     50static int maxUntiledSize = 510;
    5151
    5252// When tiling is enabled, use tiles of this dimension squared.
     
    9393    : LayerChromium(owner)
    9494    , m_tilingOption(ContentLayerChromium::AutoTile)
     95    , m_borderTexels(true)
    9596{
    9697}
     
    175176        return;
    176177
    177     const IntSize tileSize(min(defaultTileSize, contentBounds().width()), min(defaultTileSize, contentBounds().height()));
     178    const IntSize tileSize(defaultTileSize, defaultTileSize);
    178179
    179180    // Tile if both dimensions large, or any one dimension large and the other
     
    192193        isTiled = autoTiled;
    193194
    194     IntSize requestedSize = isTiled ? tileSize : contentBounds();
     195    // Empty tile size tells the tiler to avoid tiling.
     196    IntSize requestedSize = isTiled ? tileSize : IntSize();
    195197    const int maxSize = layerRenderer()->maxTextureSize();
    196198    IntSize clampedSize = requestedSize.shrunkTo(IntSize(maxSize, maxSize));
     
    229231        layerRenderer(),
    230232        IntSize(defaultTileSize, defaultTileSize),
    231         LayerTilerChromium::HasBorderTexels);
     233        m_borderTexels ? LayerTilerChromium::HasBorderTexels :
     234        LayerTilerChromium::NoBorderTexels);
    232235}
    233236
     
    257260void ContentLayerChromium::setIsMask(bool isMask)
    258261{
     262    m_borderTexels = false;
    259263    setTilingOption(isMask ? NeverTile : AutoTile);
    260264}
  • trunk/Source/WebCore/platform/graphics/chromium/ContentLayerChromium.h

    r90492 r90646  
    8282    OwnPtr<LayerTilerChromium> m_tiler;
    8383    TilingOption m_tilingOption;
     84    bool m_borderTexels;
    8485};
    8586
  • trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp

    r90505 r90646  
    3232
    3333#include "Extensions3DChromium.h"
     34#include "FloatQuad.h"
    3435#include "GraphicsContext.h"
    3536#include "GraphicsContext3D.h"
     
    4445namespace WebCore {
    4546
     47typedef FloatPoint3D Edge;
     48
    4649PassOwnPtr<LayerTilerChromium> LayerTilerChromium::create(LayerRendererChromium* layerRenderer, const IntSize& tileSize, BorderTexelOption border)
    4750{
     
    8083
    8184    m_tileSize = size;
    82     m_tilingData.setMaxTextureSize(max(size.width(), size.height()));
    8385}
    8486
     
    186188{
    187189    const int index = m_tilingData.tileIndex(tile->i(), tile->j());
    188     IntRect layerRect = m_tilingData.tileBoundsWithBorder(index);
    189     layerRect.setSize(m_tileSize);
    190     return layerRect;
     190    return m_tilingData.tileBoundsWithBorder(index);
     191}
     192
     193IntRect LayerTilerChromium::tileTexRect(const Tile* tile) const
     194{
     195    const int index = m_tilingData.tileIndex(tile->i(), tile->j());
     196    return m_tilingData.tileBoundsWithOuterBorder(index);
    191197}
    192198
     
    195201    if (contentRect.isEmpty() || m_skipsDraw)
    196202        return;
     203
     204    IntSize oldLayerSize(m_tilingData.totalSizeX(), m_tilingData.totalSizeY());
     205    const IntRect oldLayerRect = IntRect(IntPoint(), oldLayerSize);
    197206
    198207    growLayerToContain(contentRect);
     
    212221            bound.intersect(layerRect);
    213222            tile->m_dirtyLayerRect.unite(bound);
     223
     224            // Invalidate old layer area to clear any contents left from
     225            // previous layer size.
     226            IntRect oldBound = tileLayerRect(tile);
     227            oldBound.intersect(oldLayerRect);
     228            tile->m_dirtyLayerRect.unite(oldBound);
    214229        }
    215230    }
     
    268283    // the dirty regions currently being drawn.
    269284    IntRect dirtyLayerRect;
     285    IntSize tileSize;
    270286    int left, top, right, bottom;
    271287    contentRectToTileIndices(contentRect, left, top, right, bottom);
     
    275291            if (!tile)
    276292                tile = createTile(i, j);
    277             if (!tile->texture()->isValid(m_tileSize, m_textureFormat))
     293
     294            IntSize texSize = tileTexRect(tile).size();
     295            if (!tile->texture()->isValid(texSize, m_textureFormat))
    278296                tile->m_dirtyLayerRect = tileLayerRect(tile);
    279297
    280             if (!tile->texture()->reserve(m_tileSize, m_textureFormat)) {
     298            if (!tile->texture()->reserve(texSize, m_textureFormat)) {
    281299                m_skipsDraw = true;
    282300                reset();
     
    285303
    286304            dirtyLayerRect.unite(tile->m_dirtyLayerRect);
     305
     306            tileSize = tileSize.expandedTo(texSize);
    287307        }
    288308    }
     
    297317        return;
    298318
    299     textureUpdater->prepareToUpdate(m_paintRect, m_tileSize, m_tilingData.borderTexels());
     319    textureUpdater->prepareToUpdate(m_paintRect, tileSize, m_tilingData.borderTexels());
    300320}
    301321
     
    320340            // Calculate page-space rectangle to copy from.
    321341            IntRect sourceRect = tileContentRect(tile);
    322             const IntPoint anchor = sourceRect.location();
     342            IntRect texRect = tileTexRect(tile);
     343            const IntPoint anchor = texRect.location();
    323344            sourceRect.intersect(layerRectToContentRect(tile->m_dirtyLayerRect));
    324345            // Paint rect not guaranteed to line up on tile boundaries, so
     
    387408    IntRect layerRect = contentRectToLayerRect(contentRect);
    388409    IntSize rectSize = IntSize(layerRect.maxX(), layerRect.maxY());
    389 
     410    IntSize texSize = m_tileSize;
     411
     412    // Use rect with border texels as max texture size when tile size
     413    // has not been specified.
     414    if (texSize.isEmpty()) {
     415        texSize = rectSize;
     416        if (m_tilingData.borderTexels())
     417            texSize.expand(2, 2);
     418    }
     419
     420    m_tilingData.setMaxTextureSize(max(texSize.width(), texSize.height()));
    390421    IntSize oldLayerSize(m_tilingData.totalSizeX(), m_tilingData.totalSizeY());
    391422    IntSize newSize = rectSize.expandedTo(oldLayerSize);
    392423    m_tilingData.setTotalSize(newSize.width(), newSize.height());
     424}
     425
     426static bool isCCW(const FloatQuad& quad)
     427{
     428    FloatPoint v1 = FloatPoint(quad.p2().x() - quad.p1().x(),
     429                               quad.p2().y() - quad.p1().y());
     430    FloatPoint v2 = FloatPoint(quad.p3().x() - quad.p2().x(),
     431                               quad.p3().y() - quad.p2().y());
     432    return (v1.x() * v2.y() - v1.y() * v2.x()) < 0;
     433}
     434
     435static Edge computeEdge(const FloatPoint& p, const FloatPoint& q, float sign)
     436{
     437    ASSERT(p != q);
     438
     439    FloatPoint tangent(p.y() - q.y(), q.x() - p.x());
     440    float scale = sign / tangent.length();
     441    float cross2 = p.x() * q.y() - q.x() * p.y();
     442
     443    return Edge(tangent.x() * scale,
     444                tangent.y() * scale,
     445                cross2 * scale);
     446}
     447
     448static FloatPoint intersect(const Edge& a, const Edge& b)
     449{
     450    return FloatPoint(
     451        (a.y() * b.z() - b.y() * a.z()) / (a.x() * b.y() - b.x() * a.y()),
     452        (a.x() * b.z() - b.x() * a.z()) / (b.x() * a.y() - a.x() * b.y()));
    393453}
    394454
     
    401461    GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
    402462
     463    TransformationMatrix matrix(globalTransform);
     464
     465    // We don't care about Z component.
     466    TransformationMatrix matrixXYW =
     467        TransformationMatrix(matrix.m11(), matrix.m12(), 0, matrix.m14(),
     468                             matrix.m21(), matrix.m22(), 0, matrix.m24(),
     469                             matrix.m31(), matrix.m32(), 1, matrix.m34(),
     470                             matrix.m41(), matrix.m42(), 0, matrix.m44());
     471
     472    // Don't draw any tiles when matrix is not invertible.
     473    if (!matrixXYW.isInvertible())
     474        return;
     475
     476    TransformationMatrix inverse = matrixXYW.inverse();
     477    IntRect bounds(m_layerPosition, IntSize(m_tilingData.totalSizeX(),
     478                                            m_tilingData.totalSizeY()));
     479
     480    // Include outer border texels in bounds.
     481    bounds.inflate(m_tilingData.borderTexels());
     482
     483    // Map bounds to device space.
     484    FloatQuad boundsQuad = matrix.mapQuad(FloatQuad(bounds));
     485
     486    // Counter-clockwise?
     487    float sign = isCCW(boundsQuad) ? -1 : 1;
     488
     489    // Compute outer edges.
     490    Edge leftEdge = computeEdge(boundsQuad.p4(), boundsQuad.p1(), sign);
     491    Edge rightEdge = computeEdge(boundsQuad.p2(), boundsQuad.p3(), sign);
     492    Edge topEdge = computeEdge(boundsQuad.p1(), boundsQuad.p2(), sign);
     493    Edge bottomEdge = computeEdge(boundsQuad.p3(), boundsQuad.p4(), sign);
     494
     495    // Move outer edges to ensure that all partially covered pixels are
     496    // processed.
     497    float zDistance = m_tilingData.borderTexels() * 0.5f;
     498    leftEdge.move(0, 0, zDistance);
     499    rightEdge.move(0, 0, zDistance);
     500    topEdge.move(0, 0, zDistance);
     501    bottomEdge.move(0, 0, zDistance);
     502
     503    Edge prevEdgeY = topEdge;
     504
    403505    int left, top, right, bottom;
    404506    contentRectToTileIndices(contentRect, left, top, right, bottom);
    405     IntRect layerRect = contentRectToLayerRect(contentRect);
    406507    for (int j = top; j <= bottom; ++j) {
     508        Edge prevEdgeX = leftEdge;
     509
     510        Edge edgeY = bottomEdge;
     511        if (j < (m_tilingData.numTilesY() - 1)) {
     512            IntRect tileRect = m_tilingData.tileBounds(m_tilingData.tileIndex(0, j));
     513            tileRect.move(m_layerPosition.x(), m_layerPosition.y());
     514
     515            FloatPoint p1(tileRect.maxX(), tileRect.maxY());
     516            FloatPoint p2(tileRect.x(), tileRect.maxY());
     517
     518            // Map points to device space.
     519            p1 = matrix.mapPoint(p1);
     520            p2 = matrix.mapPoint(p2);
     521
     522            // Compute horizontal edge.
     523            edgeY = computeEdge(p1, p2, sign);
     524        }
     525
    407526        for (int i = left; i <= right; ++i) {
    408527            Tile* tile = tileAt(i, j);
     
    414533            tile->texture()->bindTexture();
    415534
    416             TransformationMatrix tileMatrix(globalTransform);
    417 
    418535            // Don't use tileContentRect here, as that contains the full
    419536            // rect with border texels which shouldn't be drawn.
    420537            IntRect tileRect = m_tilingData.tileBounds(m_tilingData.tileIndex(tile->i(), tile->j()));
    421             IntRect displayRect = tileRect;
    422             tileRect.intersect(layerRect);
    423             // Keep track of how the top left has moved, so the texture can be
    424             // offset the same amount.
    425             IntSize offset = tileRect.minXMinYCorner() - displayRect.minXMinYCorner();
    426538            tileRect.move(m_layerPosition.x(), m_layerPosition.y());
    427             tileMatrix.translate3d(tileRect.x() + tileRect.width() / 2.0, tileRect.y() + tileRect.height() / 2.0, 0);
    428 
    429             IntPoint texOffset = m_tilingData.textureOffset(tile->i(), tile->j()) + offset;
    430             float tileWidth = static_cast<float>(m_tileSize.width());
    431             float tileHeight = static_cast<float>(m_tileSize.height());
    432             float texTranslateX = texOffset.x() / tileWidth;
    433             float texTranslateY = texOffset.y() / tileHeight;
     539
     540            IntPoint texOffset = m_tilingData.textureOffset(tile->i(), tile->j());
     541            IntRect texRect = tileTexRect(tile);
     542            float tileWidth = static_cast<float>(texRect.width());
     543            float tileHeight = static_cast<float>(texRect.height());
     544            float texTranslateX = (texOffset.x() - tileRect.x()) / tileWidth;
     545            float texTranslateY = (texOffset.y() - tileRect.y()) / tileHeight;
    434546            float texScaleX = tileRect.width() / tileWidth;
    435547            float texScaleY = tileRect.height() / tileHeight;
     
    440552                texScaleY *= -1.0;
    441553            }
    442             drawTexturedQuad(context, layerRenderer()->projectionMatrix(), tileMatrix, tileRect.width(), tileRect.height(), opacity, texTranslateX, texTranslateY, texScaleX, texScaleY, program);
     554
     555            Edge edgeX = rightEdge;
     556            if (i < (m_tilingData.numTilesX() - 1)) {
     557                FloatPoint p1(tileRect.maxX(), tileRect.y());
     558                FloatPoint p2(tileRect.maxX(), tileRect.maxY());
     559
     560                // Map points to device space.
     561                p1 = matrix.mapPoint(p1);
     562                p2 = matrix.mapPoint(p2);
     563
     564                // Compute vertical edge.
     565                edgeX = computeEdge(p1, p2, sign);
     566            }
     567
     568            // Create device space quad.
     569            FloatQuad deviceQuad(intersect(edgeY, prevEdgeX),
     570                                 intersect(prevEdgeX, prevEdgeY),
     571                                 intersect(prevEdgeY, edgeX),
     572                                 intersect(edgeX, edgeY));
     573
     574            // Map quad to layer space.
     575            FloatQuad quad = inverse.mapQuad(deviceQuad);
     576
     577            // Normalize to tileRect.
     578            quad.scale(1.0f / tileRect.width(), 1.0f / tileRect.height());
     579
     580            drawTexturedQuad(context, quad, layerRenderer()->projectionMatrix(), matrix, tileRect.width(), tileRect.height(), opacity, texTranslateX, texTranslateY, texScaleX, texScaleY, program);
     581
     582            prevEdgeX = edgeX;
    443583        }
     584
     585        prevEdgeY = edgeY;
    444586    }
    445587}
    446588
    447589template <class T>
    448 void LayerTilerChromium::drawTexturedQuad(GraphicsContext3D* context, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
     590void LayerTilerChromium::drawTexturedQuad(GraphicsContext3D* context, const FloatQuad& quad, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
    449591                                          float width, float height, float opacity,
    450592                                          float texTranslateX, float texTranslateY,
     
    469611        texTranslateX, texTranslateY, texScaleX, texScaleY));
    470612
     613    float point[8];
     614    point[0] = quad.p1().x();
     615    point[1] = quad.p1().y();
     616    point[2] = quad.p2().x();
     617    point[3] = quad.p2().y();
     618    point[4] = quad.p3().x();
     619    point[5] = quad.p3().y();
     620    point[6] = quad.p4().x();
     621    point[7] = quad.p4().y();
     622    GLC(context, context->uniform2fv(program->vertexShader().pointLocation(), point, 4));
     623
    471624    GLC(context, context->drawElements(GraphicsContext3D::TRIANGLES, 6, GraphicsContext3D::UNSIGNED_SHORT, 0));
    472625}
  • trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.h

    r90505 r90646  
    113113
    114114    template <class T>
    115     void drawTexturedQuad(GraphicsContext3D*, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
     115    void drawTexturedQuad(GraphicsContext3D*, const FloatQuad&, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
    116116                          float width, float height, float opacity,
    117117                          float texTranslateX, float texTranslateY,
     
    135135    IntRect tileContentRect(const Tile*) const;
    136136    IntRect tileLayerRect(const Tile*) const;
     137    IntRect tileTexRect(const Tile*) const;
    137138
    138139    GC3Denum m_textureFormat;
  • trunk/Source/WebCore/platform/graphics/chromium/ShaderChromium.cpp

    r89634 r90646  
    125125    : m_matrixLocation(-1)
    126126    , m_texTransformLocation(-1)
     127    , m_pointLocation(-1)
    127128{
    128129}
     
    132133    m_matrixLocation = context->getUniformLocation(program, "matrix");
    133134    m_texTransformLocation = context->getUniformLocation(program, "texTransform");
    134     ASSERT(m_matrixLocation != -1 && m_texTransformLocation != -1);
     135    m_pointLocation = context->getUniformLocation(program, "point");
     136    ASSERT(m_matrixLocation != -1 && m_texTransformLocation != -1 && m_pointLocation != -1);
    135137}
    136138
     
    142144        uniform mat4 matrix;
    143145        uniform vec4 texTransform;
    144         varying vec2 v_texCoord;
    145         void main()
    146         {
    147             gl_Position = matrix * a_position;
    148             v_texCoord = a_texCoord * texTransform.zw + texTransform.xy;
     146        uniform vec2 point[4];
     147        varying vec2 v_texCoord;
     148        void main()
     149        {
     150            vec2 complement = abs(a_texCoord - 1.0);
     151            vec4 pos = vec4(0.0, 0.0, a_position.z, a_position.w);
     152            pos.xy += (complement.x * complement.y) * point[0];
     153            pos.xy += (a_texCoord.x * complement.y) * point[1];
     154            pos.xy += (a_texCoord.x * a_texCoord.y) * point[2];
     155            pos.xy += (complement.x * a_texCoord.y) * point[3];
     156            gl_Position = matrix * pos;
     157            v_texCoord = pos.xy * texTransform.zw + texTransform.xy;
    149158        }
    150159    );
  • trunk/Source/WebCore/platform/graphics/chromium/ShaderChromium.h

    r89634 r90646  
    9191    int matrixLocation() const { return m_matrixLocation; }
    9292    int texTransformLocation() const { return m_texTransformLocation; }
     93    int pointLocation() const { return m_pointLocation; }
    9394
    9495private:
    9596    int m_matrixLocation;
    9697    int m_texTransformLocation;
     98    int m_pointLocation;
    9799};
    98100
  • trunk/Source/WebCore/platform/graphics/gpu/TilingData.cpp

    r87748 r90646  
    4545static int computeNumTiles(int maxTextureSize, int totalSize, int borderTexels)
    4646{
     47    int totalSizeWithBorder = totalSize + 2 * borderTexels;
     48
    4749    if (maxTextureSize - 2 * borderTexels <= 0)
    48         return totalSize > 0 && maxTextureSize >= totalSize ? 1 : 0;
    49 
    50     int numTiles = max(1, 1 + (totalSize - 1 - 2 * borderTexels) / (maxTextureSize - 2 * borderTexels));
     50        return 0;
     51
     52    int numTiles = max(1, 1 + (totalSizeWithBorder - 1 - 2 * borderTexels) / (maxTextureSize - 2 * borderTexels));
    5153    return totalSize > 0 ? numTiles : 0;
    5254}
     
    8082
    8183    ASSERT(m_maxTextureSize - 2 * m_borderTexels);
    82     int x = (srcPos - m_borderTexels) / (m_maxTextureSize - 2 * m_borderTexels);
     84    int x = srcPos / (m_maxTextureSize - 2 * m_borderTexels);
    8385    return min(max(x, 0), numTilesX() - 1);
    8486}
     
    9092
    9193    ASSERT(m_maxTextureSize - 2 * m_borderTexels);
    92     int y = (srcPos - m_borderTexels) / (m_maxTextureSize - 2 * m_borderTexels);
     94    int y = srcPos / (m_maxTextureSize - 2 * m_borderTexels);
    9395    return min(max(y, 0), numTilesY() - 1);
    9496}
     
    133135}
    134136
     137IntRect TilingData::tileBoundsWithOuterBorder(int tile) const
     138{
     139    IntRect bounds = tileBounds(tile);
     140
     141    if (m_borderTexels)
     142        bounds.inflate(1);
     143
     144    return bounds;
     145}
     146
    135147FloatRect TilingData::tileBoundsNormalized(int tile) const
    136148{
     
    169181    if (!xIndex && m_numTilesX == 1)
    170182        return m_totalSizeX;
    171     if (!xIndex && m_numTilesX > 1)
    172         return m_maxTextureSize - m_borderTexels;
    173183    if (xIndex < numTilesX() - 1)
    174184        return m_maxTextureSize - 2 * m_borderTexels;
     
    186196    if (!yIndex && m_numTilesY == 1)
    187197        return m_totalSizeY;
    188     if (!yIndex && m_numTilesY > 1)
    189         return m_maxTextureSize - m_borderTexels;
    190198    if (yIndex < numTilesY() - 1)
    191199        return m_maxTextureSize - 2 * m_borderTexels;
     
    231239    *newSrc = srcRectIntersected;
    232240    newSrc->move(
    233         -tileBounds.x() + ((tileXIndex(tile) > 0) ? m_borderTexels : 0),
    234         -tileBounds.y() + ((tileYIndex(tile) > 0) ? m_borderTexels : 0));
     241        -tileBounds.x() + m_borderTexels,
     242        -tileBounds.y() + m_borderTexels);
    235243
    236244    *newDst = FloatRect(
     
    243251IntPoint TilingData::textureOffset(int xIndex, int yIndex) const
    244252{
    245     int left = (!xIndex || m_numTilesX == 1) ? 0 : m_borderTexels;
    246     int top = (!yIndex || m_numTilesY == 1) ? 0 : m_borderTexels;
    247 
    248     return IntPoint(left, top);
     253    return IntPoint(m_borderTexels, m_borderTexels);
    249254}
    250255
  • trunk/Source/WebCore/platform/graphics/gpu/TilingData.h

    r87750 r90646  
    6262    IntRect tileBounds(int tile) const;
    6363    IntRect tileBoundsWithBorder(int tile) const;
     64    IntRect tileBoundsWithOuterBorder(int tile) const;
    6465    FloatRect tileBoundsNormalized(int tile) const;
    6566    int tilePositionX(int xIndex) const;
  • trunk/Source/WebKit/ChangeLog

    r90093 r90646  
     12011-07-08  David Reveman  <reveman@chromium.org>
     2
     3        Reviewed by Stephen White.
     4
     5        [Chromium] Edge anti-aliasing for composited layers.
     6        https://bugs.webkit.org/show_bug.cgi?id=61388
     7
     8        Track changes to TilingData class which now uses an outer border.
     9
     10        * chromium/tests/TilingDataTest.cpp:
     11
    1122011-06-30  Leandro Pereira  <leandro@profusion.mobi>
    213
  • trunk/Source/WebKit/chromium/tests/TilingDataTest.cpp

    r87094 r90646  
    4242{
    4343    EXPECT_EQ(1, TilingData(16, 16, 16, false).numTiles());
    44     EXPECT_EQ(1, TilingData(16, 15, 15, true).numTiles());
    45     EXPECT_EQ(1, TilingData(16, 16, 16, true).numTiles());
     44    EXPECT_EQ(1, TilingData(17, 15, 15, true).numTiles());
     45    EXPECT_EQ(1, TilingData(18, 16, 16, true).numTiles());
    4646    EXPECT_EQ(1, TilingData(16,  1, 16, false).numTiles());
    47     EXPECT_EQ(1, TilingData(15, 15, 15, true).numTiles());
     47    EXPECT_EQ(1, TilingData(17, 15, 15, true).numTiles());
    4848}
    4949
     
    110110    EXPECT_EQ(0, TilingData(0,  1,  1, true).numTiles());
    111111
    112     EXPECT_EQ(1, TilingData(1,  1,  1, true).numTiles());
     112    EXPECT_EQ(0, TilingData(1,  1,  1, true).numTiles());
    113113    EXPECT_EQ(0, TilingData(1,  1,  2, true).numTiles());
    114114    EXPECT_EQ(0, TilingData(1,  2,  1, true).numTiles());
    115     EXPECT_EQ(1, TilingData(2,  1,  1, true).numTiles());
    116     EXPECT_EQ(1, TilingData(2,  1,  2, true).numTiles());
    117     EXPECT_EQ(1, TilingData(2,  2,  1, true).numTiles());
    118     EXPECT_EQ(1, TilingData(2,  2,  2, true).numTiles());
    119 
    120     EXPECT_EQ(1, TilingData(3,  1,  3, true).numTiles());
    121     EXPECT_EQ(1, TilingData(3,  2,  3, true).numTiles());
    122     EXPECT_EQ(1, TilingData(3,  3,  3, true).numTiles());
    123     EXPECT_EQ(2, TilingData(3,  4,  3, true).numTiles());
    124     EXPECT_EQ(3, TilingData(3,  5,  3, true).numTiles());
    125     EXPECT_EQ(4, TilingData(3,  6,  3, true).numTiles());
    126     EXPECT_EQ(5, TilingData(3,  7,  3, true).numTiles());
    127 
    128     EXPECT_EQ(1, TilingData(4,  1,  4, true).numTiles());
    129     EXPECT_EQ(1, TilingData(4,  2,  4, true).numTiles());
    130     EXPECT_EQ(1, TilingData(4,  3,  4, true).numTiles());
    131     EXPECT_EQ(1, TilingData(4,  4,  4, true).numTiles());
    132     EXPECT_EQ(2, TilingData(4,  5,  4, true).numTiles());
    133     EXPECT_EQ(2, TilingData(4,  6,  4, true).numTiles());
    134     EXPECT_EQ(3, TilingData(4,  7,  4, true).numTiles());
    135     EXPECT_EQ(3, TilingData(4,  8,  4, true).numTiles());
    136     EXPECT_EQ(4, TilingData(4,  9,  4, true).numTiles());
    137     EXPECT_EQ(4, TilingData(4, 10,  4, true).numTiles());
    138     EXPECT_EQ(5, TilingData(4, 11,  4, true).numTiles());
    139 
    140     EXPECT_EQ(1, TilingData(5,  1,  5, true).numTiles());
    141     EXPECT_EQ(1, TilingData(5,  2,  5, true).numTiles());
    142     EXPECT_EQ(1, TilingData(5,  3,  5, true).numTiles());
    143     EXPECT_EQ(1, TilingData(5,  4,  5, true).numTiles());
    144     EXPECT_EQ(1, TilingData(5,  5,  5, true).numTiles());
    145     EXPECT_EQ(2, TilingData(5,  6,  5, true).numTiles());
    146     EXPECT_EQ(2, TilingData(5,  7,  5, true).numTiles());
    147     EXPECT_EQ(2, TilingData(5,  8,  5, true).numTiles());
    148     EXPECT_EQ(3, TilingData(5,  9,  5, true).numTiles());
    149     EXPECT_EQ(3, TilingData(5, 10,  5, true).numTiles());
    150     EXPECT_EQ(3, TilingData(5, 11,  5, true).numTiles());
     115    EXPECT_EQ(0, TilingData(2,  1,  1, true).numTiles());
     116    EXPECT_EQ(0, TilingData(2,  1,  2, true).numTiles());
     117    EXPECT_EQ(0, TilingData(2,  2,  1, true).numTiles());
     118    EXPECT_EQ(0, TilingData(2,  2,  2, true).numTiles());
     119
     120    EXPECT_EQ(1, TilingData(3,  1,  1, true).numTiles());
     121    EXPECT_EQ(2, TilingData(3,  1,  2, true).numTiles());
     122    EXPECT_EQ(2, TilingData(3,  2,  1, true).numTiles());
     123    EXPECT_EQ(4, TilingData(3,  2,  2, true).numTiles());
     124    EXPECT_EQ(6, TilingData(3,  2,  3, true).numTiles());
     125    EXPECT_EQ(6, TilingData(3,  3,  2, true).numTiles());
     126    EXPECT_EQ(9, TilingData(3,  3,  3, true).numTiles());
     127
     128    EXPECT_EQ(1, TilingData(4,  1,  2, true).numTiles());
     129    EXPECT_EQ(1, TilingData(4,  2,  2, true).numTiles());
     130    EXPECT_EQ(2, TilingData(4,  3,  2, true).numTiles());
     131    EXPECT_EQ(2, TilingData(4,  4,  2, true).numTiles());
     132    EXPECT_EQ(3, TilingData(4,  5,  2, true).numTiles());
     133    EXPECT_EQ(3, TilingData(4,  6,  2, true).numTiles());
     134    EXPECT_EQ(4, TilingData(4,  7,  2, true).numTiles());
     135    EXPECT_EQ(4, TilingData(4,  8,  2, true).numTiles());
     136    EXPECT_EQ(5, TilingData(4,  9,  2, true).numTiles());
     137    EXPECT_EQ(5, TilingData(4, 10,  2, true).numTiles());
     138    EXPECT_EQ(6, TilingData(4, 11,  2, true).numTiles());
     139
     140    EXPECT_EQ(1, TilingData(5,  1,  3, true).numTiles());
     141    EXPECT_EQ(1, TilingData(5,  2,  3, true).numTiles());
     142    EXPECT_EQ(1, TilingData(5,  3,  3, true).numTiles());
     143    EXPECT_EQ(2, TilingData(5,  4,  3, true).numTiles());
     144    EXPECT_EQ(2, TilingData(5,  5,  3, true).numTiles());
     145    EXPECT_EQ(2, TilingData(5,  6,  3, true).numTiles());
     146    EXPECT_EQ(3, TilingData(5,  7,  3, true).numTiles());
     147    EXPECT_EQ(3, TilingData(5,  8,  3, true).numTiles());
     148    EXPECT_EQ(3, TilingData(5,  9,  3, true).numTiles());
     149    EXPECT_EQ(4, TilingData(5, 10,  3, true).numTiles());
     150    EXPECT_EQ(4, TilingData(5, 11,  3, true).numTiles());
    151151}
    152152
     
    167167
    168168    EXPECT_EQ(0, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(0));
    169     EXPECT_EQ(0, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(1));
    170     EXPECT_EQ(1, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(2));
    171     EXPECT_EQ(2, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(3));
    172     EXPECT_EQ(3, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(4));
    173     EXPECT_EQ(4, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(5));
    174     EXPECT_EQ(5, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(6));
    175     EXPECT_EQ(6, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(7));
    176     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(8));
    177     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(9));
    178     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(10));
    179     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(11));
     169    EXPECT_EQ(1, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(1));
     170    EXPECT_EQ(2, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(2));
     171    EXPECT_EQ(3, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(3));
     172    EXPECT_EQ(4, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(4));
     173    EXPECT_EQ(5, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(5));
     174    EXPECT_EQ(6, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(6));
     175    EXPECT_EQ(7, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(7));
     176    EXPECT_EQ(8, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(8));
     177    EXPECT_EQ(9, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(9));
     178    EXPECT_EQ(9, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(10));
     179    EXPECT_EQ(9, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(11));
    180180
    181181    EXPECT_EQ(0, TilingData(1, 1, 1, false).tileXIndexFromSrcCoord(0));
     
    195195    EXPECT_EQ(0, TilingData(2, 2, 2, true).tileXIndexFromSrcCoord(1));
    196196    EXPECT_EQ(0, TilingData(3, 3, 3, true).tileXIndexFromSrcCoord(0));
    197     EXPECT_EQ(0, TilingData(3, 3, 3, true).tileXIndexFromSrcCoord(1));
    198     EXPECT_EQ(0, TilingData(3, 3, 3, true).tileXIndexFromSrcCoord(2));
    199 
    200     EXPECT_EQ(0, TilingData(3, 4, 3, true).tileXIndexFromSrcCoord(0));
    201     EXPECT_EQ(0, TilingData(3, 4, 3, true).tileXIndexFromSrcCoord(1));
    202     EXPECT_EQ(1, TilingData(3, 4, 3, true).tileXIndexFromSrcCoord(2));
    203     EXPECT_EQ(1, TilingData(3, 4, 3, true).tileXIndexFromSrcCoord(3));
     197    EXPECT_EQ(1, TilingData(3, 3, 3, true).tileXIndexFromSrcCoord(1));
     198    EXPECT_EQ(2, TilingData(3, 3, 3, true).tileXIndexFromSrcCoord(2));
     199
     200    EXPECT_EQ(0, TilingData(4, 4, 3, true).tileXIndexFromSrcCoord(0));
     201    EXPECT_EQ(0, TilingData(4, 4, 3, true).tileXIndexFromSrcCoord(1));
     202    EXPECT_EQ(1, TilingData(4, 4, 3, true).tileXIndexFromSrcCoord(2));
     203    EXPECT_EQ(1, TilingData(4, 4, 3, true).tileXIndexFromSrcCoord(3));
    204204}
    205205TEST(TilingDataTest, tileYIndexFromSrcCoord)
     
    219219
    220220    EXPECT_EQ(0, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(0));
    221     EXPECT_EQ(0, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(1));
    222     EXPECT_EQ(1, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(2));
    223     EXPECT_EQ(2, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(3));
    224     EXPECT_EQ(3, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(4));
    225     EXPECT_EQ(4, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(5));
    226     EXPECT_EQ(5, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(6));
    227     EXPECT_EQ(6, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(7));
    228     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(8));
    229     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(9));
    230     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(10));
    231     EXPECT_EQ(7, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(11));
     221    EXPECT_EQ(1, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(1));
     222    EXPECT_EQ(2, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(2));
     223    EXPECT_EQ(3, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(3));
     224    EXPECT_EQ(4, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(4));
     225    EXPECT_EQ(5, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(5));
     226    EXPECT_EQ(6, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(6));
     227    EXPECT_EQ(7, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(7));
     228    EXPECT_EQ(8, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(8));
     229    EXPECT_EQ(9, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(9));
     230    EXPECT_EQ(9, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(10));
     231    EXPECT_EQ(9, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(11));
    232232
    233233    EXPECT_EQ(0, TilingData(1, 1, 1, false).tileYIndexFromSrcCoord(0));
     
    247247    EXPECT_EQ(0, TilingData(2, 2, 2, true).tileYIndexFromSrcCoord(1));
    248248    EXPECT_EQ(0, TilingData(3, 3, 3, true).tileYIndexFromSrcCoord(0));
    249     EXPECT_EQ(0, TilingData(3, 3, 3, true).tileYIndexFromSrcCoord(1));
    250     EXPECT_EQ(0, TilingData(3, 3, 3, true).tileYIndexFromSrcCoord(2));
    251 
    252     EXPECT_EQ(0, TilingData(3, 3, 4, true).tileYIndexFromSrcCoord(0));
    253     EXPECT_EQ(0, TilingData(3, 3, 4, true).tileYIndexFromSrcCoord(1));
    254     EXPECT_EQ(1, TilingData(3, 3, 4, true).tileYIndexFromSrcCoord(2));
    255     EXPECT_EQ(1, TilingData(3, 3, 4, true).tileYIndexFromSrcCoord(3));
     249    EXPECT_EQ(1, TilingData(3, 3, 3, true).tileYIndexFromSrcCoord(1));
     250    EXPECT_EQ(2, TilingData(3, 3, 3, true).tileYIndexFromSrcCoord(2));
     251
     252    EXPECT_EQ(0, TilingData(4, 3, 4, true).tileYIndexFromSrcCoord(0));
     253    EXPECT_EQ(0, TilingData(4, 3, 4, true).tileYIndexFromSrcCoord(1));
     254    EXPECT_EQ(1, TilingData(4, 3, 4, true).tileYIndexFromSrcCoord(2));
     255    EXPECT_EQ(1, TilingData(4, 3, 4, true).tileYIndexFromSrcCoord(3));
    256256}
    257257
     
    259259{
    260260    EXPECT_EQ(5, TilingData(5,  5,  5, false).tileSizeX(0));
    261     EXPECT_EQ(5, TilingData(5,  5,  5, true).tileSizeX(0));
     261    EXPECT_EQ(3, TilingData(5,  5,  5, true).tileSizeX(0));
    262262
    263263    EXPECT_EQ(5, TilingData(5,  6,  6, false).tileSizeX(0));
    264264    EXPECT_EQ(1, TilingData(5,  6,  6, false).tileSizeX(1));
    265     EXPECT_EQ(4, TilingData(5,  6,  6, true).tileSizeX(0));
    266     EXPECT_EQ(2, TilingData(5,  6,  6, true).tileSizeX(1));
     265    EXPECT_EQ(3, TilingData(5,  6,  6, true).tileSizeX(0));
     266    EXPECT_EQ(3, TilingData(5,  6,  6, true).tileSizeX(1));
    267267
    268268    EXPECT_EQ(5, TilingData(5,  8,  8, false).tileSizeX(0));
    269269    EXPECT_EQ(3, TilingData(5,  8,  8, false).tileSizeX(1));
    270     EXPECT_EQ(4, TilingData(5,  8,  8, true).tileSizeX(0));
    271     EXPECT_EQ(4, TilingData(5,  8,  8, true).tileSizeX(1));
     270    EXPECT_EQ(3, TilingData(5,  8,  8, true).tileSizeX(0));
     271    EXPECT_EQ(3, TilingData(5,  8,  8, true).tileSizeX(1));
    272272
    273273    EXPECT_EQ(5, TilingData(5, 10, 10, false).tileSizeX(0));
    274274    EXPECT_EQ(5, TilingData(5, 10, 10, false).tileSizeX(1));
    275     EXPECT_EQ(4, TilingData(5, 10, 10, true).tileSizeX(0));
     275    EXPECT_EQ(3, TilingData(5, 10, 10, true).tileSizeX(0));
    276276    EXPECT_EQ(3, TilingData(5, 10, 10, true).tileSizeX(1));
    277277    EXPECT_EQ(3, TilingData(5, 10, 10, true).tileSizeX(2));
    278278
    279     EXPECT_EQ(4, TilingData(5, 11, 11, true).tileSizeX(2));
     279    EXPECT_EQ(3, TilingData(5, 11, 11, true).tileSizeX(2));
    280280    EXPECT_EQ(3, TilingData(5, 12, 12, true).tileSizeX(2));
    281281}
     
    283283{
    284284    EXPECT_EQ(5, TilingData(5,  5,  5, false).tileSizeY(0));
    285     EXPECT_EQ(5, TilingData(5,  5,  5, true).tileSizeY(0));
     285    EXPECT_EQ(3, TilingData(5,  5,  5, true).tileSizeY(0));
    286286
    287287    EXPECT_EQ(5, TilingData(5,  6,  6, false).tileSizeY(0));
    288288    EXPECT_EQ(1, TilingData(5,  6,  6, false).tileSizeY(1));
    289     EXPECT_EQ(4, TilingData(5,  6,  6, true).tileSizeY(0));
    290     EXPECT_EQ(2, TilingData(5,  6,  6, true).tileSizeY(1));
     289    EXPECT_EQ(3, TilingData(5,  6,  6, true).tileSizeY(0));
     290    EXPECT_EQ(3, TilingData(5,  6,  6, true).tileSizeY(1));
    291291
    292292    EXPECT_EQ(5, TilingData(5,  8,  8, false).tileSizeY(0));
    293293    EXPECT_EQ(3, TilingData(5,  8,  8, false).tileSizeY(1));
    294     EXPECT_EQ(4, TilingData(5,  8,  8, true).tileSizeY(0));
    295     EXPECT_EQ(4, TilingData(5,  8,  8, true).tileSizeY(1));
     294    EXPECT_EQ(3, TilingData(5,  8,  8, true).tileSizeY(0));
     295    EXPECT_EQ(3, TilingData(5,  8,  8, true).tileSizeY(1));
    296296
    297297    EXPECT_EQ(5, TilingData(5, 10, 10, false).tileSizeY(0));
    298298    EXPECT_EQ(5, TilingData(5, 10, 10, false).tileSizeY(1));
    299     EXPECT_EQ(4, TilingData(5, 10, 10, true).tileSizeY(0));
     299    EXPECT_EQ(3, TilingData(5, 10, 10, true).tileSizeY(0));
    300300    EXPECT_EQ(3, TilingData(5, 10, 10, true).tileSizeY(1));
    301301    EXPECT_EQ(3, TilingData(5, 10, 10, true).tileSizeY(2));
    302302
    303     EXPECT_EQ(4, TilingData(5, 11, 11, true).tileSizeY(2));
     303    EXPECT_EQ(3, TilingData(5, 11, 11, true).tileSizeY(2));
    304304    EXPECT_EQ(3, TilingData(5, 12, 12, true).tileSizeY(2));
    305305}
     
    320320    EXPECT_EQ(1, TilingData(3, 1, 100, true).tileSizeX(0));
    321321    EXPECT_EQ(0, TilingData(3, 1, 100, true).tilePositionX(0));
    322     EXPECT_EQ(3, TilingData(3, 3,   1, true).tileSizeX(0));
    323     EXPECT_EQ(0, TilingData(3, 3,   1, true).tilePositionX(0));
    324     EXPECT_EQ(3, TilingData(3, 3, 100, true).tileSizeX(0));
    325     EXPECT_EQ(0, TilingData(3, 3, 100, true).tilePositionX(0));
     322    EXPECT_EQ(3, TilingData(5, 3,   1, true).tileSizeX(0));
     323    EXPECT_EQ(0, TilingData(5, 3,   1, true).tilePositionX(0));
     324    EXPECT_EQ(3, TilingData(5, 3, 100, true).tileSizeX(0));
     325    EXPECT_EQ(0, TilingData(5, 3, 100, true).tilePositionX(0));
    326326
    327327    // Multiple tiles:
     
    341341    // with border
    342342    // positions 0, 2, 3, 4
    343     EXPECT_EQ(4, TilingData(3, 6,   1, true).numTiles());
    344     EXPECT_EQ(2, TilingData(3, 6,   1, true).tileSizeX(0));
    345     EXPECT_EQ(1, TilingData(3, 6,   1, true).tileSizeX(1));
    346     EXPECT_EQ(1, TilingData(3, 6,   1, true).tileSizeX(2));
    347     EXPECT_EQ(2, TilingData(3, 6,   1, true).tileSizeX(3));
    348     EXPECT_EQ(0, TilingData(3, 6,   1, true).tilePositionX(0));
    349     EXPECT_EQ(2, TilingData(3, 6,   1, true).tilePositionX(1));
    350     EXPECT_EQ(3, TilingData(3, 6,   1, true).tilePositionX(2));
    351     EXPECT_EQ(4, TilingData(3, 6,   1, true).tilePositionX(3));
    352     EXPECT_EQ(2, TilingData(3, 6, 100, true).tileSizeX(0));
    353     EXPECT_EQ(1, TilingData(3, 6, 100, true).tileSizeX(1));
    354     EXPECT_EQ(1, TilingData(3, 6, 100, true).tileSizeX(2));
    355     EXPECT_EQ(2, TilingData(3, 6, 100, true).tileSizeX(3));
    356     EXPECT_EQ(0, TilingData(3, 6, 100, true).tilePositionX(0));
    357     EXPECT_EQ(2, TilingData(3, 6, 100, true).tilePositionX(1));
    358     EXPECT_EQ(3, TilingData(3, 6, 100, true).tilePositionX(2));
    359     EXPECT_EQ(4, TilingData(3, 6, 100, true).tilePositionX(3));
     343    EXPECT_EQ(4, TilingData(3, 4,   1, true).numTiles());
     344    EXPECT_EQ(1, TilingData(3, 4,   1, true).tileSizeX(0));
     345    EXPECT_EQ(1, TilingData(3, 4,   1, true).tileSizeX(1));
     346    EXPECT_EQ(1, TilingData(3, 4,   1, true).tileSizeX(2));
     347    EXPECT_EQ(1, TilingData(3, 4,   1, true).tileSizeX(3));
     348    EXPECT_EQ(0, TilingData(3, 4,   1, true).tilePositionX(0));
     349    EXPECT_EQ(1, TilingData(3, 4,   1, true).tilePositionX(1));
     350    EXPECT_EQ(2, TilingData(3, 4,   1, true).tilePositionX(2));
     351    EXPECT_EQ(3, TilingData(3, 4,   1, true).tilePositionX(3));
     352    EXPECT_EQ(1, TilingData(3, 4, 100, true).tileSizeX(0));
     353    EXPECT_EQ(1, TilingData(3, 4, 100, true).tileSizeX(1));
     354    EXPECT_EQ(1, TilingData(3, 4, 100, true).tileSizeX(2));
     355    EXPECT_EQ(1, TilingData(3, 4, 100, true).tileSizeX(3));
     356    EXPECT_EQ(0, TilingData(3, 4, 100, true).tilePositionX(0));
     357    EXPECT_EQ(1, TilingData(3, 4, 100, true).tilePositionX(1));
     358    EXPECT_EQ(2, TilingData(3, 4, 100, true).tilePositionX(2));
     359    EXPECT_EQ(3, TilingData(3, 4, 100, true).tilePositionX(3));
    360360}
    361361
     
    375375    EXPECT_EQ(1, TilingData(3, 100, 1, true).tileSizeY(0));
    376376    EXPECT_EQ(0, TilingData(3, 100, 1, true).tilePositionY(0));
    377     EXPECT_EQ(3, TilingData(3,   1, 3, true).tileSizeY(0));
    378     EXPECT_EQ(0, TilingData(3,   1, 3, true).tilePositionY(0));
    379     EXPECT_EQ(3, TilingData(3, 100, 3, true).tileSizeY(0));
    380     EXPECT_EQ(0, TilingData(3, 100, 3, true).tilePositionY(0));
     377    EXPECT_EQ(3, TilingData(5,   1, 3, true).tileSizeY(0));
     378    EXPECT_EQ(0, TilingData(5,   1, 3, true).tilePositionY(0));
     379    EXPECT_EQ(3, TilingData(5, 100, 3, true).tileSizeY(0));
     380    EXPECT_EQ(0, TilingData(5, 100, 3, true).tilePositionY(0));
    381381
    382382    // Multiple tiles:
     
    396396    // with border
    397397    // positions 0, 2, 3, 4
    398     EXPECT_EQ(4, TilingData(3,   1, 6, true).numTiles());
    399     EXPECT_EQ(2, TilingData(3,   1, 6, true).tileSizeY(0));
    400     EXPECT_EQ(1, TilingData(3,   1, 6, true).tileSizeY(1));
    401     EXPECT_EQ(1, TilingData(3,   1, 6, true).tileSizeY(2));
    402     EXPECT_EQ(2, TilingData(3,   1, 6, true).tileSizeY(3));
    403     EXPECT_EQ(0, TilingData(3,   1, 6, true).tilePositionY(0));
    404     EXPECT_EQ(2, TilingData(3,   1, 6, true).tilePositionY(1));
    405     EXPECT_EQ(3, TilingData(3,   1, 6, true).tilePositionY(2));
    406     EXPECT_EQ(4, TilingData(3,   1, 6, true).tilePositionY(3));
    407     EXPECT_EQ(2, TilingData(3, 100, 6, true).tileSizeY(0));
    408     EXPECT_EQ(1, TilingData(3, 100, 6, true).tileSizeY(1));
    409     EXPECT_EQ(1, TilingData(3, 100, 6, true).tileSizeY(2));
    410     EXPECT_EQ(2, TilingData(3, 100, 6, true).tileSizeY(3));
    411     EXPECT_EQ(0, TilingData(3, 100, 6, true).tilePositionY(0));
    412     EXPECT_EQ(2, TilingData(3, 100, 6, true).tilePositionY(1));
    413     EXPECT_EQ(3, TilingData(3, 100, 6, true).tilePositionY(2));
    414     EXPECT_EQ(4, TilingData(3, 100, 6, true).tilePositionY(3));
     398    EXPECT_EQ(4, TilingData(3,   1, 4, true).numTiles());
     399    EXPECT_EQ(1, TilingData(3,   1, 4, true).tileSizeY(0));
     400    EXPECT_EQ(1, TilingData(3,   1, 4, true).tileSizeY(1));
     401    EXPECT_EQ(1, TilingData(3,   1, 4, true).tileSizeY(2));
     402    EXPECT_EQ(1, TilingData(3,   1, 4, true).tileSizeY(3));
     403    EXPECT_EQ(0, TilingData(3,   1, 4, true).tilePositionY(0));
     404    EXPECT_EQ(1, TilingData(3,   1, 4, true).tilePositionY(1));
     405    EXPECT_EQ(2, TilingData(3,   1, 4, true).tilePositionY(2));
     406    EXPECT_EQ(3, TilingData(3,   1, 4, true).tilePositionY(3));
     407    EXPECT_EQ(1, TilingData(3, 100, 4, true).tileSizeY(0));
     408    EXPECT_EQ(1, TilingData(3, 100, 4, true).tileSizeY(1));
     409    EXPECT_EQ(1, TilingData(3, 100, 4, true).tileSizeY(2));
     410    EXPECT_EQ(1, TilingData(3, 100, 4, true).tileSizeY(3));
     411    EXPECT_EQ(0, TilingData(3, 100, 4, true).tilePositionY(0));
     412    EXPECT_EQ(1, TilingData(3, 100, 4, true).tilePositionY(1));
     413    EXPECT_EQ(2, TilingData(3, 100, 4, true).tilePositionY(2));
     414    EXPECT_EQ(3, TilingData(3, 100, 4, true).tilePositionY(3));
    415415}
    416416
     
    469469TEST(TilingDataTest, setMaxTextureSizeBorders)
    470470{
    471     TilingData data(8, 16, 32, true);
     471    TilingData data(8, 16, 30, true);
    472472    EXPECT_EQ(3, data.numTilesX());
    473473    EXPECT_EQ(5, data.numTilesY());
     
    485485    data.setMaxTextureSize(5);
    486486    EXPECT_EQ(5, data.maxTextureSize());
    487     EXPECT_EQ(5, data.numTilesX());
     487    EXPECT_EQ(6, data.numTilesX());
    488488    EXPECT_EQ(10, data.numTilesY());
    489489}
Note: See TracChangeset for help on using the changeset viewer.