LayoutSize CachedImage::imageSizeForRenderer(const RenderObject* renderer, float multiplier, SizeType sizeType) { ASSERT(!isPurgeable()); if (!m_image) return LayoutSize(); LayoutSize imageSize(m_image->size()); #if ENABLE(CSS_IMAGE_ORIENTATION) if (renderer && m_image->isBitmapImage()) { ImageOrientationDescription orientationDescription(renderer->shouldRespectImageOrientation(), renderer->style().imageOrientation()); if (orientationDescription.respectImageOrientation() == RespectImageOrientation) imageSize = LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrientation(orientationDescription)); } #else if (m_image->isBitmapImage() && (renderer && renderer->shouldRespectImageOrientation() == RespectImageOrientation)) #if !PLATFORM(IOS) imageSize = LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrientation()); #else { // On iOS, the image may have been subsampled to accommodate our size restrictions. However // we should tell the renderer what the original size was. imageSize = LayoutSize(toBitmapImage(m_image.get())->originalSizeRespectingOrientation()); } else if (m_image->isBitmapImage())
LayoutSize ImageResource::imageSizeForLayoutObject(const LayoutObject* layoutObject, float multiplier, SizeType sizeType) { ASSERT(!isPurgeable()); if (!m_image) return LayoutSize(); LayoutSize imageSize; if (m_image->isBitmapImage() && (layoutObject && layoutObject->shouldRespectImageOrientation() == RespectImageOrientation)) imageSize = LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrientation()); else if (m_image->isSVGImage() && sizeType == NormalSize) imageSize = LayoutSize(svgImageSizeForLayoutObject(layoutObject)); else imageSize = LayoutSize(m_image->size()); if (multiplier == 1.0f) return imageSize; // Don't let images that have a width/height >= 1 shrink below 1 when zoomed. float widthScale = m_image->hasRelativeWidth() ? 1.0f : multiplier; float heightScale = m_image->hasRelativeHeight() ? 1.0f : multiplier; LayoutSize minimumSize(imageSize.width() > 0 ? 1 : 0, imageSize.height() > 0 ? 1 : 0); imageSize.scale(widthScale, heightScale); imageSize.clampToMinimumSize(minimumSize); ASSERT(multiplier != 1.0f || (imageSize.width().fraction() == 0.0f && imageSize.height().fraction() == 0.0f)); return imageSize; }
PassOwnPtr<DragImage> DragImage::create(Image* image, RespectImageOrientationEnum shouldRespectImageOrientation, float deviceScaleFactor) { if (!image) return nullptr; RefPtr<NativeImageSkia> bitmap = image->nativeImageForCurrentFrame(); if (!bitmap) return nullptr; if (image->isBitmapImage()) { ImageOrientation orientation = DefaultImageOrientation; BitmapImage* bitmapImage = toBitmapImage(image); IntSize sizeRespectingOrientation = bitmapImage->sizeRespectingOrientation(); if (shouldRespectImageOrientation == RespectImageOrientation) orientation = bitmapImage->currentFrameOrientation(); if (orientation != DefaultImageOrientation) { FloatRect destRect(FloatPoint(), sizeRespectingOrientation); if (orientation.usesWidthAsHeight()) destRect = destRect.transposedRect(); SkBitmap skBitmap; skBitmap.setConfig( SkBitmap::kARGB_8888_Config, sizeRespectingOrientation.width(), sizeRespectingOrientation.height()); if (!skBitmap.allocPixels()) return nullptr; SkCanvas canvas(skBitmap); canvas.concat(affineTransformToSkMatrix(orientation.transformFromDefault(sizeRespectingOrientation))); canvas.drawBitmapRect(bitmap->bitmap(), 0, destRect); return adoptPtr(new DragImage(skBitmap, deviceScaleFactor)); } } SkBitmap skBitmap; #if defined(SBROWSER_GPU_RASTERIZATION_ENABLE) if (!bitmap->bitmap().copyTo(&skBitmap, kPMColor_SkColorType)) #else if (!bitmap->bitmap().copyTo(&skBitmap, SkBitmap::kARGB_8888_Config)) #endif return nullptr; return adoptPtr(new DragImage(skBitmap, deviceScaleFactor)); }
PassOwnPtr<DragImage> DragImage::create(Image* image, RespectImageOrientationEnum shouldRespectImageOrientation, float deviceScaleFactor) { if (!image) return nullptr; RefPtr<NativeImageSkia> bitmap = image->nativeImageForCurrentFrame(); if (!bitmap) return nullptr; if (image->isBitmapImage()) { ImageOrientation orientation = DefaultImageOrientation; BitmapImage* bitmapImage = toBitmapImage(image); IntSize sizeRespectingOrientation = bitmapImage->sizeRespectingOrientation(); if (shouldRespectImageOrientation == RespectImageOrientation) orientation = bitmapImage->currentFrameOrientation(); if (orientation != DefaultImageOrientation) { FloatRect destRect(FloatPoint(), sizeRespectingOrientation); if (orientation.usesWidthAsHeight()) destRect = destRect.transposedRect(); SkBitmap skBitmap; if (!skBitmap.tryAllocN32Pixels(sizeRespectingOrientation.width(), sizeRespectingOrientation.height())) return nullptr; SkCanvas canvas(skBitmap); canvas.concat(affineTransformToSkMatrix(orientation.transformFromDefault(sizeRespectingOrientation))); canvas.drawBitmapRect(bitmap->bitmap(), 0, destRect); return adoptPtr(new DragImage(skBitmap, deviceScaleFactor)); } } SkBitmap skBitmap; if (!bitmap->bitmap().copyTo(&skBitmap, kN32_SkColorType)) return nullptr; return adoptPtr(new DragImage(skBitmap, deviceScaleFactor)); }
PassOwnPtr<DragImage> DragImage::create(Image* image, RespectImageOrientationEnum shouldRespectImageOrientation, float deviceScaleFactor, InterpolationQuality interpolationQuality, float opacity, FloatSize imageScale) { if (!image) return nullptr; RefPtr<SkImage> skImage = image->imageForCurrentFrame(); if (!skImage) return nullptr; ImageOrientation orientation; if (shouldRespectImageOrientation == RespectImageOrientation && image->isBitmapImage()) orientation = toBitmapImage(image)->currentFrameOrientation(); SkBitmap bm; RefPtr<SkImage> resizedImage = resizeAndOrientImage(skImage.release(), orientation, imageScale, opacity, interpolationQuality); if (!resizedImage || !resizedImage->asLegacyBitmap(&bm, SkImage::kRO_LegacyBitmapMode)) return nullptr; return adoptPtr(new DragImage(bm, deviceScaleFactor, interpolationQuality)); }
if (renderer && m_image->isBitmapImage()) { ImageOrientationDescription orientationDescription(renderer->shouldRespectImageOrientation(), renderer->style().imageOrientation()); if (orientationDescription.respectImageOrientation() == RespectImageOrientation) imageSize = LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrientation(orientationDescription)); } #else if (m_image->isBitmapImage() && (renderer && renderer->shouldRespectImageOrientation() == RespectImageOrientation)) #if !PLATFORM(IOS) imageSize = LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrientation()); #else { // On iOS, the image may have been subsampled to accommodate our size restrictions. However // we should tell the renderer what the original size was. imageSize = LayoutSize(toBitmapImage(m_image.get())->originalSizeRespectingOrientation()); } else if (m_image->isBitmapImage()) imageSize = LayoutSize(toBitmapImage(m_image.get())->originalSize()); #endif // !PLATFORM(IOS) #endif // ENABLE(CSS_IMAGE_ORIENTATION) else if (m_image->isSVGImage() && sizeType == UsedSize) { imageSize = LayoutSize(m_svgImageCache->imageSizeForRenderer(renderer)); } if (multiplier == 1.0f) return imageSize; // Don't let images that have a width/height >= 1 shrink below 1 when zoomed. float widthScale = m_image->hasRelativeWidth() ? 1.0f : multiplier; float heightScale = m_image->hasRelativeHeight() ? 1.0f : multiplier; LayoutSize minimumSize(imageSize.width() > 0 ? 1 : 0, imageSize.height() > 0 ? 1 : 0); imageSize.scale(widthScale, heightScale);