mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1128223 (Part 2) - Add FLAG_SYNC_DECODE_IF_FAST. r=tn
This commit is contained in:
parent
564caf69e7
commit
6a678ed5a6
@ -69,7 +69,7 @@ native nsIntSizeByVal(nsIntSize);
|
|||||||
*
|
*
|
||||||
* Internally, imgIContainer also manages animation of images.
|
* Internally, imgIContainer also manages animation of images.
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(25236a61-9568-4b2b-a2ce-209a2db9771d)]
|
[scriptable, builtinclass, uuid(60e07aae-8500-46c7-b305-9a35ad7e6665)]
|
||||||
interface imgIContainer : nsISupports
|
interface imgIContainer : nsISupports
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -151,6 +151,9 @@ interface imgIContainer : nsISupports
|
|||||||
* FLAG_SYNC_DECODE: Forces synchronous/non-progressive decode of all
|
* FLAG_SYNC_DECODE: Forces synchronous/non-progressive decode of all
|
||||||
* available data before the call returns.
|
* available data before the call returns.
|
||||||
*
|
*
|
||||||
|
* FLAG_SYNC_DECODE_IF_FAST: Like FLAG_SYNC_DECODE, but requests a sync decode
|
||||||
|
* be performed only if ImageLib estimates it can be completed very quickly.
|
||||||
|
*
|
||||||
* FLAG_DECODE_NO_PREMULTIPLY_ALPHA: Do not premultiply alpha if
|
* FLAG_DECODE_NO_PREMULTIPLY_ALPHA: Do not premultiply alpha if
|
||||||
* it's not already premultiplied in the image data.
|
* it's not already premultiplied in the image data.
|
||||||
*
|
*
|
||||||
@ -177,12 +180,13 @@ interface imgIContainer : nsISupports
|
|||||||
*/
|
*/
|
||||||
const unsigned long FLAG_NONE = 0x0;
|
const unsigned long FLAG_NONE = 0x0;
|
||||||
const unsigned long FLAG_SYNC_DECODE = 0x1;
|
const unsigned long FLAG_SYNC_DECODE = 0x1;
|
||||||
const unsigned long FLAG_DECODE_NO_PREMULTIPLY_ALPHA = 0x2;
|
const unsigned long FLAG_SYNC_DECODE_IF_FAST = 0x2;
|
||||||
const unsigned long FLAG_DECODE_NO_COLORSPACE_CONVERSION = 0x4;
|
const unsigned long FLAG_DECODE_NO_PREMULTIPLY_ALPHA = 0x4;
|
||||||
const unsigned long FLAG_CLAMP = 0x8;
|
const unsigned long FLAG_DECODE_NO_COLORSPACE_CONVERSION = 0x8;
|
||||||
const unsigned long FLAG_HIGH_QUALITY_SCALING = 0x10;
|
const unsigned long FLAG_CLAMP = 0x10;
|
||||||
const unsigned long FLAG_WANT_DATA_SURFACE = 0x20;
|
const unsigned long FLAG_HIGH_QUALITY_SCALING = 0x20;
|
||||||
const unsigned long FLAG_BYPASS_SURFACE_CACHE = 0x40;
|
const unsigned long FLAG_WANT_DATA_SURFACE = 0x40;
|
||||||
|
const unsigned long FLAG_BYPASS_SURFACE_CACHE = 0x80;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A constant specifying the default set of decode flags (i.e., the default
|
* A constant specifying the default set of decode flags (i.e., the default
|
||||||
|
@ -1420,23 +1420,18 @@ RasterImage::WantDecodedFrames(const nsIntSize& aSize, uint32_t aFlags,
|
|||||||
SurfaceCache::UnlockSurfaces(ImageKey(this));
|
SurfaceCache::UnlockSurfaces(ImageKey(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DecodeStrategy strategy = DecodeStrategy::ASYNC;
|
||||||
|
|
||||||
if (aShouldSyncNotify) {
|
if (aShouldSyncNotify) {
|
||||||
// We can sync notify, which means we can also sync decode.
|
// We can sync notify, which means we can also sync decode.
|
||||||
if (aFlags & FLAG_SYNC_DECODE) {
|
if (aFlags & FLAG_SYNC_DECODE) {
|
||||||
Decode(DecodeStrategy::SYNC_IF_POSSIBLE, Some(aSize), aFlags);
|
strategy = DecodeStrategy::SYNC_IF_POSSIBLE;
|
||||||
return;
|
} else if (aFlags & FLAG_SYNC_DECODE_IF_FAST) {
|
||||||
|
strategy = DecodeStrategy::SYNC_FOR_SMALL_IMAGES;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Here we are explicitly trading off flashing for responsiveness in the
|
|
||||||
// case that we're redecoding an image (see bug 845147).
|
|
||||||
Decode(mHasBeenDecoded ? DecodeStrategy::ASYNC
|
|
||||||
: DecodeStrategy::SYNC_FOR_SMALL_IMAGES,
|
|
||||||
Some(aSize), aFlags);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We can't sync notify, so do an async decode.
|
Decode(strategy, Some(aSize), aFlags);
|
||||||
Decode(DecodeStrategy::ASYNC, Some(aSize), aFlags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//******************************************************************************
|
//******************************************************************************
|
||||||
@ -1466,7 +1461,7 @@ RasterImage::StartDecoding()
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return RequestDecodeForSize(mSize, FLAG_SYNC_DECODE);
|
return RequestDecodeForSize(mSize, FLAG_SYNC_DECODE_IF_FAST);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
@ -1487,8 +1482,15 @@ RasterImage::RequestDecodeForSize(const nsIntSize& aSize, uint32_t aFlags)
|
|||||||
// downscale-during-decode.
|
// downscale-during-decode.
|
||||||
nsIntSize targetSize = mDownscaleDuringDecode ? aSize : mSize;
|
nsIntSize targetSize = mDownscaleDuringDecode ? aSize : mSize;
|
||||||
|
|
||||||
// Sync decode small images if requested.
|
// Decide whether to sync decode images we can decode quickly. Here we are
|
||||||
bool shouldSyncDecodeSmallImages = aFlags & FLAG_SYNC_DECODE;
|
// explicitly trading off flashing for responsiveness in the case that we're
|
||||||
|
// redecoding an image (see bug 845147).
|
||||||
|
bool shouldSyncDecodeIfFast =
|
||||||
|
!mHasBeenDecoded && (aFlags & FLAG_SYNC_DECODE_IF_FAST);
|
||||||
|
|
||||||
|
uint32_t flags = shouldSyncDecodeIfFast
|
||||||
|
? aFlags
|
||||||
|
: aFlags & ~FLAG_SYNC_DECODE_IF_FAST;
|
||||||
|
|
||||||
// Look up the first frame of the image, which will implicitly start decoding
|
// Look up the first frame of the image, which will implicitly start decoding
|
||||||
// if it's not available right now.
|
// if it's not available right now.
|
||||||
@ -1496,8 +1498,8 @@ RasterImage::RequestDecodeForSize(const nsIntSize& aSize, uint32_t aFlags)
|
|||||||
// synchronously decoding small images, while passing false has the effect of
|
// synchronously decoding small images, while passing false has the effect of
|
||||||
// decoding asynchronously, but that's not obvious from the argument name.
|
// decoding asynchronously, but that's not obvious from the argument name.
|
||||||
// This API needs to be reworked.
|
// This API needs to be reworked.
|
||||||
LookupFrame(0, targetSize, DecodeFlags(aFlags),
|
LookupFrame(0, targetSize, flags,
|
||||||
/* aShouldSyncNotify = */ shouldSyncDecodeSmallImages);
|
/* aShouldSyncNotify = */ shouldSyncDecodeIfFast);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user