diff --git a/mozilla/layout/html/base/src/nsHTMLImageLoader.cpp b/mozilla/layout/html/base/src/nsHTMLImageLoader.cpp
deleted file mode 100644
index 5921a04319b..00000000000
--- a/mozilla/layout/html/base/src/nsHTMLImageLoader.cpp
+++ /dev/null
@@ -1,580 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-#include "nsHTMLImageLoader.h"
-#include "nsIStyleContext.h"
-#include "nsFrame.h"
-#include "nsIURL.h"
-#include "nsNetUtil.h"
-
-#ifdef DEBUG
-#undef NOISY_IMAGE_LOADING
-#else
-#undef NOISY_IMAGE_LOADING
-#endif
-
-MOZ_DECL_CTOR_COUNTER(nsHTMLImageLoader)
-
-nsHTMLImageLoader::nsHTMLImageLoader()
- : mBaseURL(nsnull),
- mFrame(nsnull),
- mCallBack(nsnull),
- mClosure(nsnull),
- mImageLoader(nsnull),
- mAllFlags(0),
- mIntrinsicImageSize(0, 0),
- mComputedImageSize(0, 0)
-{
- MOZ_COUNT_CTOR(nsHTMLImageLoader);
-}
-
-nsHTMLImageLoader::~nsHTMLImageLoader()
-{
- MOZ_COUNT_DTOR(nsHTMLImageLoader);
- NS_IF_RELEASE(mBaseURL);
- NS_IF_RELEASE(mImageLoader);
-}
-
-void
-nsHTMLImageLoader::Init(nsIFrame* aFrame,
- nsHTMLImageLoaderCB aCallBack,
- void* aClosure,
- nsIURI* aBaseURL,
- const nsString& aURLSpec)
-{
- mFrame = aFrame;
- mCallBack = aCallBack;
- mClosure = aClosure;
- mBaseURL = aBaseURL;
- NS_IF_ADDREF(mBaseURL);
- SetURL(aURLSpec);
-}
-
-nsIImage*
-nsHTMLImageLoader::GetImage()
-{
- nsIImage* image = nsnull;
- if (mImageLoader) {
- mImageLoader->GetImage(&image);
- }
- return image;
-}
-
-void
-nsHTMLImageLoader::GetNaturalImageSize(PRUint32* naturalWidth, PRUint32* naturalHeight)
-{
- *naturalWidth = 0;
- *naturalHeight = 0;
- if (mImageLoader) {
- mImageLoader->GetNaturalImageSize(naturalWidth, naturalHeight);
- }
-
-}
-
-void
-nsHTMLImageLoader::SetURL(const nsString& aNewSpec)
-{
- mURLSpec = aNewSpec;
- mURLSpec.Trim(" \t\n\r");
- if (mBaseURL && !aNewSpec.IsEmpty()) {
- nsString empty;
- nsresult rv;
- rv = NS_MakeAbsoluteURI(mURL, mURLSpec, mBaseURL);
- if (NS_FAILED(rv)) {
- mURL = mURLSpec;
- }
- } else {
- mURL = mURLSpec;
- }
-}
-
-void
-nsHTMLImageLoader::StopLoadImage(nsIPresContext* aPresContext)
-{
- if (mImageLoader) {
- aPresContext->StopLoadImage(mFrame, mImageLoader);
- NS_RELEASE(mImageLoader);
- }
-}
-
-void
-nsHTMLImageLoader::StopAllLoadImages(nsIPresContext* aPresContext)
-{
- aPresContext->StopAllLoadImagesFor(mFrame, mFrame);
-}
-
-nsresult
-nsHTMLImageLoader::ImageLoadCB(nsIPresContext* aPresContext,
- nsIFrameImageLoader* aLoader,
- nsIFrame* aFrame,
- void* aClosure,
- PRUint32 aStatus)
-{
- if (aClosure) {
- ((nsHTMLImageLoader*)aClosure)->Update(aPresContext, aFrame, aStatus);
- }
- return NS_OK;
-}
-
-void
-nsHTMLImageLoader::Update(nsIPresContext* aPresContext,
- nsIFrame* aFrame,
- PRUint32 aStatus)
-{
-#ifdef NOISY_IMAGE_LOADING
- nsFrame::ListTag(stdout, aFrame);
- printf(": update: status=%x [loader=%p] callBack=%p squelch=%s\n",
- aStatus, mImageLoader, mCallBack,
- mFlags.mSquelchCallback ? "yes" : "no");
-#endif
-
- if (!mFlags.mNeedSizeNotification &&
- NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE & aStatus) {
- // remove the size available bit since it is not needed
- aStatus &= ~NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE;
- // check if any status left
- if (aStatus == NS_IMAGE_LOAD_STATUS_NONE)
- return;
- }
-
- if (NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE & aStatus) {
- if (mImageLoader) {
- mImageLoader->GetSize(mIntrinsicImageSize);
- if (mFlags.mNeedIntrinsicImageSize) {
- mFlags.mHaveIntrinsicImageSize = PR_TRUE;
- }
- }
- }
-
- // Pass on update to the user of this object if they want it
- if (mCallBack) {
- // We squelch the status size callback in the case where the client doesn't
- // want the size returned. However, don't squelch a status that says the image
- // failed to load
- if ((NS_IMAGE_LOAD_STATUS_ERROR & aStatus) || !mFlags.mSquelchCallback) {
- (*mCallBack)(aPresContext, this, aFrame, mClosure, aStatus);
- }
- }
-}
-
-// The prefix for special "internal" images that are well known
-#define GOPHER_SPEC "internal-gopher-"
-
-// Note: sizeof a string constant includes the \0 at the end so
-// subtract one
-#define GOPHER_SPEC_SIZE (sizeof(GOPHER_SPEC) - 1)
-
-nsresult
-nsHTMLImageLoader::StartLoadImage(nsIPresContext* aPresContext)
-{
- if (!mFrame) {
- // We were not initialized!
- return NS_ERROR_NULL_POINTER;
- }
- if (mURL.IsEmpty()) {
- return NS_OK;
- }
-
- // Note: navigator 4.* and earlier releases ignored the base tags
- // effect on the builtin images. So we do too. Use mURLSpec instead
- // of the absolute url...
- nsAutoString internalImageURLSpec;
- nsString* urlSpec = &mURL;
- if (mURLSpec.CompareWithConversion(GOPHER_SPEC, PR_FALSE, GOPHER_SPEC_SIZE) == 0) {
- // We found a special image source value that refers to a
- // builtin image. Rewrite the source url as a resource url.
- urlSpec = &internalImageURLSpec;
- mURLSpec.Mid(internalImageURLSpec, GOPHER_SPEC_SIZE,
- mURLSpec.Length() - GOPHER_SPEC_SIZE);
- internalImageURLSpec = NS_LITERAL_STRING("resource:/res/html/gopher-") +
- internalImageURLSpec +
- NS_LITERAL_STRING(".gif");
- }
-
- // This is kind of sick, but its possible that we will get a
- // notification *before* we have setup mImageLoader. To get around
- // this, we let the pres-context store into mImageLoader and sort
- // things after it returns.
- nsIFrameImageLoader* oldLoader = mImageLoader;
- nsSize* sizeToLoadWidth = nsnull;
- if (!mFlags.mAutoImageSize && !mFlags.mNeedIntrinsicImageSize) {
- sizeToLoadWidth = &mComputedImageSize;
- }
- nsresult rv = aPresContext->StartLoadImage(*urlSpec, nsnull,
- sizeToLoadWidth,
- mFrame, ImageLoadCB, (void*)this,
- mFrame, &mImageLoader);
-#ifdef NOISY_IMAGE_LOADING
- nsFrame::ListTag(stdout, mFrame);
- printf(": loading image '");
- fputs(NS_LossyConvertUCS2toASCII(mURL).get(), stdout);
- printf("' @ ");
- if (mFlags.mNeedIntrinsicImageSize) {
- printf("intrinsic size ");
- }
- printf("%d,%d; oldLoader=%p newLoader=%p",
- mComputedImageSize.width, mComputedImageSize.height,
- oldLoader, mImageLoader);
- if (sizeToLoadWidth) {
- printf(" sizeToLoadWidth=%d,%d",
- sizeToLoadWidth->width, sizeToLoadWidth->height);
- }
- else {
- printf(" autoImageSize=%s needIntrinsicImageSize=%s",
- mFlags.mAutoImageSize ? "yes" : "no",
- mFlags.mNeedIntrinsicImageSize ? "yes" : "no");
- }
- printf("\n");
-#endif
-
- if (oldLoader != mImageLoader) {
- if (nsnull != oldLoader) {
- // Tell presentation context we are done with the old image loader
- aPresContext->StopLoadImage(mFrame, oldLoader);
- }
- }
-
- // Release the old image loader
- NS_IF_RELEASE(oldLoader);
-
- return rv;
-}
-
-void
-nsHTMLImageLoader::UpdateURLSpec(nsIPresContext* aPresContext,
- const nsString& aNewSpec)
-{
- SetURL(aNewSpec);
-
- // Start image loading with the previously computed size information
- StartLoadImage(aPresContext);
-}
-
-#define MINMAX(_value,_min,_max) \
- ((_value) < (_min) \
- ? (_min) \
- : ((_value) > (_max) \
- ? (_max) \
- : (_value)))
-
-PRBool
-nsHTMLImageLoader::GetDesiredSize(nsIPresContext* aPresContext,
- const nsHTMLReflowState* aReflowState,
- nsHTMLReflowMetrics& aDesiredSize)
-{
- nscoord widthConstraint = NS_INTRINSICSIZE;
- nscoord heightConstraint = NS_INTRINSICSIZE;
- PRBool fixedContentWidth = PR_FALSE;
- PRBool fixedContentHeight = PR_FALSE;
-
- if (mFlags.mInRecalcMode)
- { // only true after an unconstrained reflow of a %-width image recieved after we've fetched our intrinsic width
- // really! This case is for bug 39901 and 38396. The point is, we've already
- // calculated everything we need and we want to just return it right away.
- // This is somewhat fragile, since it makes an assumption about the way reflow works.
- mFlags.mInRecalcMode=0; // clear the mode
- // block code will lie to us, so use our already-computed values
- aDesiredSize.width = mComputedImageSize.width;
- aDesiredSize.height = mComputedImageSize.height;
- return PR_TRUE;
- }
-
- nscoord minWidth, maxWidth, minHeight, maxHeight;
-
- if (aReflowState) {
- // Determine whether the image has fixed content width
- widthConstraint = aReflowState->mComputedWidth;
- minWidth = aReflowState->mComputedMinWidth;
- maxWidth = aReflowState->mComputedMaxWidth;
- if (NS_INTRINSICSIZE != widthConstraint) {
- fixedContentWidth = PR_TRUE;
- }
- else if (mFlags.mHaveIntrinsicImageSize) {
- // At this point we know that the width value was not
- // constrained and that we now know the intrinsic size of the
- // image.
- //
- // The css2 spec states that if a min/max width value is
- // provided then it acts as a substitute value for the "width"
- // property, if it applies. Therefore, we will force the
- // fixedContentWidth flag to true in these cases.
- if ((0 != minWidth) ||
- (NS_UNCONSTRAINEDSIZE != maxWidth))
- {
- // Use the intrinsic image width for the min-max comparisons,
- // since the width property is "auto".
- widthConstraint = mIntrinsicImageSize.width;
- fixedContentWidth = PR_TRUE;
- }
- // Check the special case where we have the intrinsic width
- // (already tested to get into this block of code)
- // and it's an unconstrained reflow, and we are %-width
- // This special case is for bug 39901 and 38396
- else if (aReflowState &&
- (NS_UNCONSTRAINEDSIZE == aReflowState->availableWidth) &&
- (eStyleUnit_Percent==aReflowState->mStylePosition->mWidth.GetUnit()))
- {
- // Use the intrinsic image width
- // since the width property is percent (uncalcuable at this time).
- widthConstraint = mIntrinsicImageSize.width;
- fixedContentWidth = PR_TRUE;
- mFlags.mInRecalcMode = PR_TRUE; // we set up this state for bug 39901 and 38396
- }
- }
-
- // Determine whether the image has fixed content height
- heightConstraint = aReflowState->mComputedHeight;
- minHeight = aReflowState->mComputedMinHeight;
- maxHeight = aReflowState->mComputedMaxHeight;
- if (NS_UNCONSTRAINEDSIZE != heightConstraint) {
- fixedContentHeight = PR_TRUE;
- }
- else if (mFlags.mHaveIntrinsicImageSize) {
- // At this point we know that the height value was not
- // constrained and that we now know the intrinsic size of the
- // image.
- //
- // The css2 spec states that if a min/max height value is
- // provided then it acts as a substitute value for the "height"
- // property, if it applies. Therefore, we will force the
- // fixedContentHeight flag to true in these cases.
- if ((0 != minHeight) ||
- (NS_UNCONSTRAINEDSIZE != maxHeight)) {
- // Use the intrinsic image height for the min-max comparisons,
- // since the height property is "auto".
- heightConstraint = mIntrinsicImageSize.height;
- fixedContentHeight = PR_TRUE;
- }
- }
- }
- else {
- minWidth = minHeight = 0;
- maxWidth = maxHeight = NS_UNCONSTRAINEDSIZE;
- }
-
- float p2t, t2p;
- aPresContext->GetPixelsToTwips(&p2t);
- aPresContext->GetTwipsToPixels(&t2p);
-
- for (;;) {
- PRBool haveComputedSize = PR_FALSE;
- PRBool needIntrinsicImageSize = PR_FALSE;
-
- nscoord newWidth, newHeight;
- mFlags.mAutoImageSize = PR_FALSE;
- mFlags.mNeedSizeNotification = PR_FALSE;
- if (fixedContentWidth) {
- if (fixedContentHeight) {
- newWidth = MINMAX(widthConstraint, minWidth, maxWidth);
- newHeight = MINMAX(heightConstraint, minHeight, maxHeight);
- haveComputedSize = PR_TRUE;
- }
- else {
- // We have a width, and an auto height. Compute height from
- // width once we have the intrinsic image size.
- newWidth = MINMAX(widthConstraint, minWidth, maxWidth);
- if (mFlags.mHaveIntrinsicImageSize) {
- float width = mIntrinsicImageSize.width
- ? (float) mIntrinsicImageSize.width
- : (float) mIntrinsicImageSize.height; // avoid divide by zero
- float height = (float) mIntrinsicImageSize.height;
-
- // snap the width to the nearest pixel value to prevent a
- // feedback loop.
- PRInt32 pixelWidth = NSTwipsToIntPixels(newWidth + nscoord(p2t / 2), t2p);
- newWidth = NSIntPixelsToTwips(pixelWidth, p2t);
-
- newHeight = (nscoord)
- NSToIntRound(newWidth * height / width);
- newHeight = MINMAX(newHeight, minHeight, maxHeight);
- haveComputedSize = PR_TRUE;
- }
- else {
- newHeight = 1;
- needIntrinsicImageSize = PR_TRUE;
- mFlags.mNeedSizeNotification = PR_TRUE;
- }
- }
- }
- else if (fixedContentHeight) {
- // We have a height, and an auto width. Compute width from height
- // once we have the intrinsic image size.
-
- // otherwise, we really have auto-width based on height
- newHeight = MINMAX(heightConstraint, minHeight, maxHeight);
- if (mFlags.mHaveIntrinsicImageSize) {
- float width = (float) mIntrinsicImageSize.width;
- float height = mIntrinsicImageSize.height
- ? (float) mIntrinsicImageSize.height
- : (float) mIntrinsicImageSize.width; // avoid divide by zero
-
- // snap the height to the nearest pixel value to prevent a
- // feedback loop.
- PRInt32 pixelHeight = NSTwipsToIntPixels(newHeight + nscoord(p2t / 2), t2p);
- newHeight = NSIntPixelsToTwips(pixelHeight, p2t);
-
- newWidth = (nscoord)
- NSToIntRound(newHeight * width / height);
- newWidth = MINMAX(newWidth, minWidth, maxWidth);
- haveComputedSize = PR_TRUE;
- }
- else {
- newWidth = 1;
- needIntrinsicImageSize = PR_TRUE;
- mFlags.mNeedSizeNotification = PR_TRUE;
- }
- }
- else {
- mFlags.mAutoImageSize = PR_TRUE;
- if (mFlags.mHaveIntrinsicImageSize) {
- newWidth = MINMAX(mIntrinsicImageSize.width, minWidth, maxWidth);
- newHeight = MINMAX(mIntrinsicImageSize.height, minHeight, maxHeight);
- haveComputedSize = PR_TRUE;
- }
- else {
- newWidth = 1;
- newHeight = 1;
- needIntrinsicImageSize = PR_TRUE;
- mFlags.mNeedSizeNotification = PR_TRUE;
- }
- }
-
- mFlags.mNeedIntrinsicImageSize = needIntrinsicImageSize;
- mFlags.mHaveComputedSize = haveComputedSize;
- mComputedImageSize.width = newWidth;
- mComputedImageSize.height = newHeight;
-#ifdef NOISY_IMAGE_LOADING
- nsFrame::ListTag(stdout, mFrame);
- printf(": %s%scomputedSize=%d,%d min=%d,%d max=%d,%d fixed=%s,%s\n",
- mFlags.mNeedIntrinsicImageSize ? "need-instrinsic-size " : "",
- mFlags.mHaveComputedSize ? "have-computed-size " : "",
- mComputedImageSize.width, mComputedImageSize.height,
- minWidth, minHeight, maxWidth, maxHeight,
- fixedContentWidth ? "yes" : "no",
- fixedContentHeight ? "yes" : "no");
-#endif
-
- // Load the image at the desired size
- if ((0 != newWidth) && (0 != newHeight))
- {
- // Make sure we squelch a callback to the client of this image
- // loader during a start-load-image. Its possible the image we
- // want is ready to go and will therefore fire a notification
- // during the StartLoadImage call. Since this routine is already
- // returning size information there is no point in passing on the
- // callbacks to the client.
- mFlags.mSquelchCallback = PR_TRUE;
- StartLoadImage(aPresContext);
- mFlags.mSquelchCallback = PR_FALSE;
-
- // See if we just got the intrinsic size
- if (mFlags.mNeedIntrinsicImageSize && mFlags.mHaveIntrinsicImageSize) {
- // We just learned our intrinisic size. Start over from the top...
-#ifdef NOISY_IMAGE_LOADING
- printf(" *** size arrived during StartLoadImage, looping...\n");
-#endif
- continue;
- }
- }
- break;
- }
-
- aDesiredSize.width = mComputedImageSize.width;
- aDesiredSize.height = mComputedImageSize.height;
-#ifdef NOISY_IMAGE_LOADING
- printf("nsHTMLImageLoader::GetDesiredSize returning %d, %d\n",
- aDesiredSize.width, aDesiredSize.height);
-#endif
- if ((mFlags.mNeedIntrinsicImageSize && !mFlags.mHaveIntrinsicImageSize) ||
- mFlags.mNeedSizeNotification) {
- return PR_FALSE;
- }
- return PR_TRUE;
-}
-
-PRBool
-nsHTMLImageLoader::GetLoadImageFailed() const
-{
- PRBool result = PR_FALSE;
-
- if (nsnull != mImageLoader) {
- // Ask the image loader whether the load failed
- PRUint32 loadStatus;
- mImageLoader->GetImageLoadStatus(&loadStatus);
- result = 0 != (loadStatus & NS_IMAGE_LOAD_STATUS_ERROR);
- return result;
- }
-
- result = mFlags.mLoadImageFailed ? PR_TRUE : PR_FALSE;
- return result;
-}
-
-PRUint32
-nsHTMLImageLoader::GetLoadStatus() const
-{
- PRUint32 loadStatus = NS_IMAGE_LOAD_STATUS_NONE;
- if (mImageLoader) {
- mImageLoader->GetImageLoadStatus(&loadStatus);
- }
- return loadStatus;
-}
-
-void
-nsHTMLImageLoader::GetIntrinsicSize(nsSize& aSize)
-{
- if (mImageLoader) {
- mImageLoader->GetIntrinsicSize(aSize);
- } else {
- aSize.SizeTo(0, 0);
- }
-}
-
-#ifdef DEBUG
-// Note: this doesn't factor in:
-// -- the mBaseURL (it might be shared)
-// -- the mFrame (that will be counted elsewhere most likely)
-// -- the mClosure (we don't know what type it is)
-// -- the mImageLoader (it might be shared)
-void
-nsHTMLImageLoader::SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const
-{
- PRUint32 sum = sizeof(*this) - sizeof(mURLSpec) - sizeof(mURL);
- PRUint32 ss;
- mURLSpec.SizeOf(aHandler, &ss); sum += ss;
- mURL.SizeOf(aHandler, &ss); sum += ss;
- *aResult = sum;
-}
-#endif
diff --git a/mozilla/layout/html/base/src/nsHTMLImageLoader.h b/mozilla/layout/html/base/src/nsHTMLImageLoader.h
deleted file mode 100644
index ca3f353691d..00000000000
--- a/mozilla/layout/html/base/src/nsHTMLImageLoader.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-#ifndef nsHTMLImageLoader_h___
-#define nsHTMLImageLoader_h___
-
-#include "nsString.h"
-#include "nsIPresContext.h"
-#include "nsSize.h"
-
-class nsIFrame;
-class nsImageMap;
-class nsIImage;
-class nsIURI;
-class nsISizeOfHandler;
-struct nsHTMLReflowState;
-struct nsHTMLReflowMetrics;
-struct nsSize;
-
-class nsHTMLImageLoader;
-typedef nsresult (*nsHTMLImageLoaderCB)(nsIPresContext* aPresContext,
- nsHTMLImageLoader* aLoader,
- nsIFrame* aFrame,
- void* aClosure,
- PRUint32 aStatus);
-
-/**
- * HTML image loader. This is designed to encapsulate the loading
- * and sizing process of html images (basically so that the logic
- * can be reused in the image button form control code and the html
- * image layout code).
- */
-class nsHTMLImageLoader {
-public:
- nsHTMLImageLoader();
- ~nsHTMLImageLoader();
-
- void Init(nsIFrame* aFrame, nsHTMLImageLoaderCB aCallBack, void* aClosure,
- nsIURI* aBaseURL, const nsString& aURLSpec);
-
- nsIImage* GetImage();
-
- void GetURLSpec(nsString& aResult) {
- aResult = mURLSpec;
- }
-
- void UpdateURLSpec(nsIPresContext* aPresContext,
- const nsString& aNewSpec);
-
- // Stop the current image load request from loading
- void StopLoadImage(nsIPresContext* aPresContext);
-
- // Stop all image load requests from loading
- void StopAllLoadImages(nsIPresContext* aPresContext);
-
- // Get the desired size for the image. If aReflowState is not null
- // then the image will be scaled to fit the reflow
- // constraints. Otherwise, the image will be left at its intrinsic
- // size.
- PRBool GetDesiredSize(nsIPresContext* aPresContext,
- const nsHTMLReflowState* aReflowState,
- nsHTMLReflowMetrics& aDesiredSize);
-
- PRUint32 GetLoadStatus() const;
-
- PRBool GetLoadImageFailed() const;
-
- PRBool IsImageSizeKnown() const {
- return mFlags.mHaveComputedSize;
- }
-
- // Get the intrinsic (natural) size for the image. Returns 0,0 if
- // the dimensions are not known
- void GetIntrinsicSize(nsSize& aSize);
- void GetNaturalImageSize(PRUint32* naturalWidth, PRUint32* naturalHeight);
-
-#ifdef DEBUG
- void SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const;
-#endif
-
-protected:
- static nsresult ImageLoadCB(nsIPresContext* aPresContext,
- nsIFrameImageLoader* aLoader,
- nsIFrame* aFrame,
- void* aClosure,
- PRUint32 aStatus);
-
- void Update(nsIPresContext* aPresContext,
- nsIFrame* aFrame,
- PRUint32 aStatus);
-
- void SetURL(const nsString& aNewSpec);
-
- nsresult StartLoadImage(nsIPresContext* aPresContext);
-
- nsIURI* mBaseURL;
- nsIFrame* mFrame;
- nsHTMLImageLoaderCB mCallBack;
- void* mClosure;
-
- nsString mURLSpec;
- nsString mURL;
-
- nsIFrameImageLoader* mImageLoader;
-
-public:
- struct _indFlags {
- PRUint32 mLoadImageFailed : 1;
- PRUint32 mHaveIntrinsicImageSize : 1;
- PRUint32 mNeedIntrinsicImageSize : 1;
- PRUint32 mAutoImageSize : 1;
- PRUint32 mHaveComputedSize : 1;
- PRUint32 mSquelchCallback : 1;
- PRUint32 mNeedSizeNotification : 1;
- PRUint32 mInRecalcMode : 1; // a special flag used only in very rare circumstances, see nsHTMLImageLoader::GetDesiredSize
- } ;
-
-protected:
- union {
- PRUint32 mAllFlags;
- _indFlags mFlags;
- };
-
- nsSize mIntrinsicImageSize;
- nsSize mComputedImageSize;
-};
-
-#endif /* nsHTMLImageLoader_h___ */