IntSize SVGImage::containerSize() const { SVGSVGElement* rootElement = this->rootElement(); if (!rootElement) return IntSize(); auto* renderer = downcast<RenderSVGRoot>(rootElement->renderer()); if (!renderer) return IntSize(); // If a container size is available it has precedence. IntSize containerSize = renderer->containerSize(); if (!containerSize.isEmpty()) return containerSize; // Assure that a container size is always given for a non-identity zoom level. ASSERT(renderer->style().effectiveZoom() == 1); FloatSize currentSize; if (rootElement->hasIntrinsicWidth() && rootElement->hasIntrinsicHeight()) currentSize = rootElement->currentViewportSize(); else currentSize = rootElement->currentViewBoxRect().size(); if (!currentSize.isEmpty()) return IntSize(static_cast<int>(ceilf(currentSize.width())), static_cast<int>(ceilf(currentSize.height()))); // As last resort, use CSS default intrinsic size. return IntSize(300, 150); }
IntSize SVGImage::containerSize() const { if (!m_page) return IntSize(); Frame* frame = m_page->mainFrame(); SVGSVGElement* rootElement = toSVGDocument(frame->document())->rootElement(); if (!rootElement) return IntSize(); RenderSVGRoot* renderer = toRenderSVGRoot(rootElement->renderer()); if (!renderer) return IntSize(); // If a container size is available it has precedence. IntSize containerSize = renderer->containerSize(); if (!containerSize.isEmpty()) return containerSize; // Assure that a container size is always given for a non-identity zoom level. ASSERT(renderer->style()->effectiveZoom() == 1); FloatSize currentSize; if (rootElement->intrinsicWidth().isFixed() && rootElement->intrinsicHeight().isFixed()) currentSize = rootElement->currentViewportSize(); else currentSize = rootElement->currentViewBoxRect().size(); if (!currentSize.isEmpty()) return IntSize(static_cast<int>(ceilf(currentSize.width())), static_cast<int>(ceilf(currentSize.height()))); // As last resort, use CSS default intrinsic size. return IntSize(300, 150); }
IntSize SVGImage::containerSize() const { SVGSVGElement* rootElement = svgRootElement(m_page.get()); if (!rootElement) return IntSize(); LayoutSVGRoot* layoutObject = toLayoutSVGRoot(rootElement->layoutObject()); if (!layoutObject) return IntSize(); // If a container size is available it has precedence. IntSize containerSize = layoutObject->containerSize(); if (!containerSize.isEmpty()) return containerSize; // Assure that a container size is always given for a non-identity zoom level. ASSERT(layoutObject->style()->effectiveZoom() == 1); FloatSize intrinsicSize; double intrinsicRatio = 0; layoutObject->computeIntrinsicRatioInformation(intrinsicSize, intrinsicRatio); if (intrinsicSize.isEmpty() && intrinsicRatio) { if (!intrinsicSize.width() && intrinsicSize.height()) intrinsicSize.setWidth(intrinsicSize.height() * intrinsicRatio); else if (intrinsicSize.width() && !intrinsicSize.height()) intrinsicSize.setHeight(intrinsicSize.width() / intrinsicRatio); } // TODO(davve): In order to maintain aspect ratio the intrinsic // size is faked from the viewBox as a last resort. This may cause // unwanted side effects. Preferably we should be able to signal // the intrinsic ratio in another way. if (intrinsicSize.isEmpty()) intrinsicSize = rootElement->currentViewBoxRect().size(); if (!intrinsicSize.isEmpty()) return expandedIntSize(intrinsicSize); // As last resort, use CSS replaced element fallback size. return IntSize(300, 150); }