/* [noscript] void draw(in gfxContext aContext, * in gfxGraphicsFilter aFilter, * [const] in gfxMatrix aUserSpaceToImageSpace, * [const] in gfxRect aFill, * [const] in nsIntRect aSubimage, * [const] in nsIntSize aViewportSize, * in PRUint32 aFlags); */ NS_IMETHODIMP VectorImage::Draw(gfxContext* aContext, gfxPattern::GraphicsFilter aFilter, const gfxMatrix& aUserSpaceToImageSpace, const gfxRect& aFill, const nsIntRect& aSubimage, const nsIntSize& aViewportSize, PRUint32 aFlags) { NS_ENSURE_ARG_POINTER(aContext); if (mError || !mIsFullyLoaded) return NS_ERROR_FAILURE; if (mIsDrawing) { NS_WARNING("Refusing to make re-entrant call to VectorImage::Draw"); return NS_ERROR_FAILURE; } mIsDrawing = true; if (aViewportSize != mLastRenderedSize) { mSVGDocumentWrapper->UpdateViewportBounds(aViewportSize); mLastRenderedSize = aViewportSize; } mSVGDocumentWrapper->FlushImageTransformInvalidation(); nsIntSize imageSize = mHaveRestrictedRegion ? mRestrictedRegion.Size() : aViewportSize; // XXXdholbert Do we need to convert image size from // CSS pixels to dev pixels here? (is gfxCallbackDrawable's 2nd arg in dev // pixels?) gfxIntSize imageSizeGfx(imageSize.width, imageSize.height); // Based on imgFrame::Draw gfxRect sourceRect = aUserSpaceToImageSpace.Transform(aFill); gfxRect imageRect(0, 0, imageSize.width, imageSize.height); gfxRect subimage(aSubimage.x, aSubimage.y, aSubimage.width, aSubimage.height); nsRefPtr<gfxDrawingCallback> cb = new SVGDrawingCallback(mSVGDocumentWrapper, mHaveRestrictedRegion ? mRestrictedRegion : nsIntRect(nsIntPoint(0, 0), aViewportSize), aFlags); nsRefPtr<gfxDrawable> drawable = new gfxCallbackDrawable(cb, imageSizeGfx); gfxUtils::DrawPixelSnapped(aContext, drawable, aUserSpaceToImageSpace, subimage, sourceRect, imageRect, aFill, gfxASurface::ImageFormatARGB32, aFilter); mIsDrawing = false; return NS_OK; }
NS_IMETHODIMP ClippedImage::Draw(gfxContext* aContext, gfxPattern::GraphicsFilter aFilter, const gfxMatrix& aUserSpaceToImageSpace, const gfxRect& aFill, const nsIntRect& aSubimage, const nsIntSize& aViewportSize, const SVGImageContext* aSVGContext, uint32_t aWhichFrame, uint32_t aFlags) { if (!ShouldClip()) { return InnerImage()->Draw(aContext, aFilter, aUserSpaceToImageSpace, aFill, aSubimage, aViewportSize, aSVGContext, aWhichFrame, aFlags); } // Check for tiling. If we need to tile then we need to create a // gfxCallbackDrawable to handle drawing for us. gfxRect sourceRect = aUserSpaceToImageSpace.Transform(aFill); if (MustCreateSurface(aContext, aUserSpaceToImageSpace, sourceRect, aSubimage, aFlags)) { // Create a temporary surface containing a single tile of this image. // GetFrame will call DrawSingleTile internally. nsRefPtr<gfxASurface> surface; GetFrameInternal(aViewportSize, aSVGContext, aWhichFrame, aFlags, getter_AddRefs(surface)); NS_ENSURE_TRUE(surface, NS_ERROR_FAILURE); // Create a drawable from that surface. nsRefPtr<gfxSurfaceDrawable> drawable = new gfxSurfaceDrawable(surface, gfxIntSize(mClip.width, mClip.height)); // Draw. gfxRect imageRect(0, 0, mClip.width, mClip.height); gfxRect subimage(aSubimage.x, aSubimage.y, aSubimage.width, aSubimage.height); gfxUtils::DrawPixelSnapped(aContext, drawable, aUserSpaceToImageSpace, subimage, sourceRect, imageRect, aFill, gfxASurface::ImageFormatARGB32, aFilter); return NS_OK; } // Determine the appropriate subimage for the inner image. nsIntRect innerSubimage(aSubimage); innerSubimage.MoveBy(mClip.x, mClip.y); innerSubimage.Intersect(mClip); return DrawSingleTile(aContext, aFilter, aUserSpaceToImageSpace, aFill, innerSubimage, aViewportSize, aSVGContext, aWhichFrame, aFlags); }
nsresult ClippedImage::DrawSingleTile(gfxContext* aContext, gfxPattern::GraphicsFilter aFilter, const gfxMatrix& aUserSpaceToImageSpace, const gfxRect& aFill, const nsIntRect& aSubimage, const nsIntSize& aViewportSize, const SVGImageContext* aSVGContext, uint32_t aWhichFrame, uint32_t aFlags) { MOZ_ASSERT(!MustCreateSurface(aContext, aUserSpaceToImageSpace, aUserSpaceToImageSpace.Transform(aFill), aSubimage - nsIntPoint(mClip.x, mClip.y), aFlags), "DrawSingleTile shouldn't need to create a surface"); // Make the viewport reflect the original image's size. nsIntSize viewportSize(aViewportSize); int32_t imgWidth, imgHeight; if (NS_SUCCEEDED(InnerImage()->GetWidth(&imgWidth)) && NS_SUCCEEDED(InnerImage()->GetHeight(&imgHeight))) { viewportSize = nsIntSize(imgWidth, imgHeight); } else { MOZ_ASSERT(false, "If ShouldClip() led us to draw then we should never get here"); } // Add a translation to the transform to reflect the clipping region. gfxMatrix transform(aUserSpaceToImageSpace); transform.Multiply(gfxMatrix().Translate(gfxPoint(mClip.x, mClip.y))); // "Clamp the source rectangle" to the clipping region's width and height. // Really, this means modifying the transform to get the results we want. gfxRect sourceRect = transform.Transform(aFill); if (sourceRect.width > mClip.width || sourceRect.height > mClip.height) { gfxMatrix clampSource; clampSource.Translate(gfxPoint(sourceRect.x, sourceRect.y)); clampSource.Scale(ClampFactor(sourceRect.width, mClip.width), ClampFactor(sourceRect.height, mClip.height)); clampSource.Translate(gfxPoint(-sourceRect.x, -sourceRect.y)); transform.Multiply(clampSource); } return InnerImage()->Draw(aContext, aFilter, transform, aFill, aSubimage, viewportSize, aSVGContext, aWhichFrame, aFlags); }
bool TabChild::RecvPDocumentRendererNativeIDConstructor( PDocumentRendererNativeIDChild *__a, const PRInt32& aX, const PRInt32& aY, const PRInt32& aW, const PRInt32& aH, const nsString& bgcolor, const PRUint32& flags, const bool& flush, const gfxMatrix& aMatrix, const PRUint32& aNativeID) { mozilla::ipc::DocumentRendererNativeIDChild* render = static_cast<mozilla::ipc::DocumentRendererNativeIDChild*>(__a); nsCOMPtr<nsIWebBrowser> browser = do_QueryInterface(mWebNav); if (!browser) return true; // silently ignore nsCOMPtr<nsIDOMWindow> window; if (NS_FAILED(browser->GetContentDOMWindow(getter_AddRefs(window))) || !window) return true; // silently ignore render->RenderDocument(window, aX, aY, aW, aH, bgcolor, flags, flush, aMatrix, aNativeID); gfxRect dirtyArea(0, 0, nsPresContext::AppUnitsToIntCSSPixels(aW), nsPresContext::AppUnitsToIntCSSPixels(aH)); dirtyArea = aMatrix.Transform(dirtyArea); return PDocumentRendererNativeIDChild::Send__delete__(__a, dirtyArea.X(), dirtyArea.Y(), dirtyArea.Width(), dirtyArea.Height(), aNativeID); }