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