void nsRenderingContext::FillRect(const nsRect& aRect) { gfxRect r(GFX_RECT_FROM_TWIPS_RECT(aRect)); /* Clamp coordinates to work around a design bug in cairo */ nscoord bigval = (nscoord)(CAIRO_COORD_MAX*mP2A); if (aRect.width > bigval || aRect.height > bigval || aRect.x < -bigval || aRect.x > bigval || aRect.y < -bigval || aRect.y > bigval) { gfxMatrix mat = mThebes->CurrentMatrix(); r = mat.Transform(r); if (!ConditionRect(r)) return; mThebes->IdentityMatrix(); mThebes->NewPath(); mThebes->Rectangle(r, PR_TRUE); mThebes->Fill(); mThebes->SetMatrix(mat); } mThebes->NewPath(); mThebes->Rectangle(r, PR_TRUE); mThebes->Fill(); }
NS_IMETHODIMP nsRenderingContextPh :: InvertRect( nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight ) { if( nsnull == mTranMatrix || nsnull == mSurface ) return NS_ERROR_FAILURE; nscoord x,y,w,h; x = aX; y = aY; w = aWidth; h = aHeight; mTranMatrix->TransformCoord(&x,&y,&w,&h); if( !w || !h ) return NS_OK; UpdateGC(); PgSetStrokeColorCx( mGC, mCurrentColor ); PgSetStrokeDashCx( mGC, sLineStyle[mCurrentLineStyle], sLineStyleLen[mCurrentLineStyle], 0x10000 ); PgSetFillColorCx( mGC, mCurrentColor ); ConditionRect(x,y,w,h); PgSetFillColorCx( mGC, Pg_INVERT_COLOR ); PgSetDrawModeCx( mGC, Pg_DRAWMODE_XOR ); PgDrawIRectCx( mSurfaceDC, x, y, x + w - 1, y + h - 1, Pg_DRAW_FILL ); PgSetDrawModeCx( mGC, Pg_DRAWMODE_OPAQUE ); /* this is necessary here in 630 because of PR:18744 ( http://bugs.qnx.com ) - please remove it when the PR is fixed */ PgFlushCx( mSurfaceDC ); return NS_OK; }
NS_IMETHODIMP nsRenderingContextPh :: FillRect( nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight ) { nscoord x,y,w,h; x = aX; y = aY; w = aWidth; h = aHeight; mTranMatrix->TransformCoord( &x, &y, &w, &h ); PgSetGC( NULL ); /* ATENTIE */ PhDCSetCurrent( mSurfaceDC ); UpdateGC(); PgSetStrokeColorCx( mGC, mCurrentColor ); PgSetStrokeDashCx( mGC, sLineStyle[mCurrentLineStyle], sLineStyleLen[mCurrentLineStyle], 0x10000 ); PgSetFillColorCx( mGC, mCurrentColor ); ConditionRect(x,y,w,h); if( w && h ) { int y2 = y + h - 1; if( y < SHRT_MIN ) y = SHRT_MIN; /* on very large documents, the PgDrawIRect will take only the short part from the int, which could lead to randomly, hazardous results see PR: 5864 */ if( y2 >= SHRT_MAX ) y2 = SHRT_MAX; /* on very large documents, the PgDrawIRect will take only the short part from the int, which could lead to randomly, hazardous results see PR: 5864 */ PgDrawIRectCx( mSurfaceDC, x, y, x + w - 1, y2, Pg_DRAW_FILL ); } return NS_OK; }
NS_IMETHODIMP nsRenderingContextQt::InvertRect(nscoord aX,nscoord aY, nscoord aWidth,nscoord aHeight) { if (nsnull == mTranMatrix || nsnull == mSurface || nsnull == mSurface->GetGC() || nsnull == mSurface->GetPaintDevice()) return NS_ERROR_FAILURE; nscoord x,y,w,h; x = aX; y = aY; w = aWidth; h = aHeight; mTranMatrix->TransformCoord(&x,&y,&w,&h); // After the transform, if the numbers are huge, chop them, because // they're going to be converted from 32 bit to 16 bit. // It's all way off the screen anyway. ConditionRect(x,y,w,h); // Set XOR drawing mode mFunction = Qt::XorROP; UpdateGC(); // Fill the rect QColor color(NS_GET_R(mCurrentColor), NS_GET_G(mCurrentColor), NS_GET_B(mCurrentColor)); mSurface->GetGC()->fillRect(x,y,w,h,color); // Back to normal copy drawing mode mFunction = Qt::CopyROP; return NS_OK; }
NS_IMETHODIMP nsRenderingContextQt::DrawRect(nscoord aX,nscoord aY, nscoord aWidth,nscoord aHeight) { if (nsnull == mTranMatrix || nsnull == mSurface || nsnull == mSurface->GetGC() || nsnull == mSurface->GetPaintDevice()) return NS_ERROR_FAILURE; nscoord x,y,w,h; x = aX; y = aY; w = aWidth; h = aHeight; mTranMatrix->TransformCoord(&x,&y,&w,&h); // After the transform, if the numbers are huge, chop them, because // they're going to be converted from 32 bit to 16 bit. // It's all way off the screen anyway. ConditionRect(x,y,w,h); if (w && h) { UpdateGC(); mSurface->GetGC()->drawRect(x,y,w,h); } return NS_OK; }
NS_IMETHODIMP nsThebesRenderingContext::FillRect(const nsRect& aRect) { PR_LOG(gThebesGFXLog, PR_LOG_DEBUG, ("## %p nsTRC::FillRect [%d,%d,%d,%d]\n", this, aRect.x, aRect.y, aRect.width, aRect.height)); gfxRect r(GFX_RECT_FROM_TWIPS_RECT(aRect)); /* Clamp coordinates to work around a design bug in cairo */ nscoord bigval = (nscoord)(CAIRO_COORD_MAX*mP2A); if (aRect.width > bigval || aRect.height > bigval || aRect.x < -bigval || aRect.x > bigval || aRect.y < -bigval || aRect.y > bigval) { gfxMatrix mat = mThebes->CurrentMatrix(); r = mat.Transform(r); if (!ConditionRect(r)) return NS_OK; mThebes->IdentityMatrix(); mThebes->NewPath(); PR_LOG(gThebesGFXLog, PR_LOG_DEBUG, ("## %p nsTRC::FillRect conditioned to [%f,%f,%f,%f]\n", this, r.pos.x, r.pos.y, r.size.width, r.size.height)); mThebes->Rectangle(r, PR_TRUE); mThebes->Fill(); mThebes->SetMatrix(mat); return NS_OK; } PR_LOG(gThebesGFXLog, PR_LOG_DEBUG, ("## %p nsTRC::FillRect raw [%f,%f,%f,%f]\n", this, r.pos.x, r.pos.y, r.size.width, r.size.height)); mThebes->NewPath(); mThebes->Rectangle(r, PR_TRUE); mThebes->Fill(); return NS_OK; }
NS_IMETHODIMP nsRenderingContextPh :: DrawRect( nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight ) { nscoord x,y,w,h; x = aX; y = aY; w = aWidth; h = aHeight; mTranMatrix->TransformCoord( &x, &y, &w, &h ); UpdateGC(); PgSetStrokeColorCx( mGC, mCurrentColor ); PgSetStrokeDashCx( mGC, sLineStyle[mCurrentLineStyle], sLineStyleLen[mCurrentLineStyle], 0x10000 ); ConditionRect(x,y,w,h); if( w && h ) PgDrawIRectCx( mSurfaceDC, x, y, x + w - 1, y + h - 1, Pg_DRAW_STROKE ); return NS_OK; }