void BitmapImage::cacheFrame(size_t index) { size_t numFrames = frameCount(); ASSERT(m_decodedSize == 0 || numFrames > 1); if (m_frames.size() < numFrames) m_frames.grow(numFrames); m_frames[index].m_frame = m_source.createFrameAtIndex(index); if (numFrames == 1 && m_frames[index].m_frame) checkForSolidColor(); m_frames[index].m_haveMetadata = true; m_frames[index].m_isComplete = m_source.frameIsCompleteAtIndex(index); if (repetitionCount(false) != cAnimationNone) m_frames[index].m_duration = m_source.frameDurationAtIndex(index); m_frames[index].m_hasAlpha = m_source.frameHasAlphaAtIndex(index); const IntSize frameSize(index ? m_source.frameSizeAtIndex(index) : m_size); if (frameSize != m_size) m_hasUniformFrameSize = false; if (m_frames[index].m_frame) { const int deltaBytes = frameBytes(frameSize); m_decodedSize += deltaBytes; if (imageObserver()) imageObserver()->decodedSizeChanged(this, deltaBytes); } }
void Image::cacheFrame(size_t index) { size_t numFrames = frameCount(); ASSERT(m_decodedSize == 0 || numFrames > 1); if (!m_frames.size() && shouldAnimate()) { // Snag the repetition count. m_repetitionCount = m_source.repetitionCount(); if (m_repetitionCount == cAnimationNone) m_animatingImageType = false; } if (m_frames.size() < numFrames) m_frames.resize(numFrames); m_frames[index].m_frame = m_source.createFrameAtIndex(index); if (numFrames == 1 && m_frames[index].m_frame) checkForSolidColor(); if (shouldAnimate()) m_frames[index].m_duration = m_source.frameDurationAtIndex(index); m_frames[index].m_hasAlpha = m_source.frameHasAlphaAtIndex(index); int sizeChange = m_frames[index].m_frame ? m_size.width() * m_size.height() * 4 : 0; if (sizeChange) { if (imageObserver()) imageObserver()->decodedSizeChanging(this, sizeChange); m_decodedSize += sizeChange; if (imageObserver()) imageObserver()->decodedSizeChanged(this, sizeChange); } }
BitmapImage::BitmapImage(CGImageRef cgImage, ImageObserver* observer) : Image(observer) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_decodedSize(0) , m_decodedPropertiesSize(0) , m_frameCount(1) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_haveFrameCount(true) { CGFloat width = CGImageGetWidth(cgImage); CGFloat height = CGImageGetHeight(cgImage); m_decodedSize = width * height * 4; m_size = IntSize(width, height); // Since we don't have a decoder, we can't figure out the image orientation. // Set m_sizeRespectingOrientation to be the same as m_size so it's not 0x0. m_sizeRespectingOrientation = IntSize(width, height); m_frames.grow(1); m_frames[0].m_frame = cgImage; m_frames[0].m_hasAlpha = true; m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
void BitmapImage::cacheFrame(size_t index) { size_t numFrames = frameCount(); ASSERT(m_decodedSize == 0 || numFrames > 1); if (m_frames.size() < numFrames) m_frames.grow(numFrames); m_frames[index].m_frame = m_source.createFrameAtIndex(index); if (numFrames == 1 && m_frames[index].m_frame) checkForSolidColor(); m_frames[index].m_orientation = m_source.orientationAtIndex(index); m_frames[index].m_haveMetadata = true; m_frames[index].m_isComplete = m_source.frameIsCompleteAtIndex(index); if (repetitionCount(false) != cAnimationNone) m_frames[index].m_duration = m_source.frameDurationAtIndex(index); m_frames[index].m_hasAlpha = m_source.frameHasAlphaAtIndex(index); m_frames[index].m_frameBytes = m_source.frameBytesAtIndex(index); const IntSize frameSize(index ? m_source.frameSizeAtIndex(index) : m_size); if (frameSize != m_size) m_hasUniformFrameSize = false; if (m_frames[index].m_frame) { int deltaBytes = safeCast<int>(m_frames[index].m_frameBytes); m_decodedSize += deltaBytes; // The fully-decoded frame will subsume the partially decoded data used // to determine image properties. deltaBytes -= m_decodedPropertiesSize; m_decodedPropertiesSize = 0; if (imageObserver()) imageObserver()->decodedSizeChanged(this, deltaBytes); } }
BitmapImage::BitmapImage(CGImageRef cgImage, ImageObserver* observer) : Image(observer) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_decodedSize(0) , m_haveFrameCount(true) , m_frameCount(1) { initPlatformData(); CGFloat width = CGImageGetWidth(cgImage); CGFloat height = CGImageGetHeight(cgImage); m_decodedSize = width * height * 4; m_size = IntSize(width, height); m_frames.grow(1); m_frames[0].m_frame = cgImage; m_frames[0].m_hasAlpha = true; m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
BitmapImage::BitmapImage(cairo_surface_t* surface, ImageObserver* observer) : Image(observer) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_decodedSize(0) , m_haveFrameCount(true) , m_frameCount(1) { initPlatformData(); // TODO: check to be sure this is an image surface int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); m_decodedSize = width * height * 4; m_size = IntSize(width, height); m_frames.grow(1); m_frames[0].m_frame = surface; m_frames[0].m_hasAlpha = cairo_surface_get_content(surface) != CAIRO_CONTENT_COLOR; m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
BitmapImage::BitmapImage(SkBitmapRef* ref, ImageObserver* observer) : Image(observer) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(0) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_isSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_decodedSize(0) , m_haveFrameCount(true) , m_frameCount(1) { initPlatformData(); m_size = IntSize(ref->bitmap().width(), ref->bitmap().height()); m_frames.grow(1); m_frames[0].m_frame = ref; m_frames[0].m_hasAlpha = !ref->bitmap().isOpaque(); checkForSolidColor(); ref->ref(); }
BitmapImage::BitmapImage(PassRefPtr<cairo_surface_t> nativeImage, ImageObserver* observer) : Image(observer) , m_size(cairoSurfaceSize(nativeImage.get())) , m_minimumSubsamplingLevel(0) , m_currentFrame(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_decodedSize(m_size.width() * m_size.height() * 4) , m_frameCount(1) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_haveFrameCount(true) { m_frames.grow(1); m_frames[0].m_hasAlpha = cairo_surface_get_content(nativeImage.get()) != CAIRO_CONTENT_COLOR; m_frames[0].m_frame = nativeImage; m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
BitmapImage::BitmapImage(PassRefPtr<cairo_surface_t> nativeImage, ImageObserver* observer) : Image(observer) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_decodedSize(0) , m_frameCount(1) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_haveFrameCount(true) { int width = cairo_image_surface_get_width(nativeImage.get()); int height = cairo_image_surface_get_height(nativeImage.get()); m_decodedSize = width * height * 4; m_size = IntSize(width, height); m_frames.grow(1); m_frames[0].m_hasAlpha = cairo_surface_get_content(nativeImage.get()) != CAIRO_CONTENT_COLOR; m_frames[0].m_frame = nativeImage; m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
BitmapImage::BitmapImage(PassRefPtr<NativeImageSkia> nativeImage, ImageObserver* observer) : Image(observer) , m_size(nativeImage->bitmap().width(), nativeImage->bitmap().height()) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_frameCount(1) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_haveFrameCount(true) { // Since we don't have a decoder, we can't figure out the image orientation. // Set m_sizeRespectingOrientation to be the same as m_size so it's not 0x0. m_sizeRespectingOrientation = m_size; m_frames.grow(1); m_frames[0].m_hasAlpha = !nativeImage->bitmap().isOpaque(); m_frames[0].m_frame = nativeImage; m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
BitmapImage::BitmapImage(QPixmap* pixmap, ImageObserver* observer) : Image(observer) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_decodedSize(0) , m_frameCount(1) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_haveFrameCount(true) { int width = pixmap->width(); int height = pixmap->height(); m_decodedSize = width * height * 4; m_size = IntSize(width, height); m_frames.grow(1); m_frames[0].m_frame = pixmap; m_frames[0].m_hasAlpha = pixmap->hasAlpha(); m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
void BitmapImage::cacheFrame(size_t index) { size_t numFrames = frameCount(); ASSERT(m_decodedSize == 0 || numFrames > 1); if (m_frames.size() < numFrames) m_frames.grow(numFrames); m_frames[index].m_frame = m_source.createFrameAtIndex(index); if (numFrames == 1 && m_frames[index].m_frame) checkForSolidColor(); m_frames[index].m_haveMetadata = true; m_frames[index].m_isComplete = m_source.frameIsCompleteAtIndex(index); if (repetitionCount(false) != cAnimationNone) m_frames[index].m_duration = m_source.frameDurationAtIndex(index); m_frames[index].m_hasAlpha = m_source.frameHasAlphaAtIndex(index); int sizeChange; if (index) { IntSize frameSize = m_source.frameSizeAtIndex(index); if (frameSize != m_size) m_hasUniformFrameSize = false; sizeChange = m_frames[index].m_frame ? frameSize.width() * frameSize.height() * 4 : 0; } else sizeChange = m_frames[index].m_frame ? m_size.width() * m_size.height() * 4 : 0; if (sizeChange) { m_decodedSize += sizeChange; if (imageObserver()) imageObserver()->decodedSizeChanged(this, sizeChange); } }
BitmapImage::BitmapImage(TiledImageOpenVG* tiledImage, ImageObserver* observer) : Image(observer) , m_size(tiledImage->size()) , m_currentFrame(0) , m_frames(1) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_desiredFrameStartTime(0) , m_frameCount(1) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(false) , m_allDataReceived(false) , m_haveSize(true) , m_sizeAvailable(true) , m_hasUniformFrameSize(true) , m_haveFrameCount(true) { ASSERT(m_size.width() > 0); ASSERT(m_size.height() > 0); m_decodedSize = m_size.width() * m_size.height() * 4; m_frames[0].m_frame = tiledImage; m_frames[0].m_hasAlpha = true; m_frames[0].m_isComplete = true; m_frames[0].m_haveMetadata = true; checkForSolidColor(); }
BitmapImage::BitmapImage(BalSurface* surface, ImageObserver* observer) : Image(observer) , m_currentFrame(0) , m_frames(0) , m_frameTimer(0) , m_repetitionCount(cAnimationNone) , m_repetitionCountStatus(Unknown) , m_repetitionsComplete(0) , m_isSolidColor(false) , m_checkedForSolidColor(false) , m_animationFinished(true) , m_allDataReceived(true) , m_haveSize(true) , m_sizeAvailable(true) , m_decodedSize(0) , m_haveFrameCount(true) , m_frameCount(1) { initPlatformData(); // TODO: check to be sure this is an image surface surface->refcount++; int width = surface->w; int height = surface->h; m_decodedSize = width * height * 4; m_size = IntSize(width, height); m_frames.grow(1); m_frames[0].m_frame = surface; checkForSolidColor(); }
bool BitmapImage::mayFillWithSolidColor() { if (!m_checkedForSolidColor && frameCount() > 0) { checkForSolidColor(); ASSERT(m_checkedForSolidColor); } return m_isSolidColor && !m_currentFrame; }
bool BitmapImage::mayFillWithSolidColor() { if (!m_checkedForSolidColor && frameCount() > 0) { checkForSolidColor(); // WINCE PORT: checkForSolidColor() doesn't set m_checkedForSolidColor until // it gets enough information to make final decision. #if !OS(WINCE) ASSERT(m_checkedForSolidColor); #endif } return m_isSolidColor && !m_currentFrame; }
void BitmapImage::cacheFrame(size_t index) { size_t numFrames = frameCount(); ASSERT(m_decodedSize == 0 || numFrames > 1); if (!m_frames.size() && shouldAnimate()) { // Snag the repetition count. Note that the repetition count may not be // accurate yet for GIFs; if we haven't gotten the count from the source // image yet, it will default to cAnimationLoopOnce, and we'll try and // read it again once the whole image is decoded. m_repetitionCount = m_source.repetitionCount(); if (m_repetitionCount == cAnimationNone) m_animatingImageType = false; } if (m_frames.size() < numFrames) m_frames.grow(numFrames); m_frames[index].m_frame = m_source.createFrameAtIndex(index); if (numFrames == 1 && m_frames[index].m_frame) checkForSolidColor(); if (shouldAnimate()) m_frames[index].m_duration = m_source.frameDurationAtIndex(index); m_frames[index].m_hasAlpha = m_source.frameHasAlphaAtIndex(index); int sizeChange; if (index) { IntSize frameSize = m_source.frameSizeAtIndex(index); if (frameSize != m_size) m_hasUniformFrameSize = false; sizeChange = m_frames[index].m_frame ? frameSize.width() * frameSize.height() * 4 : 0; } else sizeChange = m_frames[index].m_frame ? m_size.width() * m_size.height() * 4 : 0; if (sizeChange) { m_decodedSize += sizeChange; if (imageObserver()) imageObserver()->decodedSizeChanged(this, sizeChange); } }