void RenderSVGResourcePattern::buildPattern(PatternData* patternData, PassOwnPtr<ImageBuffer> tileImage) const
{
    if (!tileImage->image()) {
        patternData->pattern = 0;
        return;
    }

    IntRect tileRect = tileImage->image()->rect();
    if (tileRect.width() <= patternData->boundaries.width() && tileRect.height() <= patternData->boundaries.height()) {
        patternData->pattern = Pattern::create(tileImage->image(), true, true);
        return;
    }

    // Draw the first cell of the pattern manually to support overflow="visible" on all platforms.
    int tileWidth = static_cast<int>(patternData->boundaries.width() + 0.5f);
    int tileHeight = static_cast<int>(patternData->boundaries.height() + 0.5f);

    // Don't create ImageBuffers with image size of 0
    if (!tileWidth || !tileHeight) {
        patternData->pattern = 0;
        return;
    }

    OwnPtr<ImageBuffer> newTileImage = ImageBuffer::create(IntSize(tileWidth, tileHeight));
    GraphicsContext* newTileImageContext = newTileImage->context();

    int numY = static_cast<int>(ceilf(tileRect.height() / tileHeight)) + 1;
    int numX = static_cast<int>(ceilf(tileRect.width() / tileWidth)) + 1;

    newTileImageContext->save();
    newTileImageContext->translate(-patternData->boundaries.width() * numX, -patternData->boundaries.height() * numY);
    for (int i = numY; i > 0; --i) {
        newTileImageContext->translate(0, patternData->boundaries.height());
        for (int j = numX; j > 0; --j) {
            newTileImageContext->translate(patternData->boundaries.width(), 0);
            newTileImageContext->drawImage(tileImage->image(), style()->colorSpace(), tileRect, tileRect);
        }
        newTileImageContext->translate(-patternData->boundaries.width() * numX, 0);
    }
    newTileImageContext->restore();

    patternData->pattern = Pattern::create(newTileImage->image(), true, true);
}