Changeset 92255 in webkit


Ignore:
Timestamp:
Aug 2, 2011 7:52:17 PM (13 years ago)
Author:
jamesr@google.com
Message:

Source/WebCore: [Chromium] Use edge-distance method for layer anti-aliasing.
https://bugs.webkit.org/show_bug.cgi?id=64942

Patch by David Reveman <reveman@chromium.org> on 2011-08-02
Reviewed by James Robinson.

Use an edge distance based method instead of the current linear
filtering method for producing anti-aliased edges on 3D transformed
layers. This removes the outer border handling from TilingData as
it's no longer needed for anti-aliasing.

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

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

  • platform/graphics/chromium/LayerRendererChromium.cpp:

(WebCore::screenMatrix):
(WebCore::LayerRendererChromium::drawLayers):
(WebCore::LayerRendererChromium::setDrawViewportRect):
(WebCore::LayerRendererChromium::tilerProgramAA):
(WebCore::LayerRendererChromium::tilerProgramSwizzleAA):

  • platform/graphics/chromium/LayerRendererChromium.h:

(WebCore::LayerRendererChromium::windowMatrix):

  • platform/graphics/chromium/LayerTilerChromium.cpp:

(WebCore::LayerTilerChromium::setTileSize):
(WebCore::LayerTilerChromium::tileLayerRect):
(WebCore::LayerTilerChromium::invalidateRect):
(WebCore::LayerTilerChromium::prepareToUpdate):
(WebCore::LayerTilerChromium::updateRect):
(WebCore::LayerTilerChromium::draw):
(WebCore::LayerTilerChromium::growLayerToContain):
(WebCore::LayerTilerChromium::drawTiles):

  • platform/graphics/chromium/LayerTilerChromium.h:
  • platform/graphics/chromium/ShaderChromium.cpp:

(WebCore::VertexShaderTile::VertexShaderTile):
(WebCore::VertexShaderTile::init):
(WebCore::VertexShaderTile::getShaderString):
(WebCore::FragmentTexAlphaAABinding::FragmentTexAlphaAABinding):
(WebCore::FragmentTexAlphaAABinding::init):
(WebCore::FragmentShaderRGBATexAlphaAA::getShaderString):
(WebCore::FragmentShaderRGBATexSwizzleAlphaAA::getShaderString):

  • platform/graphics/chromium/ShaderChromium.h:

(WebCore::VertexShaderTile::vertexTexTransformLocation):
(WebCore::FragmentTexAlphaAABinding::alphaLocation):
(WebCore::FragmentTexAlphaAABinding::samplerLocation):
(WebCore::FragmentTexAlphaAABinding::fragmentTexTransformLocation):
(WebCore::FragmentTexAlphaAABinding::edgeLocation):

  • platform/graphics/chromium/TiledLayerChromium.cpp:

(WebCore::TiledLayerChromium::TiledLayerChromium):
(WebCore::TiledLayerChromium::updateTileSizeAndTilingOption):
(WebCore::TiledLayerChromium::createTilerIfNeeded):
(WebCore::TiledLayerChromium::setIsMask):

  • platform/graphics/chromium/TiledLayerChromium.h:
  • platform/graphics/gpu/TilingData.cpp:

(WebCore::computeNumTiles):
(WebCore::TilingData::tileXIndexFromSrcCoord):
(WebCore::TilingData::tileYIndexFromSrcCoord):
(WebCore::TilingData::tileSizeX):
(WebCore::TilingData::tileSizeY):
(WebCore::TilingData::intersectDrawQuad):
(WebCore::TilingData::textureOffset):

  • platform/graphics/gpu/TilingData.h:

Source/WebKit/chromium: [Chromium] Remove outer border from TilingData as it's no longer needed by layer compositor for anti-aliasing.
https://bugs.webkit.org/show_bug.cgi?id=64942

Patch by David Reveman <reveman@chromium.org> on 2011-08-02
Reviewed by James Robinson.

  • tests/TilingDataTest.cpp:

(WebCore::TEST):

LayoutTests: [Chromium] Use edge-distance method for layer anti-aliasing.
https://bugs.webkit.org/show_bug.cgi?id=64942

Patch by David Reveman <reveman@chromium.org> on 2011-08-02
Reviewed by James Robinson.

Update expected results.

  • platform/chromium/test_expectations.txt:
Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r92235 r92255  
     12011-08-02  David Reveman  <reveman@chromium.org>
     2
     3        [Chromium] Use edge-distance method for layer anti-aliasing.
     4        https://bugs.webkit.org/show_bug.cgi?id=64942
     5
     6        Reviewed by James Robinson.
     7
     8        Update expected results.
     9
     10        * platform/chromium/test_expectations.txt:
     11
    1122011-08-02  Zhenyao Mo  <zmo@google.com>
    213
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r92235 r92255  
    27042704// 2 pixel stretching when rendering some videos with the GPU (Now it's flaky)
    27052705BUGCR74102 GPU LINUX : media/video-controls-rendering.html = IMAGE PASS
     2706
     2707BUGWK64942 : compositing/color-matching/image-color-matching.html = IMAGE
     2708BUGWK64942 : compositing/geometry/ancestor-overflow-change.html = IMAGE
     2709BUGWK64942 : compositing/geometry/fixed-position.html = IMAGE
     2710BUGWK64942 : compositing/geometry/layer-due-to-layer-children-deep.html = IMAGE
     2711BUGWK64942 : compositing/geometry/layer-due-to-layer-children.html = IMAGE
     2712BUGWK64942 : compositing/geometry/vertical-scroll-composited.html = IMAGE
     2713BUGWK64942 : compositing/overflow/fixed-position-ancestor-clip.html = IMAGE
     2714BUGWK64942 : compositing/reflections/nested-reflection-transition.html = IMAGE
     2715BUGWK64942 : compositing/reflections/transform-inside-reflection.html = IMAGE
     2716BUGWK64942 : compositing/shadows/shadow-drawing.html = IMAGE
     2717BUGWK64942 : compositing/transitions/scale-transition-no-start.html = IMAGE
     2718BUGWK64942 : media/video-transformed.html = IMAGE
     2719BUGWK64942 : media/video-zoom-controls.html  = IMAGE
     2720BUGWK64942 : platform/chromium/compositing/backface-visibility-transformed.html = IMAGE
     2721BUGWK64942 : platform/chromium/compositing/huge-layer-rotated.html = IMAGE
     2722BUGWK64942 : platform/chromium/compositing/perpendicular-layer-sorting.html = IMAGE
     2723BUGWK64942 : platform/chromium/compositing/tiny-layer-rotated.html = IMAGE
    27062724
    27072725
  • trunk/Source/WebCore/ChangeLog

    r92254 r92255  
     12011-08-02  David Reveman  <reveman@chromium.org>
     2
     3        [Chromium] Use edge-distance method for layer anti-aliasing.
     4        https://bugs.webkit.org/show_bug.cgi?id=64942
     5
     6        Reviewed by James Robinson.
     7
     8        Use an edge distance based method instead of the current linear
     9        filtering method for producing anti-aliased edges on 3D transformed
     10        layers. This removes the outer border handling from TilingData as
     11        it's no longer needed for anti-aliasing.
     12
     13        Tests: platform/chromium/compositing/tiny-layer-rotated.html (existing)
     14               platform/chromium/compositing/huge-layer-rotated.html (existing)
     15               compositing/images/content-image-change.html (existing)
     16               TilingDataTest in webkit_unit_tests
     17
     18        * platform/graphics/chromium/LayerRendererChromium.cpp:
     19        (WebCore::screenMatrix):
     20        (WebCore::LayerRendererChromium::drawLayers):
     21        (WebCore::LayerRendererChromium::setDrawViewportRect):
     22        (WebCore::LayerRendererChromium::tilerProgramAA):
     23        (WebCore::LayerRendererChromium::tilerProgramSwizzleAA):
     24        * platform/graphics/chromium/LayerRendererChromium.h:
     25        (WebCore::LayerRendererChromium::windowMatrix):
     26        * platform/graphics/chromium/LayerTilerChromium.cpp:
     27        (WebCore::LayerTilerChromium::setTileSize):
     28        (WebCore::LayerTilerChromium::tileLayerRect):
     29        (WebCore::LayerTilerChromium::invalidateRect):
     30        (WebCore::LayerTilerChromium::prepareToUpdate):
     31        (WebCore::LayerTilerChromium::updateRect):
     32        (WebCore::LayerTilerChromium::draw):
     33        (WebCore::LayerTilerChromium::growLayerToContain):
     34        (WebCore::LayerTilerChromium::drawTiles):
     35        * platform/graphics/chromium/LayerTilerChromium.h:
     36        * platform/graphics/chromium/ShaderChromium.cpp:
     37        (WebCore::VertexShaderTile::VertexShaderTile):
     38        (WebCore::VertexShaderTile::init):
     39        (WebCore::VertexShaderTile::getShaderString):
     40        (WebCore::FragmentTexAlphaAABinding::FragmentTexAlphaAABinding):
     41        (WebCore::FragmentTexAlphaAABinding::init):
     42        (WebCore::FragmentShaderRGBATexAlphaAA::getShaderString):
     43        (WebCore::FragmentShaderRGBATexSwizzleAlphaAA::getShaderString):
     44        * platform/graphics/chromium/ShaderChromium.h:
     45        (WebCore::VertexShaderTile::vertexTexTransformLocation):
     46        (WebCore::FragmentTexAlphaAABinding::alphaLocation):
     47        (WebCore::FragmentTexAlphaAABinding::samplerLocation):
     48        (WebCore::FragmentTexAlphaAABinding::fragmentTexTransformLocation):
     49        (WebCore::FragmentTexAlphaAABinding::edgeLocation):
     50        * platform/graphics/chromium/TiledLayerChromium.cpp:
     51        (WebCore::TiledLayerChromium::TiledLayerChromium):
     52        (WebCore::TiledLayerChromium::updateTileSizeAndTilingOption):
     53        (WebCore::TiledLayerChromium::createTilerIfNeeded):
     54        (WebCore::TiledLayerChromium::setIsMask):
     55        * platform/graphics/chromium/TiledLayerChromium.h:
     56        * platform/graphics/gpu/TilingData.cpp:
     57        (WebCore::computeNumTiles):
     58        (WebCore::TilingData::tileXIndexFromSrcCoord):
     59        (WebCore::TilingData::tileYIndexFromSrcCoord):
     60        (WebCore::TilingData::tileSizeX):
     61        (WebCore::TilingData::tileSizeY):
     62        (WebCore::TilingData::intersectDrawQuad):
     63        (WebCore::TilingData::textureOffset):
     64        * platform/graphics/gpu/TilingData.h:
     65
    1662011-08-01  David Levin  <levin@chromium.org>
    267
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp

    r92245 r92255  
    406406}
    407407
     408static TransformationMatrix screenMatrix(int x, int y, int width, int height)
     409{
     410    TransformationMatrix screen;
     411
     412    // Map to viewport.
     413    screen.translate3d(x, y, 0);
     414    screen.scale3d(width, height, 0);
     415
     416    // Map x, y and z to unit square.
     417    screen.translate3d(0.5, 0.5, 0.5);
     418    screen.scale3d(0.5, 0.5, 0.5);
     419
     420    return screen;
     421}
     422
    408423PassRefPtr<LayerRendererChromium> LayerRendererChromium::create(CCLayerTreeHostClient* client, PassOwnPtr<LayerPainterChromium> contentPaint, bool accelerateDrawing)
    409424{
     
    777792    // The GL viewport covers the entire visible area, including the scrollbars.
    778793    GLC(m_context.get(), m_context->viewport(0, 0, m_viewportVisibleRect.width(), m_viewportVisibleRect.height()));
     794    m_windowMatrix = screenMatrix(0, 0, m_viewportVisibleRect.width(), m_viewportVisibleRect.height());
    779795
    780796    // Bind the common vertex attributes used for drawing all the layers.
     
    11561172        m_projectionMatrix = orthoMatrix(drawRect.x(), drawRect.maxX(), drawRect.y(), drawRect.maxY());
    11571173    GLC(m_context.get(), m_context->viewport(0, 0, drawRect.width(), drawRect.height()));
     1174    m_windowMatrix = screenMatrix(0, 0, drawRect.width(), drawRect.height());
    11581175}
    11591176
     
    12461263    }
    12471264    return m_tilerProgramSwizzle.get();
     1265}
     1266
     1267const LayerTilerChromium::ProgramAA* LayerRendererChromium::tilerProgramAA()
     1268{
     1269    if (!m_tilerProgramAA)
     1270        m_tilerProgramAA = adoptPtr(new LayerTilerChromium::ProgramAA(m_context.get()));
     1271    if (!m_tilerProgramAA->initialized()) {
     1272        TRACE_EVENT("LayerRendererChromium::tilerProgramAA::initialize", this, 0);
     1273        m_tilerProgramAA->initialize();
     1274    }
     1275    return m_tilerProgramAA.get();
     1276}
     1277
     1278const LayerTilerChromium::ProgramSwizzleAA* LayerRendererChromium::tilerProgramSwizzleAA()
     1279{
     1280    if (!m_tilerProgramSwizzleAA)
     1281        m_tilerProgramSwizzleAA = adoptPtr(new LayerTilerChromium::ProgramSwizzleAA(m_context.get()));
     1282    if (!m_tilerProgramSwizzleAA->initialized()) {
     1283        TRACE_EVENT("LayerRendererChromium::tilerProgramSwizzleAA::initialize", this, 0);
     1284        m_tilerProgramSwizzleAA->initialize();
     1285    }
     1286    return m_tilerProgramSwizzleAA.get();
    12481287}
    12491288
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h

    r92245 r92255  
    122122
    123123    const TransformationMatrix& projectionMatrix() const { return m_projectionMatrix; }
     124    const TransformationMatrix& windowMatrix() const { return m_windowMatrix; }
    124125
    125126    bool checkTextureSize(const IntSize&);
     
    133134    const LayerTilerChromium::Program* tilerProgram();
    134135    const LayerTilerChromium::ProgramSwizzle* tilerProgramSwizzle();
     136    const LayerTilerChromium::ProgramAA* tilerProgramAA();
     137    const LayerTilerChromium::ProgramSwizzleAA* tilerProgramSwizzleAA();
    135138    const CCCanvasLayerImpl::Program* canvasLayerProgram();
    136139    const CCPluginLayerImpl::Program* pluginLayerProgram();
     
    210213
    211214    TransformationMatrix m_projectionMatrix;
     215    TransformationMatrix m_windowMatrix;
    212216
    213217    RefPtr<LayerChromium> m_rootLayer;
     
    236240    OwnPtr<LayerTilerChromium::Program> m_tilerProgram;
    237241    OwnPtr<LayerTilerChromium::ProgramSwizzle> m_tilerProgramSwizzle;
     242    OwnPtr<LayerTilerChromium::ProgramAA> m_tilerProgramAA;
     243    OwnPtr<LayerTilerChromium::ProgramSwizzleAA> m_tilerProgramSwizzleAA;
    238244    OwnPtr<CCCanvasLayerImpl::Program> m_canvasLayerProgram;
    239245    OwnPtr<CCPluginLayerImpl::Program> m_pluginLayerProgram;
  • trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp

    r91629 r92255  
    8585
    8686    m_tileSize = size;
     87    m_tilingData.setMaxTextureSize(max(size.width(), size.height()));
    8788}
    8889
     
    190191{
    191192    const int index = m_tilingData.tileIndex(tile->i(), tile->j());
    192     return m_tilingData.tileBoundsWithBorder(index);
    193 }
    194 
    195 IntRect LayerTilerChromium::tileTexRect(const Tile* tile) const
    196 {
    197     const int index = m_tilingData.tileIndex(tile->i(), tile->j());
    198     return m_tilingData.tileBoundsWithOuterBorder(index);
     193    IntRect layerRect = m_tilingData.tileBoundsWithBorder(index);
     194    layerRect.setSize(m_tileSize);
     195    return layerRect;
    199196}
    200197
     
    203200    if (contentRect.isEmpty() || m_skipsDraw)
    204201        return;
    205 
    206     IntSize oldLayerSize(m_tilingData.totalSizeX(), m_tilingData.totalSizeY());
    207     const IntRect oldLayerRect = IntRect(IntPoint(), oldLayerSize);
    208202
    209203    growLayerToContain(contentRect);
     
    223217            bound.intersect(layerRect);
    224218            tile->m_dirtyLayerRect.unite(bound);
    225 
    226             // Invalidate old layer area to clear any contents left from
    227             // previous layer size.
    228             IntRect oldBound = tileLayerRect(tile);
    229             oldBound.intersect(oldLayerRect);
    230             tile->m_dirtyLayerRect.unite(oldBound);
    231219        }
    232220    }
     
    285273    // the dirty regions currently being drawn.
    286274    IntRect dirtyLayerRect;
    287     IntSize tileSize;
    288275    int left, top, right, bottom;
    289276    contentRectToTileIndices(contentRect, left, top, right, bottom);
     
    294281                tile = createTile(i, j);
    295282
    296             IntSize texSize = tileTexRect(tile).size();
    297             if (!tile->texture()->isValid(texSize, m_textureFormat))
     283            if (!tile->texture()->isValid(m_tileSize, m_textureFormat))
    298284                tile->m_dirtyLayerRect = tileLayerRect(tile);
    299285
    300             if (!tile->texture()->reserve(texSize, m_textureFormat)) {
     286            if (!tile->texture()->reserve(m_tileSize, m_textureFormat)) {
    301287                m_skipsDraw = true;
    302288                reset();
     
    305291
    306292            dirtyLayerRect.unite(tile->m_dirtyLayerRect);
    307 
    308             tileSize = tileSize.expandedTo(texSize);
    309293        }
    310294    }
     
    319303        return;
    320304
    321     textureUpdater->prepareToUpdate(m_paintRect, tileSize, m_tilingData.borderTexels());
     305    textureUpdater->prepareToUpdate(m_paintRect, m_tileSize, m_tilingData.borderTexels());
    322306}
    323307
     
    344328            // Calculate page-space rectangle to copy from.
    345329            IntRect sourceRect = tileContentRect(tile);
    346             IntRect texRect = tileTexRect(tile);
    347             const IntPoint anchor = texRect.location();
     330            const IntPoint anchor = sourceRect.location();
    348331            sourceRect.intersect(layerRectToContentRect(tile->m_dirtyLayerRect));
    349332            // Paint rect not guaranteed to line up on tile boundaries, so
     
    395378        return;
    396379
     380    // Use anti-aliasing programs when border texels are preset and transform
     381    // is not an integer translation.
     382    bool useAA = (m_tilingData.borderTexels() && !globalTransform.isIntegerTranslation());
     383
    397384    switch (m_sampledTexelFormat) {
    398385    case LayerTextureUpdater::SampledTexelFormatRGBA:
    399         drawTiles(contentRect, globalTransform, opacity, layerRenderer()->tilerProgram());
     386        if (useAA)
     387            drawTiles(contentRect, globalTransform, opacity, layerRenderer()->tilerProgramAA(), layerRenderer()->tilerProgramAA()->fragmentShader().fragmentTexTransformLocation(), layerRenderer()->tilerProgramAA()->fragmentShader().edgeLocation());
     388        else
     389            drawTiles(contentRect, globalTransform, opacity, layerRenderer()->tilerProgram(), -1, -1);
    400390        break;
    401391    case LayerTextureUpdater::SampledTexelFormatBGRA:
    402         drawTiles(contentRect, globalTransform, opacity, layerRenderer()->tilerProgramSwizzle());
     392        if (useAA)
     393            drawTiles(contentRect, globalTransform, opacity, layerRenderer()->tilerProgramSwizzleAA(), layerRenderer()->tilerProgramSwizzleAA()->fragmentShader().fragmentTexTransformLocation(), layerRenderer()->tilerProgramSwizzleAA()->fragmentShader().edgeLocation());
     394        else
     395            drawTiles(contentRect, globalTransform, opacity, layerRenderer()->tilerProgramSwizzle(), -1, -1);
    403396        break;
    404397    default:
     
    412405    IntRect layerRect = contentRectToLayerRect(contentRect);
    413406    IntSize rectSize = IntSize(layerRect.maxX(), layerRect.maxY());
    414     IntSize texSize = m_tileSize;
    415 
    416     // Use rect with border texels as max texture size when tile size
    417     // has not been specified.
    418     if (texSize.isEmpty()) {
    419         texSize = rectSize;
    420         if (m_tilingData.borderTexels())
    421             texSize.expand(2, 2);
    422     }
    423 
    424     m_tilingData.setMaxTextureSize(max(texSize.width(), texSize.height()));
     407
    425408    IntSize oldLayerSize(m_tilingData.totalSizeX(), m_tilingData.totalSizeY());
    426409    IntSize newSize = rectSize.expandedTo(oldLayerSize);
     
    458441
    459442template <class T>
    460 void LayerTilerChromium::drawTiles(const IntRect& contentRect, const TransformationMatrix& globalTransform, float opacity, const T* program)
    461 {
    462     GraphicsContext3D* context = layerRendererContext();
    463     GLC(context, context->useProgram(program->program()));
    464     GLC(context, context->uniform1i(program->fragmentShader().samplerLocation(), 0));
    465     GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
    466 
    467     TransformationMatrix matrix(globalTransform);
     443void LayerTilerChromium::drawTiles(const IntRect& contentRect, const TransformationMatrix& globalTransform, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation)
     444{
     445    TransformationMatrix matrix(layerRenderer()->windowMatrix() * layerRenderer()->projectionMatrix() * globalTransform);
    468446
    469447    // We don't care about Z component.
     
    479457
    480458    TransformationMatrix inverse = matrixXYW.inverse();
    481     IntRect bounds(m_layerPosition, IntSize(m_tilingData.totalSizeX(),
    482                                             m_tilingData.totalSizeY()));
    483 
    484     // Include outer border texels in bounds.
    485     bounds.inflate(m_tilingData.borderTexels());
    486 
    487     // Map bounds to device space.
    488     FloatQuad boundsQuad = matrix.mapQuad(FloatQuad(bounds));
     459
     460    GraphicsContext3D* context = layerRendererContext();
     461    GLC(context, context->useProgram(program->program()));
     462    GLC(context, context->uniform1i(program->fragmentShader().samplerLocation(), 0));
     463    GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
     464
     465    // Map content rectangle to device space.
     466    FloatQuad deviceQuad = matrix.mapQuad(FloatQuad(contentRect));
    489467
    490468    // Counter-clockwise?
    491     float sign = isCCW(boundsQuad) ? -1 : 1;
     469    float sign = isCCW(deviceQuad) ? -1 : 1;
    492470
    493471    // Compute outer edges.
    494     Edge leftEdge = computeEdge(boundsQuad.p4(), boundsQuad.p1(), sign);
    495     Edge rightEdge = computeEdge(boundsQuad.p2(), boundsQuad.p3(), sign);
    496     Edge topEdge = computeEdge(boundsQuad.p1(), boundsQuad.p2(), sign);
    497     Edge bottomEdge = computeEdge(boundsQuad.p3(), boundsQuad.p4(), sign);
    498 
    499     // Move outer edges to ensure that all partially covered pixels are
    500     // processed.
    501     float zDistance = m_tilingData.borderTexels() * 0.5f;
    502     leftEdge.move(0, 0, zDistance);
    503     rightEdge.move(0, 0, zDistance);
    504     topEdge.move(0, 0, zDistance);
    505     bottomEdge.move(0, 0, zDistance);
    506 
    507     GC3Dint filter = (m_tilingData.borderTexels() && !matrix.isIntegerTranslation()) ? GraphicsContext3D::LINEAR : GraphicsContext3D::NEAREST;
     472    Edge leftEdge = computeEdge(deviceQuad.p4(), deviceQuad.p1(), sign);
     473    Edge rightEdge = computeEdge(deviceQuad.p2(), deviceQuad.p3(), sign);
     474    Edge topEdge = computeEdge(deviceQuad.p1(), deviceQuad.p2(), sign);
     475    Edge bottomEdge = computeEdge(deviceQuad.p3(), deviceQuad.p4(), sign);
     476
     477    if (edgeLocation != -1) {
     478        // Move outer edges to ensure that all partially covered pixels are
     479        // processed.
     480        leftEdge.move(0, 0, 0.5f);
     481        rightEdge.move(0, 0, 0.5f);
     482        topEdge.move(0, 0, 0.5f);
     483        bottomEdge.move(0, 0, 0.5f);
     484
     485        float edge[12];
     486        edge[0] = leftEdge.x();
     487        edge[1] = leftEdge.y();
     488        edge[2] = leftEdge.z();
     489        edge[3] = topEdge.x();
     490        edge[4] = topEdge.y();
     491        edge[5] = topEdge.z();
     492        edge[6] = rightEdge.x();
     493        edge[7] = rightEdge.y();
     494        edge[8] = rightEdge.z();
     495        edge[9] = bottomEdge.x();
     496        edge[10] = bottomEdge.y();
     497        edge[11] = bottomEdge.z();
     498        GLC(context, context->uniform3fv(edgeLocation, edge, 4));
     499    }
    508500
    509501    Edge prevEdgeY = topEdge;
     
    511503    int left, top, right, bottom;
    512504    contentRectToTileIndices(contentRect, left, top, right, bottom);
     505    IntRect layerRect = contentRectToLayerRect(contentRect);
    513506    for (int j = top; j <= bottom; ++j) {
    514507        Edge prevEdgeX = leftEdge;
     
    516509        Edge edgeY = bottomEdge;
    517510        if (j < (m_tilingData.numTilesY() - 1)) {
    518             IntRect tileRect = m_tilingData.tileBounds(m_tilingData.tileIndex(0, j));
     511            IntRect tileRect = unionRect(m_tilingData.tileBounds(m_tilingData.tileIndex(0, j)), m_tilingData.tileBounds(m_tilingData.tileIndex(m_tilingData.numTilesX() - 1, j)));
     512            tileRect.intersect(layerRect);
     513
     514            // Skip empty rows.
     515            if (tileRect.isEmpty())
     516                continue;
     517
    519518            tileRect.move(m_layerPosition.x(), m_layerPosition.y());
    520519
     
    538537
    539538            tile->texture()->bindTexture();
    540             GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, filter));
    541             GLC(context, context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, filter));
    542539
    543540            // Don't use tileContentRect here, as that contains the full
    544541            // rect with border texels which shouldn't be drawn.
    545542            IntRect tileRect = m_tilingData.tileBounds(m_tilingData.tileIndex(tile->i(), tile->j()));
     543            IntRect displayRect = tileRect;
     544            tileRect.intersect(layerRect);
     545
     546            // Keep track of how the top left has moved, so the texture can be
     547            // offset the same amount.
     548            IntSize displayOffset = tileRect.minXMinYCorner() - displayRect.minXMinYCorner();
     549
     550            // Skip empty tiles.
     551            if (tileRect.isEmpty())
     552                continue;
     553
    546554            tileRect.move(m_layerPosition.x(), m_layerPosition.y());
    547555
    548             IntPoint texOffset = m_tilingData.textureOffset();
    549             IntRect texRect = tileTexRect(tile);
    550             float tileWidth = static_cast<float>(texRect.width());
    551             float tileHeight = static_cast<float>(texRect.height());
    552             float texTranslateX = (texOffset.x() - tileRect.x()) / tileWidth;
    553             float texTranslateY = (texOffset.y() - tileRect.y()) / tileHeight;
    554             float texScaleX = tileRect.width() / tileWidth;
    555             float texScaleY = tileRect.height() / tileHeight;
     556            FloatRect clampRect(tileRect);
     557            // Clamp texture coordinates to avoid sampling outside the layer
     558            // by deflating the tile region half a texel or half a texel
     559            // minus epsilon for one pixel layers. The resulting clamp region
     560            // is mapped to the unit square by the vertex shader and mapped
     561            // back to normalized texture coordinates by the fragment shader
     562            // after being clamped to 0-1 range.
     563            const float epsilon = 1 / 1024.0f;
     564            float clampX = min(0.5, clampRect.width() / 2.0 - epsilon);
     565            float clampY = min(0.5, clampRect.height() / 2.0 - epsilon);
     566            clampRect.inflateX(-clampX);
     567            clampRect.inflateY(-clampY);
     568            FloatSize clampOffset = clampRect.minXMinYCorner() - FloatRect(tileRect).minXMinYCorner();
     569
     570            FloatPoint texOffset = m_tilingData.textureOffset(tile->i(), tile->j()) + clampOffset + FloatSize(displayOffset);
     571            float tileWidth = static_cast<float>(m_tileSize.width());
     572            float tileHeight = static_cast<float>(m_tileSize.height());
     573
     574            // Map clamping rectangle to unit square.
     575            float vertexTexTranslateX = -clampRect.x() / clampRect.width();
     576            float vertexTexTranslateY = -clampRect.y() / clampRect.height();
     577            float vertexTexScaleX = tileRect.width() / clampRect.width();
     578            float vertexTexScaleY = tileRect.height() / clampRect.height();
     579
     580            // Map to normalized texture coordinates.
     581            float fragmentTexTranslateX = texOffset.x() / tileWidth;
     582            float fragmentTexTranslateY = texOffset.y() / tileHeight;
     583            float fragmentTexScaleX = clampRect.width() / tileWidth;
     584            float fragmentTexScaleY = clampRect.height() / tileHeight;
     585
    556586            // OpenGL coordinate system is bottom-up.
    557587            // If tile texture is top-down, we need to flip the texture coordinates.
    558588            if (m_textureOrientation == LayerTextureUpdater::TopDownOrientation) {
    559                 texTranslateY = 1.0 - texTranslateY;
    560                 texScaleY *= -1.0;
     589                fragmentTexTranslateY = 1.0 - fragmentTexTranslateY;
     590                fragmentTexScaleY *= -1.0;
    561591            }
    562592
     
    586616            quad.scale(1.0f / tileRect.width(), 1.0f / tileRect.height());
    587617
    588             drawTexturedQuad(context, quad, layerRenderer()->projectionMatrix(), matrix, tileRect.width(), tileRect.height(), opacity, texTranslateX, texTranslateY, texScaleX, texScaleY, program);
     618            if (fragmentTexTransformLocation == -1) {
     619                // Move fragment shader transform to vertex shader. We can do
     620                // this while still producing correct results as
     621                // fragmentTexTransformLocation should always be non-negative
     622                // when tiles are transformed in a way that could result in
     623                // sampling outside the layer.
     624                vertexTexScaleX *= fragmentTexScaleX;
     625                vertexTexScaleY *= fragmentTexScaleY;
     626                vertexTexTranslateX *= fragmentTexScaleX;
     627                vertexTexTranslateY *= fragmentTexScaleY;
     628                vertexTexTranslateX += fragmentTexTranslateX;
     629                vertexTexTranslateY += fragmentTexTranslateY;
     630            } else
     631                GLC(context, context->uniform4f(fragmentTexTransformLocation, fragmentTexTranslateX, fragmentTexTranslateY, fragmentTexScaleX, fragmentTexScaleY));
     632
     633            GLC(context, context->uniform4f(program->vertexShader().vertexTexTransformLocation(), vertexTexTranslateX, vertexTexTranslateY, vertexTexScaleX, vertexTexScaleY));
     634
     635            float point[8];
     636            point[0] = quad.p1().x();
     637            point[1] = quad.p1().y();
     638            point[2] = quad.p2().x();
     639            point[3] = quad.p2().y();
     640            point[4] = quad.p3().x();
     641            point[5] = quad.p3().y();
     642            point[6] = quad.p4().x();
     643            point[7] = quad.p4().y();
     644            GLC(context, context->uniform2fv(program->vertexShader().pointLocation(), point, 4));
     645
     646            LayerChromium::drawTexturedQuad(context, layerRenderer()->projectionMatrix(), globalTransform,
     647                                            tileRect.width(), tileRect.height(), opacity,
     648                                            program->vertexShader().matrixLocation(),
     649                                            program->fragmentShader().alphaLocation());
    589650
    590651            prevEdgeX = edgeX;
     652            // Reverse direction.
     653            prevEdgeX.scale(-1, -1, -1);
    591654        }
    592655
    593656        prevEdgeY = edgeY;
    594     }
    595 }
    596 
    597 template <class T>
    598 void LayerTilerChromium::drawTexturedQuad(GraphicsContext3D* context, const FloatQuad& quad, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
    599                                           float width, float height, float opacity,
    600                                           float texTranslateX, float texTranslateY,
    601                                           float texScaleX, float texScaleY,
    602                                           const T* program)
    603 {
    604     static float glMatrix[16];
    605 
    606     TransformationMatrix renderMatrix = drawMatrix;
    607 
    608     // Apply a scaling factor to size the quad from 1x1 to its intended size.
    609     renderMatrix.scale3d(width, height, 1);
    610 
    611     // Apply the projection matrix before sending the transform over to the shader.
    612     LayerChromium::toGLMatrix(&glMatrix[0], projectionMatrix * renderMatrix);
    613 
    614     GLC(context, context->uniformMatrix4fv(program->vertexShader().matrixLocation(), false, &glMatrix[0], 1));
    615 
    616     GLC(context, context->uniform1f(program->fragmentShader().alphaLocation(), opacity));
    617 
    618     GLC(context, context->uniform4f(program->vertexShader().texTransformLocation(),
    619         texTranslateX, texTranslateY, texScaleX, texScaleY));
    620 
    621     float point[8];
    622     point[0] = quad.p1().x();
    623     point[1] = quad.p1().y();
    624     point[2] = quad.p2().x();
    625     point[3] = quad.p2().y();
    626     point[4] = quad.p3().x();
    627     point[5] = quad.p3().y();
    628     point[6] = quad.p4().x();
    629     point[7] = quad.p4().y();
    630     GLC(context, context->uniform2fv(program->vertexShader().pointLocation(), point, 4));
    631 
    632     GLC(context, context->drawElements(GraphicsContext3D::TRIANGLES, 6, GraphicsContext3D::UNSIGNED_SHORT, 0));
     657        // Reverse direction.
     658        prevEdgeY.scale(-1, -1, -1);
     659    }
    633660}
    634661
  • trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.h

    r91720 r92255  
    7676    void protectTileTextures(const IntRect& contentRect);
    7777
    78     typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexAlpha> Program;
     78    typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> Program;
    7979    // Shader program that swaps red and blue components of texture.
    8080    // Used when texture format does not match native color format.
    81     typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexSwizzleAlpha> ProgramSwizzle;
     81    typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlpha> ProgramSwizzle;
     82
     83    // Shader program that produces anti-aliased layer edges.
     84    typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlphaAA> ProgramAA;
     85    typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlphaAA> ProgramSwizzleAA;
    8286
    8387    // If this tiler has exactly one tile, return its texture. Otherwise, null.
     
    111115    // Draw all tiles that intersect with contentRect.
    112116    template <class T>
    113     void drawTiles(const IntRect& contentRect, const TransformationMatrix&, float opacity, const T* program);
    114 
    115     template <class T>
    116     void drawTexturedQuad(GraphicsContext3D*, const FloatQuad&, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
    117                           float width, float height, float opacity,
    118                           float texTranslateX, float texTranslateY,
    119                           float texScaleX, float texScaleY,
    120                           const T* program);
     117    void drawTiles(const IntRect& contentRect, const TransformationMatrix&, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation);
    121118
    122119    // Grow layer size to contain this rectangle.
     
    136133    IntRect tileContentRect(const Tile*) const;
    137134    IntRect tileLayerRect(const Tile*) const;
    138     IntRect tileTexRect(const Tile*) const;
    139135
    140136    GC3Denum m_textureFormat;
  • trunk/Source/WebCore/platform/graphics/chromium/ShaderChromium.cpp

    r91720 r92255  
    151151}
    152152
    153 VertexShaderQuad::VertexShaderQuad()
     153VertexShaderTile::VertexShaderTile()
    154154    : m_matrixLocation(-1)
    155     , m_texTransformLocation(-1)
    156155    , m_pointLocation(-1)
    157 {
    158 }
    159 
    160 void VertexShaderQuad::init(GraphicsContext3D* context, unsigned program)
     156    , m_vertexTexTransformLocation(-1)
     157{
     158}
     159
     160void VertexShaderTile::init(GraphicsContext3D* context, unsigned program)
    161161{
    162162    m_matrixLocation = context->getUniformLocation(program, "matrix");
    163     m_texTransformLocation = context->getUniformLocation(program, "texTransform");
    164163    m_pointLocation = context->getUniformLocation(program, "point");
    165     ASSERT(m_matrixLocation != -1 && m_texTransformLocation != -1 && m_pointLocation != -1);
    166 }
    167 
    168 String VertexShaderQuad::getShaderString() const
     164    m_vertexTexTransformLocation = context->getUniformLocation(program, "vertexTexTransform");
     165    ASSERT(m_matrixLocation != -1 && m_pointLocation != -1 && m_vertexTexTransformLocation != -1);
     166}
     167
     168String VertexShaderTile::getShaderString() const
    169169{
    170170    return SHADER(
     
    172172        attribute vec2 a_texCoord;
    173173        uniform mat4 matrix;
    174         uniform vec4 texTransform;
    175174        uniform vec2 point[4];
     175        uniform vec4 vertexTexTransform;
    176176        varying vec2 v_texCoord;
    177177        void main()
     
    184184            pos.xy += (complement.x * a_texCoord.y) * point[3];
    185185            gl_Position = matrix * pos;
    186             v_texCoord = pos.xy * texTransform.zw + texTransform.xy;
     186            v_texCoord = pos.xy * vertexTexTransform.zw + vertexTexTransform.xy;
    187187        }
    188188    );
     
    244244            vec4 texColor = texture2D(s_texture, v_texCoord);
    245245            gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha;
     246        }
     247    );
     248}
     249
     250FragmentTexAlphaAABinding::FragmentTexAlphaAABinding()
     251    : m_samplerLocation(-1)
     252    , m_alphaLocation(-1)
     253    , m_fragmentTexTransformLocation(-1)
     254    , m_edgeLocation(-1)
     255{
     256}
     257
     258void FragmentTexAlphaAABinding::init(GraphicsContext3D* context, unsigned program)
     259{
     260    m_samplerLocation = context->getUniformLocation(program, "s_texture");
     261    m_alphaLocation = context->getUniformLocation(program, "alpha");
     262    m_fragmentTexTransformLocation = context->getUniformLocation(program, "fragmentTexTransform");
     263    m_edgeLocation = context->getUniformLocation(program, "edge");
     264
     265    ASSERT(m_samplerLocation != -1 && m_alphaLocation != -1 && m_fragmentTexTransformLocation != -1 && m_edgeLocation != -1);
     266}
     267
     268String FragmentShaderRGBATexAlphaAA::getShaderString() const
     269{
     270    return SHADER(
     271        precision mediump float;
     272        varying vec2 v_texCoord;
     273        uniform sampler2D s_texture;
     274        uniform float alpha;
     275        uniform vec4 fragmentTexTransform;
     276        uniform vec3 edge[4];
     277        void main()
     278        {
     279            vec2 texCoord = clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw + fragmentTexTransform.xy;
     280            vec4 texColor = texture2D(s_texture, texCoord);
     281            vec3 pos = vec3(gl_FragCoord.xy, 1);
     282            float a0 = clamp(dot(edge[0], pos), 0.0, 1.0);
     283            float a1 = clamp(dot(edge[1], pos), 0.0, 1.0);
     284            float a2 = clamp(dot(edge[2], pos), 0.0, 1.0);
     285            float a3 = clamp(dot(edge[3], pos), 0.0, 1.0);
     286            gl_FragColor = texColor * alpha * min(a0, a2) * min(a1, a3);
     287        }
     288    );
     289}
     290
     291String FragmentShaderRGBATexSwizzleAlphaAA::getShaderString() const
     292{
     293    return SHADER(
     294        precision mediump float;
     295        varying vec2 v_texCoord;
     296        uniform sampler2D s_texture;
     297        uniform float alpha;
     298        uniform vec4 fragmentTexTransform;
     299        uniform vec3 edge[4];
     300        void main()
     301        {
     302            vec2 texCoord = clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw + fragmentTexTransform.xy;
     303            vec4 texColor = texture2D(s_texture, texCoord);
     304            vec3 pos = vec3(gl_FragCoord.xy, 1);
     305            float a0 = clamp(dot(edge[0], pos), 0.0, 1.0);
     306            float a1 = clamp(dot(edge[1], pos), 0.0, 1.0);
     307            float a2 = clamp(dot(edge[2], pos), 0.0, 1.0);
     308            float a3 = clamp(dot(edge[3], pos), 0.0, 1.0);
     309            gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * min(a0, a2) * min(a1, a3);
    246310        }
    247311    );
  • trunk/Source/WebCore/platform/graphics/chromium/ShaderChromium.h

    r91720 r92255  
    9797};
    9898
    99 class VertexShaderQuad {
    100 public:
    101     VertexShaderQuad();
    102 
    103     void init(GraphicsContext3D*, unsigned program);
    104     String getShaderString() const;
    105 
    106     int matrixLocation() const { return m_matrixLocation; }
    107     int texTransformLocation() const { return m_texTransformLocation; }
     99class VertexShaderTile {
     100public:
     101    VertexShaderTile();
     102
     103    void init(GraphicsContext3D*, unsigned program);
     104    String getShaderString() const;
     105
     106    int matrixLocation() const { return m_matrixLocation; }
    108107    int pointLocation() const { return m_pointLocation; }
    109 
    110 private:
    111     int m_matrixLocation;
    112     int m_texTransformLocation;
     108    int vertexTexTransformLocation() const { return m_vertexTexTransformLocation; }
     109
     110private:
     111    int m_matrixLocation;
    113112    int m_pointLocation;
     113    int m_vertexTexTransformLocation;
    114114};
    115115
     
    139139// Swizzles the red and blue component of sampled texel.
    140140class FragmentShaderRGBATexSwizzleAlpha : public FragmentTexAlphaBinding {
     141public:
     142    String getShaderString() const;
     143};
     144
     145class FragmentTexAlphaAABinding {
     146public:
     147    FragmentTexAlphaAABinding();
     148
     149    void init(GraphicsContext3D*, unsigned program);
     150    int alphaLocation() const { return m_alphaLocation; }
     151    int samplerLocation() const { return m_samplerLocation; }
     152    int fragmentTexTransformLocation() const { return m_fragmentTexTransformLocation; }
     153    int edgeLocation() const { return m_edgeLocation; }
     154
     155private:
     156    int m_samplerLocation;
     157    int m_alphaLocation;
     158    int m_fragmentTexTransformLocation;
     159    int m_edgeLocation;
     160};
     161
     162class FragmentShaderRGBATexAlphaAA : public FragmentTexAlphaAABinding {
     163public:
     164    String getShaderString() const;
     165};
     166
     167// Swizzles the red and blue component of sampled texel.
     168class FragmentShaderRGBATexSwizzleAlphaAA : public FragmentTexAlphaAABinding {
    141169public:
    142170    String getShaderString() const;
  • trunk/Source/WebCore/platform/graphics/chromium/TiledLayerChromium.cpp

    r92245 r92255  
    3939
    4040// Start tiling when the width and height of a layer are larger than this size.
    41 static int maxUntiledSize = 510;
     41static int maxUntiledSize = 512;
    4242
    4343// When tiling is enabled, use tiles of this dimension squared.
     
    5151    : LayerChromium(owner)
    5252    , m_tilingOption(AutoTile)
    53     , m_borderTexels(true)
    5453{
    5554}
     
    8180        return;
    8281
    83     const IntSize tileSize(defaultTileSize, defaultTileSize);
     82    const IntSize tileSize(min(defaultTileSize, contentBounds().width()), min(defaultTileSize, contentBounds().height()));
    8483
    8584    // Tile if both dimensions large, or any one dimension large and the other
     
    9897        isTiled = autoTiled;
    9998
    100     // Empty tile size tells the tiler to avoid tiling.
    101     IntSize requestedSize = isTiled ? tileSize : IntSize();
     99    IntSize requestedSize = isTiled ? tileSize : contentBounds();
    102100    const int maxSize = layerRenderer()->maxTextureSize();
    103101    IntSize clampedSize = requestedSize.shrunkTo(IntSize(maxSize, maxSize));
     
    129127        layerRenderer(),
    130128        IntSize(defaultTileSize, defaultTileSize),
    131         m_borderTexels ? LayerTilerChromium::HasBorderTexels : LayerTilerChromium::NoBorderTexels);
     129        LayerTilerChromium::HasBorderTexels);
    132130}
    133131
     
    145143void TiledLayerChromium::setIsMask(bool isMask)
    146144{
    147     m_borderTexels = !isMask;
    148145    setTilingOption(isMask ? NeverTile : AutoTile);
    149146}
  • trunk/Source/WebCore/platform/graphics/chromium/TiledLayerChromium.h

    r90963 r92255  
    7474
    7575    TilingOption m_tilingOption;
    76     bool m_borderTexels;
    7776};
    7877
  • trunk/Source/WebCore/platform/graphics/gpu/TilingData.cpp

    r90886 r92255  
    4545static int computeNumTiles(int maxTextureSize, int totalSize, int borderTexels)
    4646{
    47     int totalSizeWithBorder = totalSize + 2 * borderTexels;
    48 
    4947    if (maxTextureSize - 2 * borderTexels <= 0)
    50         return 0;
    51 
    52     int numTiles = max(1, 1 + (totalSizeWithBorder - 1 - 2 * borderTexels) / (maxTextureSize - 2 * borderTexels));
     48        return totalSize > 0 && maxTextureSize >= totalSize ? 1 : 0;
     49
     50    int numTiles = max(1, 1 + (totalSize - 1 - 2 * borderTexels) / (maxTextureSize - 2 * borderTexels));
    5351    return totalSize > 0 ? numTiles : 0;
    5452}
     
    8280
    8381    ASSERT(m_maxTextureSize - 2 * m_borderTexels);
    84     int x = srcPos / (m_maxTextureSize - 2 * m_borderTexels);
     82    int x = (srcPos - m_borderTexels) / (m_maxTextureSize - 2 * m_borderTexels);
    8583    return min(max(x, 0), numTilesX() - 1);
    8684}
     
    9290
    9391    ASSERT(m_maxTextureSize - 2 * m_borderTexels);
    94     int y = srcPos / (m_maxTextureSize - 2 * m_borderTexels);
     92    int y = (srcPos - m_borderTexels) / (m_maxTextureSize - 2 * m_borderTexels);
    9593    return min(max(y, 0), numTilesY() - 1);
    9694}
     
    135133}
    136134
    137 IntRect 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 
    147135FloatRect TilingData::tileBoundsNormalized(int tile) const
    148136{
     
    181169    if (!xIndex && m_numTilesX == 1)
    182170        return m_totalSizeX;
     171    if (!xIndex && m_numTilesX > 1)
     172        return m_maxTextureSize - m_borderTexels;
    183173    if (xIndex < numTilesX() - 1)
    184174        return m_maxTextureSize - 2 * m_borderTexels;
     
    196186    if (!yIndex && m_numTilesY == 1)
    197187        return m_totalSizeY;
     188    if (!yIndex && m_numTilesY > 1)
     189        return m_maxTextureSize - m_borderTexels;
    198190    if (yIndex < numTilesY() - 1)
    199191        return m_maxTextureSize - 2 * m_borderTexels;
     
    239231    *newSrc = srcRectIntersected;
    240232    newSrc->move(
    241         -tileBounds.x() + m_borderTexels,
    242         -tileBounds.y() + m_borderTexels);
     233        -tileBounds.x() + ((tileXIndex(tile) > 0) ? m_borderTexels : 0),
     234        -tileBounds.y() + ((tileYIndex(tile) > 0) ? m_borderTexels : 0));
    243235
    244236    *newDst = FloatRect(
     
    249241}
    250242
    251 IntPoint TilingData::textureOffset() const
    252 {
    253     return IntPoint(m_borderTexels, m_borderTexels);
     243IntPoint TilingData::textureOffset(int xIndex, int yIndex) const
     244{
     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);
    254249}
    255250
  • trunk/Source/WebCore/platform/graphics/gpu/TilingData.h

    r90886 r92255  
    6262    IntRect tileBounds(int tile) const;
    6363    IntRect tileBoundsWithBorder(int tile) const;
    64     IntRect tileBoundsWithOuterBorder(int tile) const;
    6564    FloatRect tileBoundsNormalized(int tile) const;
    6665    int tilePositionX(int xIndex) const;
     
    7675
    7776    // Difference between tileBound's and tileBoundWithBorder's location().
    78     IntPoint textureOffset() const;
     77    IntPoint textureOffset(int xIndex, int yIndex) const;
    7978
    8079private:
  • trunk/Source/WebKit/chromium/ChangeLog

    r92234 r92255  
     12011-08-02  David Reveman  <reveman@chromium.org>
     2
     3        [Chromium] Remove outer border from TilingData as it's no longer needed by layer compositor for anti-aliasing.
     4        https://bugs.webkit.org/show_bug.cgi?id=64942
     5
     6        Reviewed by James Robinson.
     7
     8        * tests/TilingDataTest.cpp:
     9        (WebCore::TEST):
     10
    1112011-08-02  Robert Kroeger  <rjkroege@chromium.org>
    212
  • trunk/Source/WebKit/chromium/tests/TilingDataTest.cpp

    r90646 r92255  
    4242{
    4343    EXPECT_EQ(1, TilingData(16, 16, 16, false).numTiles());
    44     EXPECT_EQ(1, TilingData(17, 15, 15, true).numTiles());
    45     EXPECT_EQ(1, TilingData(18, 16, 16, true).numTiles());
     44    EXPECT_EQ(1, TilingData(16, 15, 15, true).numTiles());
     45    EXPECT_EQ(1, TilingData(16, 16, 16, true).numTiles());
    4646    EXPECT_EQ(1, TilingData(16,  1, 16, false).numTiles());
    47     EXPECT_EQ(1, TilingData(17, 15, 15, true).numTiles());
     47    EXPECT_EQ(1, TilingData(15, 15, 15, true).numTiles());
    4848}
    4949
     
    110110    EXPECT_EQ(0, TilingData(0,  1,  1, true).numTiles());
    111111
    112     EXPECT_EQ(0, TilingData(1,  1,  1, true).numTiles());
     112    EXPECT_EQ(1, 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(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());
     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());
    151151}
    152152
     
    167167
    168168    EXPECT_EQ(0, TilingData(3, 10, 10, true).tileXIndexFromSrcCoord(0));
    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));
     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));
    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(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));
     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));
    204204}
    205205TEST(TilingDataTest, tileYIndexFromSrcCoord)
     
    219219
    220220    EXPECT_EQ(0, TilingData(3, 10, 10, true).tileYIndexFromSrcCoord(0));
    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));
     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));
    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(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));
     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));
    256256}
    257257
     
    259259{
    260260    EXPECT_EQ(5, TilingData(5,  5,  5, false).tileSizeX(0));
    261     EXPECT_EQ(3, TilingData(5,  5,  5, true).tileSizeX(0));
     261    EXPECT_EQ(5, 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(3, TilingData(5,  6,  6, true).tileSizeX(0));
    266     EXPECT_EQ(3, TilingData(5,  6,  6, true).tileSizeX(1));
     265    EXPECT_EQ(4, TilingData(5,  6,  6, true).tileSizeX(0));
     266    EXPECT_EQ(2, 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(3, TilingData(5,  8,  8, true).tileSizeX(0));
    271     EXPECT_EQ(3, TilingData(5,  8,  8, true).tileSizeX(1));
     270    EXPECT_EQ(4, TilingData(5,  8,  8, true).tileSizeX(0));
     271    EXPECT_EQ(4, 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(3, TilingData(5, 10, 10, true).tileSizeX(0));
     275    EXPECT_EQ(4, 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(3, TilingData(5, 11, 11, true).tileSizeX(2));
     279    EXPECT_EQ(4, 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(3, TilingData(5,  5,  5, true).tileSizeY(0));
     285    EXPECT_EQ(5, 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(3, TilingData(5,  6,  6, true).tileSizeY(0));
    290     EXPECT_EQ(3, TilingData(5,  6,  6, true).tileSizeY(1));
     289    EXPECT_EQ(4, TilingData(5,  6,  6, true).tileSizeY(0));
     290    EXPECT_EQ(2, 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(3, TilingData(5,  8,  8, true).tileSizeY(0));
    295     EXPECT_EQ(3, TilingData(5,  8,  8, true).tileSizeY(1));
     294    EXPECT_EQ(4, TilingData(5,  8,  8, true).tileSizeY(0));
     295    EXPECT_EQ(4, 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(3, TilingData(5, 10, 10, true).tileSizeY(0));
     299    EXPECT_EQ(4, 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(3, TilingData(5, 11, 11, true).tileSizeY(2));
     303    EXPECT_EQ(4, 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(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));
     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));
    326326
    327327    // Multiple tiles:
     
    341341    // with border
    342342    // positions 0, 2, 3, 4
    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));
     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));
    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(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));
     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));
    381381
    382382    // Multiple tiles:
     
    396396    // with border
    397397    // positions 0, 2, 3, 4
    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));
     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));
    415415}
    416416
     
    469469TEST(TilingDataTest, setMaxTextureSizeBorders)
    470470{
    471     TilingData data(8, 16, 30, true);
     471    TilingData data(8, 16, 32, 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(6, data.numTilesX());
     487    EXPECT_EQ(5, data.numTilesX());
    488488    EXPECT_EQ(10, data.numTilesY());
    489489}
Note: See TracChangeset for help on using the changeset viewer.