static bool containerSizeIsSetForLayoutObject(ImageResource& cachedImage, const LayoutObject* layoutObject) { const Image* image = cachedImage.image(); // If a container size has been specified for this layoutObject, then // imageForLayoutObject() will return the SVGImageForContainer while image() // will return the underlying SVGImage. return !image->isSVGImage() || image != cachedImage.imageForLayoutObject(layoutObject); }
static void writeImageToDataObject(DataObject* dataObject, Element* element, const KURL& url) { // Shove image data into a DataObject for use as a file ImageResource* cachedImage = getImageResource(element); if (!cachedImage || !cachedImage->imageForLayoutObject(element->layoutObject()) || !cachedImage->isLoaded()) return; SharedBuffer* imageBuffer = cachedImage->imageForLayoutObject(element->layoutObject())->data(); if (!imageBuffer || !imageBuffer->size()) return; String imageExtension = cachedImage->image()->filenameExtension(); ASSERT(!imageExtension.isEmpty()); // Determine the filename for the file contents of the image. String filename = cachedImage->response().suggestedFilename(); if (filename.isEmpty()) filename = url.lastPathComponent(); String fileExtension; if (filename.isEmpty()) { filename = element->getAttribute(HTMLNames::altAttr); } else { // Strip any existing extension. Assume that alt text is usually not a filename. int extensionIndex = filename.reverseFind('.'); if (extensionIndex != -1) { fileExtension = filename.substring(extensionIndex + 1); filename.truncate(extensionIndex); } } if (!fileExtension.isEmpty() && fileExtension != imageExtension) { String imageMimeType = MIMETypeRegistry::getMIMETypeForExtension(imageExtension); ASSERT(imageMimeType.startsWith("image/")); // Use the file extension only if it has imageMimeType: it's untrustworthy otherwise. if (imageMimeType == MIMETypeRegistry::getMIMETypeForExtension(fileExtension)) imageExtension = fileExtension; } imageExtension = "." + imageExtension; validateFilename(filename, imageExtension); dataObject->addSharedBuffer(filename + imageExtension, imageBuffer); }
PassRefPtr<Image> CSSCrossfadeValue::image(LayoutObject* renderer, const IntSize& size) { if (size.isEmpty()) return nullptr; Document* document = &renderer->document(); ImageResource* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document); ImageResource* cachedToImage = cachedImageForCSSValue(m_toValue.get(), document); if (!cachedFromImage || !cachedToImage) return Image::nullImage(); Image* fromImage = cachedFromImage->imageForLayoutObject(renderer); Image* toImage = cachedToImage->imageForLayoutObject(renderer); if (!fromImage || !toImage) return Image::nullImage(); m_generatedImage = CrossfadeGeneratedImage::create(fromImage, toImage, m_percentageValue->getFloatValue(), fixedSize(renderer), size); return m_generatedImage.release(); }
IntSize CSSCrossfadeValue::fixedSize(const LayoutObject* renderer) { float percentage = m_percentageValue->getFloatValue(); float inversePercentage = 1 - percentage; Document* document = &renderer->document(); ImageResource* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document); ImageResource* cachedToImage = cachedImageForCSSValue(m_toValue.get(), document); if (!cachedFromImage || !cachedToImage) return IntSize(); IntSize fromImageSize = cachedFromImage->imageForLayoutObject(renderer)->size(); IntSize toImageSize = cachedToImage->imageForLayoutObject(renderer)->size(); // Rounding issues can cause transitions between images of equal size to return // a different fixed size; avoid performing the interpolation if the images are the same size. if (fromImageSize == toImageSize) return fromImageSize; return IntSize(fromImageSize.width() * inversePercentage + toImageSize.width() * percentage, fromImageSize.height() * inversePercentage + toImageSize.height() * percentage); }