bool nsSVGImageFrame::TransformContextForPainting(gfxContext* aGfxContext, const gfxMatrix& aTransform) { gfx::Matrix imageTransform; if (mImageContainer->GetType() == imgIContainer::TYPE_VECTOR) { imageTransform = GetVectorImageTransform() * ToMatrix(aTransform); } else { int32_t nativeWidth, nativeHeight; if (NS_FAILED(mImageContainer->GetWidth(&nativeWidth)) || NS_FAILED(mImageContainer->GetHeight(&nativeHeight)) || nativeWidth == 0 || nativeHeight == 0) { return false; } imageTransform = GetRasterImageTransform(nativeWidth, nativeHeight) * ToMatrix(aTransform); // NOTE: We need to cancel out the effects of Full-Page-Zoom, or else // it'll get applied an extra time by DrawSingleUnscaledImage. nscoord appUnitsPerDevPx = PresContext()->AppUnitsPerDevPixel(); gfxFloat pageZoomFactor = nsPresContext::AppUnitsToFloatCSSPixels(appUnitsPerDevPx); imageTransform.PreScale(pageZoomFactor, pageZoomFactor); } if (imageTransform.IsSingular()) { return false; } aGfxContext->Multiply(ThebesMatrix(imageTransform)); return true; }
nsIFrame* nsSVGImageFrame::GetFrameForPoint(const gfxPoint& aPoint) { if (!(GetStateBits() & NS_STATE_SVG_CLIPPATH_CHILD) && !GetHitTestFlags()) { return nullptr; } Rect rect; SVGImageElement *element = static_cast<SVGImageElement*>(mContent); element->GetAnimatedLengthValues(&rect.x, &rect.y, &rect.width, &rect.height, nullptr); if (!rect.Contains(ToPoint(aPoint))) { return nullptr; } // Special case for raster images -- we only want to accept points that fall // in the underlying image's (scaled to fit) native bounds. That region // doesn't necessarily map to our <image> element's [x,y,width,height] if the // raster image's aspect ratio is being preserved. We have to look up the // native image size & our viewBox transform in order to filter out points // that fall outside that area. (This special case doesn't apply to vector // images because they don't limit their drawing to explicit "native // bounds" -- they have an infinite canvas on which to place content.) if (StyleDisplay()->IsScrollableOverflow() && mImageContainer) { if (mImageContainer->GetType() == imgIContainer::TYPE_RASTER) { int32_t nativeWidth, nativeHeight; if (NS_FAILED(mImageContainer->GetWidth(&nativeWidth)) || NS_FAILED(mImageContainer->GetHeight(&nativeHeight)) || nativeWidth == 0 || nativeHeight == 0) { return nullptr; } Matrix viewBoxTM = SVGContentUtils::GetViewBoxTransform(rect.width, rect.height, 0, 0, nativeWidth, nativeHeight, element->mPreserveAspectRatio); if (!nsSVGUtils::HitTestRect(viewBoxTM, 0, 0, nativeWidth, nativeHeight, aPoint.x - rect.x, aPoint.y - rect.y)) { return nullptr; } } } return this; }