static void getShapeImageAndRect(const ShapeValue& shapeValue, const RenderBox& renderBox, const LayoutSize& referenceBoxSize, Image*& image, LayoutRect& rect) { ASSERT(shapeValue.isImageValid()); StyleImage* styleImage = shapeValue.image(); const LayoutSize& imageSize = renderBox.calculateImageIntrinsicDimensions(styleImage, roundedIntSize(referenceBoxSize), RenderImage::ScaleByEffectiveZoom); styleImage->setContainerSizeForRenderer(&renderBox, imageSize, renderBox.style().effectiveZoom()); image = nullptr; if (styleImage->isCachedImage() || styleImage->isCachedImageSet()) image = styleImage->cachedImage()->imageForRenderer(&renderBox); else if (styleImage->isGeneratedImage()) image = styleImage->image(const_cast<RenderBox*>(&renderBox), imageSize).get(); if (renderBox.isRenderImage()) rect = toRenderImage(&renderBox)->replacedContentRect(renderBox.intrinsicSize()); else rect = LayoutRect(LayoutPoint(), imageSize); }
void NinePieceImage::paint(GraphicsContext* graphicsContext, RenderElement* renderer, const RenderStyle& style, const LayoutRect& destination, const LayoutSize& source, bool intrinsicSource, float deviceScaleFactor, CompositeOperator op) const { StyleImage* styleImage = image(); ASSERT(styleImage && styleImage->isLoaded()); LayoutBoxExtent sourceSlices = computeSlices(source, imageSlices(), styleImage->imageScaleFactor()); LayoutBoxExtent destinationSlices = computeSlices(destination.size(), borderSlices(), style.borderWidth(), sourceSlices); scaleSlicesIfNeeded(destination.size(), destinationSlices, deviceScaleFactor); Vector<FloatRect> destinationRects = computeIntrinsicRects(destination, destinationSlices, deviceScaleFactor); Vector<FloatRect> sourceRects; Vector<FloatSize> tileScales; if (intrinsicSource) { sourceRects = computeIntrinsicRects(FloatRect(FloatPoint(), source), sourceSlices, deviceScaleFactor); tileScales = computeIntrinsicTileScales(destinationRects, sourceRects, horizontalRule(), verticalRule()); } else { sourceRects = computeNonIntrinsicRects(destinationRects, sourceSlices); tileScales = computeNonIntrinsicTileScales(); } RefPtr<Image> image = styleImage->image(renderer, source); ColorSpace colorSpace = style.colorSpace(); for (ImagePiece piece = MinPiece; piece < MaxPiece; ++piece) { if ((piece == MiddlePiece && !fill()) || isEmptyPieceRect(piece, destinationRects, sourceRects)) continue; if (isCornerPiece(piece)) { graphicsContext->drawImage(image.get(), colorSpace, destinationRects[piece], sourceRects[piece], op); continue; } Image::TileRule hRule = isHorizontalPiece(piece) ? static_cast<Image::TileRule>(horizontalRule()) : Image::StretchTile; Image::TileRule vRule = isVerticalPiece(piece) ? static_cast<Image::TileRule>(verticalRule()) : Image::StretchTile; graphicsContext->drawTiledImage(image.get(), colorSpace, destinationRects[piece], sourceRects[piece], tileScales[piece], hRule, vRule, op); } }