diff --git a/layout/html/base/src/nsHTMLImage.cpp b/layout/html/base/src/nsHTMLImage.cpp index daacd828349..cff3501230a 100644 --- a/layout/html/base/src/nsHTMLImage.cpp +++ b/layout/html/base/src/nsHTMLImage.cpp @@ -33,6 +33,7 @@ #include "nsIImageMap.h" #include "nsILinkHandler.h" #include "nsIURL.h" +#include "nsCSSLayout.h" static NS_DEFINE_IID(kIHTMLDocumentIID, NS_IHTMLDOCUMENT_IID); static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID); @@ -138,6 +139,13 @@ NS_METHOD ImageFrame::Paint(nsIPresContext& aPresContext, nsIRenderingContext& aRenderingContext, const nsRect& aDirtyRect) { + if ((0 == mRect.width) || (0 == mRect.height)) { + // Do not render when given a zero area. This avoids some useless + // scaling work while we wait for our image dimensions to arrive + // asynchronously. + return NS_OK; + } + nsIImage* image = GetImage(aPresContext); if (nsnull == image) { return NS_OK; @@ -289,36 +297,59 @@ void ImageFrame::GetDesiredSize(nsIPresContext* aPresContext, nsReflowMetrics& aDesiredSize, const nsSize& aMaxSize) { - // XXX temporary hack: Get width & height from attributes - nscoord width = -1; - nscoord height = -1; - ImagePart* part = (ImagePart*) mContent; - nsHTMLValue value; - nsContentAttr ca; - ca = part->nsHTMLTagContent::GetAttribute(nsHTMLAtoms::width, value); - if (eContentAttr_HasValue == ca) { - // XXX Percents - width = value.GetPixelValue(); + nsSize styleSize; + PRIntn ss = nsCSSLayout::GetStyleSize(aPresContext, this, styleSize); + if (0 != ss) { + if (NS_SIZE_HAS_BOTH == ss) { + aDesiredSize.width = styleSize.width; + aDesiredSize.height = styleSize.height; + } + else { + // Preserve aspect ratio of image with unbound dimension. + nsIImage* image = GetImage(*aPresContext); + if (nsnull == image) { + // Provide a dummy size for now; later on when the image size + // shows up we will reflow to the new size. + aDesiredSize.width = 0; + aDesiredSize.height = 0; + } + else { + float p2t = aPresContext->GetPixelsToTwips(); + float imageWidth = image->GetWidth() * p2t; + float imageHeight = image->GetHeight() * p2t; + if (0.0f != imageHeight) { + if (0 != (ss & NS_SIZE_HAS_WIDTH)) { + // We have a width, and an auto height. Compute height + // from width. + aDesiredSize.width = styleSize.width; + aDesiredSize.height = + nscoord(styleSize.width * imageHeight / imageWidth); + } + else { + // We have a height and an auto width. Compute width from + // height. + aDesiredSize.height = styleSize.height; + aDesiredSize.width = + nscoord(styleSize.height * imageWidth / imageHeight); + } + } + else { + // Screwy image + aDesiredSize.width = 0; + aDesiredSize.height = 0; + } + } + } } - ca = part->nsHTMLTagContent::GetAttribute(nsHTMLAtoms::height, value); - if (eContentAttr_HasValue == ca) { - // XXX Percents - height = value.GetPixelValue(); - } - - float p2t = aPresContext->GetPixelsToTwips(); - if ((0 < width) && (0 < height)) { - // Use dimensions from style attributes - aDesiredSize.width = nscoord(width * p2t); - aDesiredSize.height = nscoord(height * p2t); - } else { + else { nsIImage* image = GetImage(*aPresContext); if (nsnull == image) { - // XXX Here is where we trigger a resize-reflow later on; or block - // layout or whatever our policy wants to be - aDesiredSize.width = nscoord(50 * p2t); - aDesiredSize.height = nscoord(50 * p2t); + // Provide a dummy size for now; later on when the image size + // shows up we will reflow to the new size. + aDesiredSize.width = 0; + aDesiredSize.height = 0; } else { + float p2t = aPresContext->GetPixelsToTwips(); aDesiredSize.width = nscoord(image->GetWidth() * p2t); aDesiredSize.height = nscoord(image->GetHeight() * p2t); } @@ -565,6 +596,7 @@ void ImagePart::MapAttributesInto(nsIStyleContext* aContext, break; } } + MapImagePropertiesInto(aContext, aPresContext); } nsresult