Removing obsolete files (old imagelib cruft). r=pavlov, not part of the build.
git-svn-id: svn://10.0.0.236/trunk@122507 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
19d0236976
commit
7e8230a2e9
@ -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
|
||||
@ -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___ */
|
||||
Loading…
x
Reference in New Issue
Block a user