зеркало из https://github.com/mozilla/gecko-dev.git
r=mkaply, sr=blizzard (platform specific) OS/2 only - do slow tiling when scale is not 1.0
This commit is contained in:
Родитель
2f924faf40
Коммит
21e0daeb5d
|
@ -637,6 +637,13 @@ NS_IMETHODIMP nsImageOS2::DrawTile(nsIRenderingContext &aContext,
|
|||
PRInt32 ImageWidth = mInfo->cx;
|
||||
PRInt32 ImageHeight = mInfo->cy;
|
||||
|
||||
// Get the scale - if greater than 1 then do slow tile which
|
||||
nsIDeviceContext *theDeviceContext;
|
||||
float scale;
|
||||
PRBool doSlowTile = PR_FALSE;
|
||||
aContext.GetDeviceContext(theDeviceContext);
|
||||
theDeviceContext->GetCanonicalPixelScale(scale);
|
||||
|
||||
nsRect ValidRect (0, 0, ImageWidth, ImageHeight);
|
||||
ValidRect.IntersectRect (ValidRect, mDecodedRect);
|
||||
|
||||
|
@ -646,7 +653,8 @@ NS_IMETHODIMP nsImageOS2::DrawTile(nsIRenderingContext &aContext,
|
|||
|
||||
// Don't bother tiling if we only have to draw the bitmap a couple of times
|
||||
// Can't tile with 8bit alpha masks because need access destination bitmap values
|
||||
if ((ImageWidth > DrawRect.width / 2 && ImageHeight > DrawRect.height / 2) ||
|
||||
if ((scale > 1.0) ||
|
||||
(ImageWidth > DrawRect.width / 2 && ImageHeight > DrawRect.height / 2) ||
|
||||
(ImageWidth > MAX_BUFFER_WIDTH) || (ImageHeight > MAX_BUFFER_HEIGHT) ||
|
||||
mAlphaDepth > 1)
|
||||
return SlowTile (aContext, aSurface, aSXOffset, aSYOffset, aTileRect);
|
||||
|
@ -761,19 +769,60 @@ NS_IMETHODIMP nsImageOS2::DrawTile(nsIRenderingContext &aContext,
|
|||
nsresult nsImageOS2::SlowTile (nsIRenderingContext& aContext, nsDrawingSurface aSurface,
|
||||
PRInt32 aSXOffset, PRInt32 aSYOffset, const nsRect &aTileRect)
|
||||
{
|
||||
nsRect ImageRect (0, 0, PR_MIN (mInfo->cx, mDecodedRect.width), PR_MIN (mInfo->cy, mDecodedRect.height));
|
||||
PRInt32 x0, y0, x1, y1;
|
||||
nscoord ScaledTileWidth, ScaledTileHeight;
|
||||
PRInt32 ImageWidth = mInfo->cx;
|
||||
PRInt32 ImageHeight = mInfo->cy;
|
||||
nsIDeviceContext *theDeviceContext;
|
||||
float scale;
|
||||
aContext.GetDeviceContext(theDeviceContext);
|
||||
theDeviceContext->GetCanonicalPixelScale(scale);
|
||||
PRInt32 DestScaledWidth = ImageWidth * scale;
|
||||
PRInt32 DestScaledHeight = ImageHeight * scale;
|
||||
|
||||
for (PRInt32 y = aTileRect.y - aSYOffset + mDecodedRect.y ; y < aTileRect.YMost () ; y += mInfo->cy)
|
||||
for (PRInt32 x = aTileRect.x - aSXOffset + mDecodedRect.x ; x < aTileRect.XMost () ; x += mInfo->cx)
|
||||
nsRect ValidRect (0, 0, ImageWidth, ImageHeight);
|
||||
if (mDecodedRect.height < ImageHeight)
|
||||
{
|
||||
nsRect CroppedImage;
|
||||
ValidRect.height = mDecodedRect.height - mDecodedRect.y;
|
||||
DestScaledHeight = PR_MAX(PRInt32(ValidRect.height * scale), 1);
|
||||
}
|
||||
if (mDecodedRect.width < ImageWidth)
|
||||
{
|
||||
ValidRect.width = mDecodedRect.width - mDecodedRect.x;
|
||||
DestScaledWidth = PR_MAX(PRInt32(ValidRect.width * scale), 1);
|
||||
}
|
||||
if (mDecodedRect.y > 0)
|
||||
{
|
||||
ValidRect.height -= mDecodedRect.height;
|
||||
DestScaledHeight = PR_MAX(PRInt32(ValidRect.height * scale), 1);
|
||||
ValidRect.y = mDecodedRect.height;
|
||||
}
|
||||
if (mDecodedRect.x > 0)
|
||||
{
|
||||
ValidRect.width -= mDecodedRect.x;
|
||||
DestScaledWidth = PR_MAX(PRInt32(ValidRect.width * scale), 1);
|
||||
ValidRect.x = mDecodedRect.width;
|
||||
}
|
||||
|
||||
ImageRect.MoveTo (x, y);
|
||||
CroppedImage.IntersectRect (ImageRect, aTileRect);
|
||||
// put the DestRect into absolute coordintes of the device
|
||||
y0 = aTileRect.y - aSYOffset;
|
||||
x0 = aTileRect.x - aSXOffset;
|
||||
y1 = aTileRect.y + aTileRect.height;
|
||||
x1 = aTileRect.x + aTileRect.width;
|
||||
|
||||
Draw (aContext, aSurface,
|
||||
CroppedImage.x - x, CroppedImage.y - y, CroppedImage.width, CroppedImage.height,
|
||||
CroppedImage.x, CroppedImage.y, CroppedImage.width, CroppedImage.height);
|
||||
// this is the width and height of the image in pixels
|
||||
// we need to map this to the pixel height of the device
|
||||
ScaledTileWidth = PR_MAX(PRInt32(ImageWidth*scale), 1);
|
||||
ScaledTileHeight = PR_MAX(PRInt32(ImageHeight*scale), 1);
|
||||
|
||||
for (PRInt32 y = y0; y < y1; y += ScaledTileHeight)
|
||||
{
|
||||
for (PRInt32 x = x0; x < x1; x += ScaledTileWidth)
|
||||
{
|
||||
Draw(aContext, aSurface,
|
||||
0, 0, PR_MIN(ValidRect.width, x1 - x), PR_MIN(ValidRect.height, y1 - y),
|
||||
x, y, PR_MIN(DestScaledWidth, x1-x), PR_MIN(DestScaledHeight, y1 - y));
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
|
Загрузка…
Ссылка в новой задаче