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); }