本文整理汇总了C++中IsSizeDecode函数的典型用法代码示例。如果您正苦于以下问题:C++ IsSizeDecode函数的具体用法?C++ IsSizeDecode怎么用?C++ IsSizeDecode使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IsSizeDecode函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: PROFILER_LABEL
void
Decoder::Write(const char* aBuffer, uint32_t aCount)
{
PROFILER_LABEL("ImageDecoder", "Write");
// We're strict about decoder errors
NS_ABORT_IF_FALSE(!HasDecoderError(),
"Not allowed to make more decoder calls after error!");
// If a data error occured, just ignore future data
if (HasDataError())
return;
if (IsSizeDecode() && HasSize()) {
// More data came in since we found the size. We have nothing to do here.
return;
}
// Pass the data along to the implementation
WriteInternal(aBuffer, aCount);
// If we're a synchronous decoder and we need a new frame to proceed, let's
// create one and call it again.
while (mSynchronous && NeedsNewFrame() && !HasDataError()) {
nsresult rv = AllocateFrame();
if (NS_SUCCEEDED(rv)) {
// Tell the decoder to use the data it saved when it asked for a new frame.
WriteInternal(nullptr, 0);
}
}
}
开发者ID:RickEyre,项目名称:mozilla-central,代码行数:32,代码来源:Decoder.cpp
示例2: MOZ_ASSERT
void
Decoder::PostFrameStop(FrameBlender::FrameAlpha aFrameAlpha /* = FrameBlender::kFrameHasAlpha */,
FrameBlender::FrameDisposalMethod aDisposalMethod /* = FrameBlender::kDisposeKeep */,
int32_t aTimeout /* = 0 */,
FrameBlender::FrameBlendMethod aBlendMethod /* = FrameBlender::kBlendOver */)
{
// We should be mid-frame
MOZ_ASSERT(!IsSizeDecode(), "Stopping frame during a size decode");
MOZ_ASSERT(mInFrame, "Stopping frame when we didn't start one");
MOZ_ASSERT(mCurrentFrame, "Stopping frame when we don't have one");
// Update our state
mInFrame = false;
if (aFrameAlpha == FrameBlender::kFrameOpaque) {
mCurrentFrame->SetHasNoAlpha();
}
mCurrentFrame->SetFrameDisposalMethod(aDisposalMethod);
mCurrentFrame->SetRawTimeout(aTimeout);
mCurrentFrame->SetBlendMethod(aBlendMethod);
mCurrentFrame->ImageUpdated(mCurrentFrame->GetRect());
mProgress |= FLAG_FRAME_COMPLETE | FLAG_ONLOAD_UNBLOCKED;
}
开发者ID:dirkschulze,项目名称:gecko-dev,代码行数:25,代码来源:Decoder.cpp
示例3:
nsresult
nsIconDecoder::InitInternal()
{
// Fire OnStartDecode at init time to support bug 512435
if (!IsSizeDecode() && mObserver)
mObserver->OnStartDecode(nsnull);
return NS_OK;
}
开发者ID:lofter2011,项目名称:Icefox,代码行数:9,代码来源:nsIconDecoder.cpp
示例4: NotifyDone
nsresult
nsIconDecoder::FinishInternal()
{
// If we haven't notified of completion yet for a full/success decode, we
// didn't finish. Notify in error mode
if (!IsSizeDecode() && !mNotifiedDone)
NotifyDone(/* aSuccess = */ PR_FALSE);
return NS_OK;
}
开发者ID:lofter2011,项目名称:Icefox,代码行数:10,代码来源:nsIconDecoder.cpp
示例5:
void
nsJPEGDecoder::FinishInternal()
{
// If we're not in any sort of error case, force our state to JPEG_DONE.
if ((mState != JPEG_DONE && mState != JPEG_SINK_NON_JPEG_TRAILER) &&
(mState != JPEG_ERROR) &&
!IsSizeDecode()) {
mState = JPEG_DONE;
}
}
开发者ID:dirkschulze,项目名称:gecko-dev,代码行数:10,代码来源:nsJPEGDecoder.cpp
示例6: PROFILER_LABEL
void
Decoder::Write(const char* aBuffer, uint32_t aCount, DecodeStrategy aStrategy)
{
PROFILER_LABEL("ImageDecoder", "Write",
js::ProfileEntry::Category::GRAPHICS);
MOZ_ASSERT(NS_IsMainThread() || aStrategy == DecodeStrategy::ASYNC);
// We're strict about decoder errors
MOZ_ASSERT(!HasDecoderError(),
"Not allowed to make more decoder calls after error!");
// Begin recording telemetry data.
TimeStamp start = TimeStamp::Now();
mChunkCount++;
// Keep track of the total number of bytes written.
mBytesDecoded += aCount;
// If we're flushing data, clear the flag.
if (aBuffer == nullptr && aCount == 0) {
MOZ_ASSERT(mNeedsToFlushData, "Flushing when we don't need to");
mNeedsToFlushData = false;
}
// If a data error occured, just ignore future data.
if (HasDataError())
return;
if (IsSizeDecode() && HasSize()) {
// More data came in since we found the size. We have nothing to do here.
return;
}
// Pass the data along to the implementation
WriteInternal(aBuffer, aCount, aStrategy);
// If we're a synchronous decoder and we need a new frame to proceed, let's
// create one and call it again.
if (aStrategy == DecodeStrategy::SYNC) {
while (NeedsNewFrame() && !HasDataError()) {
nsresult rv = AllocateFrame();
if (NS_SUCCEEDED(rv)) {
// Use the data we saved when we asked for a new frame.
WriteInternal(nullptr, 0, aStrategy);
}
mNeedsToFlushData = false;
}
}
// Finish telemetry.
mDecodeTime += (TimeStamp::Now() - start);
}
开发者ID:dirkschulze,项目名称:gecko-dev,代码行数:55,代码来源:Decoder.cpp
示例7: NS_ABORT_IF_FALSE
void
Decoder::PostDecodeDone(int32_t aLoopCount /* = 0 */)
{
NS_ABORT_IF_FALSE(!IsSizeDecode(), "Can't be done with decoding with size decode!");
NS_ABORT_IF_FALSE(!mInFrame, "Can't be done decoding if we're mid-frame!");
NS_ABORT_IF_FALSE(!mDecodeDone, "Decode already done!");
mDecodeDone = true;
mImageMetadata.SetLoopCount(aLoopCount);
mProgress |= FLAG_DECODE_COMPLETE;
}
开发者ID:dirkschulze,项目名称:gecko-dev,代码行数:12,代码来源:Decoder.cpp
示例8: FinishInternal
void
Decoder::Finish()
{
// Implementation-specific finalization
if (!HasError())
FinishInternal();
// If the implementation left us mid-frame, finish that up.
if (mInFrame && !HasDecoderError())
PostFrameStop();
// If PostDecodeDone() has not been called, we need to sent teardown
// notifications.
if (!IsSizeDecode() && !mDecodeDone) {
// Log data errors to the error console
nsCOMPtr<nsIConsoleService> consoleService =
do_GetService(NS_CONSOLESERVICE_CONTRACTID);
nsCOMPtr<nsIScriptError2> errorObject =
do_CreateInstance(NS_SCRIPTERROR_CONTRACTID);
if (consoleService && errorObject && !HasDecoderError()) {
nsAutoString msg(NS_LITERAL_STRING("Image corrupt or truncated: ") +
NS_ConvertASCIItoUTF16(mImage->GetURIString()));
errorObject->InitWithWindowID
(msg.get(),
NS_ConvertUTF8toUTF16(mImage->GetURIString()).get(),
nsnull,
0, 0, nsIScriptError::errorFlag,
"Image", mImage->InnerWindowID()
);
nsCOMPtr<nsIScriptError> error = do_QueryInterface(errorObject);
consoleService->LogMessage(error);
}
// If we only have a data error, see if things are worth salvaging
bool salvage = !HasDecoderError() && mImage->GetNumFrames();
// If we're salvaging, say we finished decoding
if (salvage)
mImage->DecodingComplete();
// Fire teardown notifications
if (mObserver) {
mObserver->OnStopContainer(nsnull, mImage);
mObserver->OnStopDecode(nsnull, salvage ? NS_OK : NS_ERROR_FAILURE, nsnull);
}
}
}
开发者ID:mbrubeck,项目名称:mozilla-central,代码行数:51,代码来源:Decoder.cpp
示例9: NS_ABORT_IF_FALSE
void
Decoder::Init()
{
// No re-initializing
NS_ABORT_IF_FALSE(!mInitialized, "Can't re-initialize a decoder!");
// Fire OnStartDecode at init time to support bug 512435
if (!IsSizeDecode() && mObserver)
mObserver->OnStartDecode(nsnull);
// Implementation-specific initialization
InitInternal();
mInitialized = true;
}
开发者ID:ThinkerYzu,项目名称:mozilla-central,代码行数:14,代码来源:Decoder.cpp
示例10:
void
nsJPEGDecoder::FinishInternal()
{
/* If we're not in any sort of error case, flush the decoder.
*
* XXXbholley - It seems wrong that this should be necessary, but at the
* moment I'm just folding the contents of Flush() into Close() so that
* we can get rid of it.
*/
if ((mState != JPEG_DONE && mState != JPEG_SINK_NON_JPEG_TRAILER) &&
(mState != JPEG_ERROR) &&
!IsSizeDecode())
this->Write(nullptr, 0);
}
开发者ID:Lynart,项目名称:mozilla-central,代码行数:14,代码来源:nsJPEGDecoder.cpp
示例11: NS_ABORT_IF_FALSE
void
Decoder::PostDecodeDone(int32_t aLoopCount /* = 0 */)
{
NS_ABORT_IF_FALSE(!IsSizeDecode(), "Can't be done with decoding with size decode!");
NS_ABORT_IF_FALSE(!mInFrame, "Can't be done decoding if we're mid-frame!");
NS_ABORT_IF_FALSE(!mDecodeDone, "Decode already done!");
mDecodeDone = true;
mImageMetadata.SetLoopCount(aLoopCount);
mImageMetadata.SetIsNonPremultiplied(GetDecodeFlags() & DECODER_NO_PREMULTIPLY_ALPHA);
if (mObserver) {
mObserver->OnStopDecode(NS_OK);
}
}
开发者ID:RickEyre,项目名称:mozilla-central,代码行数:15,代码来源:Decoder.cpp
示例12: WebPIDelete
void
nsWEBPDecoder::FinishInternal()
{
// Flush the Decoder and let it free the output image buffer.
WebPIDelete(mDecoder);
WebPFreeDecBuffer(&mDecBuf);
// We should never make multiple frames
MOZ_ASSERT(GetFrameCount() <= 1, "Multiple WebP frames?");
// Send notifications if appropriate
if (!IsSizeDecode() && (GetFrameCount() == 1)) {
PostFrameStop();
PostDecodeDone();
}
}
开发者ID:AOSC-Dev,项目名称:Pale-Moon,代码行数:16,代码来源:nsWEBPDecoder.cpp
示例13:
void
nsJPEGDecoder::FinishInternal()
{
/* If we're not in any sort of error case, flush the decoder.
*
* XXXbholley - It seems wrong that this should be necessary, but at the
* moment I'm just folding the contents of Flush() into Close() so that
* we can get rid of it.
*
* XXX(seth): It'd be great to get rid of this. For now, we treat this as a
* write to a synchronous decoder, which means that this must be called only
* on the main thread. (That's asserted in Decoder::Finish and
* Decoder::FinishSharedDecoder.)
*/
if ((mState != JPEG_DONE && mState != JPEG_SINK_NON_JPEG_TRAILER) &&
(mState != JPEG_ERROR) &&
!IsSizeDecode())
this->Write(nullptr, 0, DECODE_SYNC);
}
开发者ID:Andrel322,项目名称:gecko-dev,代码行数:19,代码来源:nsJPEGDecoder.cpp
示例14: NS_ABORT_IF_FALSE
void
Decoder::Init(RasterImage* aImage, imgIDecoderObserver* aObserver)
{
// We should always have an image
NS_ABORT_IF_FALSE(aImage, "Can't initialize decoder without an image!");
// No re-initializing
NS_ABORT_IF_FALSE(mImage == nsnull, "Can't re-initialize a decoder!");
// Save our paremeters
mImage = aImage;
mObserver = aObserver;
// Fire OnStartDecode at init time to support bug 512435
if (!IsSizeDecode() && mObserver)
mObserver->OnStartDecode(nsnull);
// Implementation-specific initialization
InitInternal();
mInitialized = true;
}
开发者ID:mbrubeck,项目名称:mozilla-central,代码行数:21,代码来源:Decoder.cpp
示例15: NS_ABORT_IF_FALSE
void
Decoder::PostDecodeDone()
{
NS_ABORT_IF_FALSE(!IsSizeDecode(), "Can't be done with decoding with size decode!");
NS_ABORT_IF_FALSE(!mInFrame, "Can't be done decoding if we're mid-frame!");
NS_ABORT_IF_FALSE(!mDecodeDone, "Decode already done!");
mDecodeDone = true;
// Set premult before DecodingComplete(), since DecodingComplete() calls Optimize()
int frames = GetFrameCount();
bool isNonPremult = GetDecodeFlags() & DECODER_NO_PREMULTIPLY_ALPHA;
for (int i = 0; i < frames; i++) {
mImage.SetFrameAsNonPremult(i, isNonPremult);
}
// Notify
mImage.DecodingComplete();
if (mObserver) {
mObserver->OnStopContainer(nsnull, &mImage);
mObserver->OnStopDecode(nsnull, NS_OK, nsnull);
}
}
开发者ID:almet,项目名称:mozilla-central,代码行数:22,代码来源:Decoder.cpp
示例16: MOZ_ASSERT
void
nsPNGDecoder::WriteInternal(const char* aBuffer, uint32_t aCount)
{
MOZ_ASSERT(!HasError(), "Shouldn't call WriteInternal after error!");
// If we only want width/height, we don't need to go through libpng
if (IsSizeDecode()) {
// Are we done?
if (mHeaderBytesRead == BYTES_NEEDED_FOR_DIMENSIONS) {
return;
}
// Scan the header for the width and height bytes
uint32_t pos = 0;
const uint8_t* bptr = (uint8_t*)aBuffer;
while (pos < aCount && mHeaderBytesRead < BYTES_NEEDED_FOR_DIMENSIONS) {
// Verify the signature bytes
if (mHeaderBytesRead < sizeof(pngSignatureBytes)) {
if (bptr[pos] != nsPNGDecoder::pngSignatureBytes[mHeaderBytesRead]) {
PostDataError();
return;
}
}
// Get width and height bytes into the buffer
if ((mHeaderBytesRead >= WIDTH_OFFSET) &&
(mHeaderBytesRead < BYTES_NEEDED_FOR_DIMENSIONS)) {
mSizeBytes[mHeaderBytesRead - WIDTH_OFFSET] = bptr[pos];
}
pos ++;
mHeaderBytesRead ++;
}
// If we're done now, verify the data and set up the container
if (mHeaderBytesRead == BYTES_NEEDED_FOR_DIMENSIONS) {
// Grab the width and height, accounting for endianness (thanks libpng!)
uint32_t width = png_get_uint_32(mSizeBytes);
uint32_t height = png_get_uint_32(mSizeBytes + 4);
// Too big?
if ((width > MOZ_PNG_MAX_DIMENSION) || (height > MOZ_PNG_MAX_DIMENSION)) {
PostDataError();
return;
}
// Post our size to the superclass
PostSize(width, height);
}
// Otherwise, we're doing a standard decode
} else {
// libpng uses setjmp/longjmp for error handling - set the buffer
if (setjmp(png_jmpbuf(mPNG))) {
// We might not really know what caused the error, but it makes more
// sense to blame the data.
if (!HasError()) {
PostDataError();
}
png_destroy_read_struct(&mPNG, &mInfo, nullptr);
return;
}
// Pass the data off to libpng
png_process_data(mPNG, mInfo, (unsigned char*)aBuffer, aCount);
}
}
开发者ID:hobinjk,项目名称:gecko-dev,代码行数:73,代码来源:nsPNGDecoder.cpp
示例17: NS_ABORT_IF_FALSE
void
nsJPEGDecoder::WriteInternal(const char* aBuffer, uint32_t aCount,
DecodeStrategy)
{
mSegment = (const JOCTET*)aBuffer;
mSegmentLen = aCount;
NS_ABORT_IF_FALSE(!HasError(), "Shouldn't call WriteInternal after error!");
// Return here if there is a fatal error within libjpeg.
nsresult error_code;
// This cast to nsresult makes sense because setjmp() returns whatever we
// passed to longjmp(), which was actually an nsresult.
if ((error_code = (nsresult)setjmp(mErr.setjmp_buffer)) != NS_OK) {
if (error_code == NS_ERROR_FAILURE) {
PostDataError();
// Error due to corrupt stream - return NS_OK and consume silently
// so that ImageLib doesn't throw away a partial image load
mState = JPEG_SINK_NON_JPEG_TRAILER;
PR_LOG(GetJPEGDecoderAccountingLog(), PR_LOG_DEBUG,
("} (setjmp returned NS_ERROR_FAILURE)"));
return;
} else {
// Error due to reasons external to the stream (probably out of
// memory) - let ImageLib attempt to clean up, even though
// mozilla is seconds away from falling flat on its face.
PostDecoderError(error_code);
mState = JPEG_ERROR;
PR_LOG(GetJPEGDecoderAccountingLog(), PR_LOG_DEBUG,
("} (setjmp returned an error)"));
return;
}
}
PR_LOG(GetJPEGLog(), PR_LOG_DEBUG,
("[this=%p] nsJPEGDecoder::Write -- processing JPEG data\n", this));
switch (mState) {
case JPEG_HEADER: {
LOG_SCOPE(GetJPEGLog(), "nsJPEGDecoder::Write -- entering JPEG_HEADER"
" case");
// Step 3: read file parameters with jpeg_read_header()
if (jpeg_read_header(&mInfo, TRUE) == JPEG_SUSPENDED) {
PR_LOG(GetJPEGDecoderAccountingLog(), PR_LOG_DEBUG,
("} (JPEG_SUSPENDED)"));
return; // I/O suspension
}
int sampleSize = mImage.GetRequestedSampleSize();
if (sampleSize > 0) {
mInfo.scale_num = 1;
mInfo.scale_denom = sampleSize;
}
// Used to set up image size so arrays can be allocated
jpeg_calc_output_dimensions(&mInfo);
// Post our size to the superclass
PostSize(mInfo.output_width, mInfo.output_height,
ReadOrientationFromEXIF());
if (HasError()) {
// Setting the size led to an error.
mState = JPEG_ERROR;
return;
}
// If we're doing a size decode, we're done.
if (IsSizeDecode()) {
return;
}
// We're doing a full decode.
if (mCMSMode != eCMSMode_Off &&
(mInProfile = GetICCProfile(mInfo)) != nullptr) {
uint32_t profileSpace = qcms_profile_get_color_space(mInProfile);
bool mismatch = false;
#ifdef DEBUG_tor
fprintf(stderr, "JPEG profileSpace: 0x%08X\n", profileSpace);
#endif
switch (mInfo.jpeg_color_space) {
case JCS_GRAYSCALE:
if (profileSpace == icSigRgbData) {
mInfo.out_color_space = JCS_RGB;
} else if (profileSpace != icSigGrayData) {
mismatch = true;
}
break;
case JCS_RGB:
if (profileSpace != icSigRgbData) {
mismatch = true;
}
break;
case JCS_YCbCr:
if (profileSpace == icSigRgbData) {
mInfo.out_color_space = JCS_RGB;
} else {
// qcms doesn't support ycbcr
mismatch = true;
//.........这里部分代码省略.........
开发者ID:dirkschulze,项目名称:gecko-dev,代码行数:101,代码来源:nsJPEGDecoder.cpp
示例18: NS_ABORT_IF_FALSE
//.........这里部分代码省略.........
mGIFStruct.suffix[i] = i;
mGIFStruct.stackp = mGIFStruct.stack;
GETN(1, gif_sub_block);
}
break;
/* All GIF files begin with "GIF87a" or "GIF89a" */
case gif_type:
if (!strncmp((char*)q, "GIF89a", 6)) {
mGIFStruct.version = 89;
} else if (!strncmp((char*)q, "GIF87a", 6)) {
mGIFStruct.version = 87;
} else {
mGIFStruct.state = gif_error;
break;
}
GETN(7, gif_global_header);
break;
case gif_global_header:
/* This is the height and width of the "screen" or
* frame into which images are rendered. The
* individual images can be smaller than the
* screen size and located with an origin anywhere
* within the screen.
*/
mGIFStruct.screen_width = GETINT16(q);
mGIFStruct.screen_height = GETINT16(q + 2);
mGIFStruct.global_colormap_depth = (q[4]&0x07) + 1;
if (IsSizeDecode()) {
MOZ_ASSERT(!mGIFOpen, "Gif should not be open at this point");
PostSize(mGIFStruct.screen_width, mGIFStruct.screen_height);
return;
}
// screen_bgcolor is not used
//mGIFStruct.screen_bgcolor = q[5];
// q[6] = Pixel Aspect Ratio
// Not used
// float aspect = (float)((q[6] + 15) / 64.0);
if (q[4] & 0x80) { /* global map */
// Get the global colormap
const uint32_t size = (3 << mGIFStruct.global_colormap_depth);
if (len < size) {
// Use 'hold' pattern to get the global colormap
GETN(size, gif_global_colormap);
break;
}
// Copy everything, go to colormap state to do CMS correction
memcpy(mGIFStruct.global_colormap, buf, size);
buf += size;
len -= size;
GETN(0, gif_global_colormap);
break;
}
GETN(1, gif_image_start);
break;
case gif_global_colormap:
// Everything is already copied into global_colormap
开发者ID:CodeSpeaker,项目名称:gecko-dev,代码行数:67,代码来源:nsGIFDecoder2.cpp
示例19: FinishInternal
void
Decoder::Finish(RasterImage::eShutdownIntent aShutdownIntent)
{
// Implementation-specific finalization
if (!HasError())
FinishInternal();
// If the implementation left us mid-frame, finish that up.
if (mInFrame && !HasError())
PostFrameStop();
// If PostDecodeDone() has not been called, we need to sent teardown
// notifications.
if (!IsSizeDecode() && !mDecodeDone) {
// Log data errors to the error console
nsCOMPtr<nsIConsoleService> consoleService =
do_GetService(NS_CONSOLESERVICE_CONTRACTID);
nsCOMPtr<nsIScriptError> errorObject =
do_CreateInstance(NS_SCRIPTERROR_CONTRACTID);
if (consoleService && errorObject && !HasDecoderError()) {
nsAutoString msg(NS_LITERAL_STRING("Image corrupt or truncated: ") +
NS_ConvertUTF8toUTF16(mImage.GetURIString()));
if (NS_SUCCEEDED(errorObject->InitWithWindowID(
msg,
NS_ConvertUTF8toUTF16(mImage.GetURIString()),
EmptyString(), 0, 0, nsIScriptError::errorFlag,
"Image", mImage.InnerWindowID()
))) {
consoleService->LogMessage(errorObject);
}
}
bool usable = true;
if (aShutdownIntent != RasterImage::eShutdownIntent_NotNeeded && !HasDecoderError()) {
// If we only have a data error, we're usable if we have at least one complete frame.
if (GetCompleteFrameCount() == 0) {
usable = false;
}
}
// If we're usable, do exactly what we should have when the decoder
// completed.
if (usable) {
if (mInFrame) {
PostFrameStop();
}
PostDecodeDone();
} else {
if (mObserver) {
mObserver->OnStopDecode(NS_ERROR_FAILURE);
}
}
}
// Set image metadata before calling DecodingComplete, because DecodingComplete calls Optimize().
mImageMetadata.SetOnImage(&mImage);
if (mDecodeDone) {
mImage.DecodingComplete();
}
}
开发者ID:RickEyre,项目名称:mozilla-central,代码行数:64,代码来源:Decoder.cpp
示例20: NS_ABORT_IF_FALSE
void
nsIconDecoder::WriteInternal(const char* aBuffer, uint32_t aCount,
DecodeStrategy)
{
NS_ABORT_IF_FALSE(!HasError(), "Shouldn't call WriteInternal after error!");
// We put this here to avoid errors about crossing initialization with case
// jumps on linux.
uint32_t bytesToRead = 0;
// Loop until the input data is gone
while (aCount > 0) {
switch (mState) {
case iconStateStart:
// Grab the width
mWidth = (uint8_t)*aBuffer;
// Book Keeping
aBuffer++;
aCount--;
mState = iconStateHaveHeight;
break;
case iconStateHaveHeight:
// Grab the Height
mHeight = (uint8_t)*aBuffer;
// Post our size to the superclass
PostSize(mWidth, mHeight);
PostHasTransparency();
if (HasError()) {
// Setting the size led to an error.
mState = iconStateFinished;
return;
}
// If We're doing a size decode, we're done
if (IsSizeDecode()) {
mState = iconStateFinished;
break;
}
if (!mImageData) {
PostDecoderError(NS_ERROR_OUT_OF_MEMORY);
return;
}
// Book Keeping
aBuffer++;
aCount--;
mState = iconStateReadPixels;
break;
case iconStateReadPixels: {
// How many bytes are we reading?
bytesToRead = std::min(aCount, mImageDataLength - mPixBytesRead);
// Copy the bytes
memcpy(mImageData + mPixBytesRead, aBuffer, bytesToRead);
// Performance isn't critical here, so our update rectangle is
// always the full icon
nsIntRect r(0, 0, mWidth, mHeight);
// Invalidate
PostInvalidation(r);
// Book Keeping
aBuffer += bytesToRead;
aCount -= bytesToRead;
mPixBytesRead += bytesToRead;
// If we've got all the pixel bytes, we're finished
if (mPixBytesRead == mImageDataLength) {
PostFrameStop();
PostDecodeDone();
mState = iconStateFinished;
}
break;
}
case iconStateFinished:
// Consume all excess data silently
aCount = 0;
break;
}
}
}
开发者ID:dirkschulze,项目名称:gecko-dev,代码行数:95,代码来源:nsIconDecoder.cpp
注:本文中的IsSizeDecode函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论