packages: xulrunner/fix-animated-gifs.patch (NEW) - fixes animated gifs fli...

megabajt megabajt at pld-linux.org
Wed Mar 2 23:45:07 CET 2011


Author: megabajt                     Date: Wed Mar  2 22:45:07 2011 GMT
Module: packages                      Tag: HEAD
---- Log message:
- fixes animated gifs flickering (patch from Gentoo)

---- Files affected:
packages/xulrunner:
   fix-animated-gifs.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/xulrunner/fix-animated-gifs.patch
diff -u /dev/null packages/xulrunner/fix-animated-gifs.patch:1.1
--- /dev/null	Wed Mar  2 23:45:07 2011
+++ packages/xulrunner/fix-animated-gifs.patch	Wed Mar  2 23:45:02 2011
@@ -0,0 +1,246 @@
+# HG changeset patch
+# User Rafał Mużyło <galtgendo at o2.pl>
+# Parent 69e253891ca3839b6d4b8f5cb7c0e6950bb66902
+Fix animated gif flickering bug 597174
+
+diff --git a/modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp b/modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp
+--- a/modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp
++++ b/modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp
+@@ -197,30 +197,29 @@ static NS_METHOD ReadDataOut(nsIInputStr
+ }
+ 
+ // Push any new rows according to mCurrentPass/mLastFlushedPass and
+ // mCurrentRow/mLastFlushedRow.  Note: caller is responsible for
+ // updating mlastFlushed{Row,Pass}.
+ nsresult
+ nsGIFDecoder2::FlushImageData(PRUint32 fromRow, PRUint32 rows)
+ {
+-  nsIntRect r(0, fromRow, mGIFStruct.width, rows);
++  nsIntRect r(mGIFStruct.x_offset, mGIFStruct.y_offset + fromRow, mGIFStruct.width, rows);
+ 
+   // Update image  
+   nsresult rv = mImageContainer->FrameUpdated(mGIFStruct.images_decoded, r);
+   if (NS_FAILED(rv)) {
+     return rv;
+   }
+ 
+   // Offset to the frame position
+   // Only notify observer(s) for first frame
+   if (!mGIFStruct.images_decoded && mObserver) {
+     PRUint32 imgCurFrame;
+     mImageContainer->GetCurrentFrameIndex(&imgCurFrame);
+-    r.y += mGIFStruct.y_offset;
+     mObserver->OnDataAvailable(nsnull, imgCurFrame == PRUint32(mGIFStruct.images_decoded), &r);
+   }
+   return NS_OK;
+ }
+ 
+ nsresult
+ nsGIFDecoder2::FlushImageData()
+ {
+diff --git a/modules/libpr0n/src/imgContainer.cpp b/modules/libpr0n/src/imgContainer.cpp
+--- a/modules/libpr0n/src/imgContainer.cpp
++++ b/modules/libpr0n/src/imgContainer.cpp
+@@ -415,16 +415,18 @@ nsresult imgContainer::InternalAddFrameH
+ 
+   nsAutoPtr<imgFrame> frame(aFrame);
+ 
+   if (paletteData && paletteLength)
+     frame->GetPaletteData(paletteData, paletteLength);
+ 
+   frame->GetImageData(imageData, imageLength);
+ 
++  frame->LockImageData();
++
+   mFrames.InsertElementAt(framenum, frame.forget());
+   mNumFrames++;
+ 
+   return NS_OK;
+ }
+                                   
+ nsresult imgContainer::InternalAddFrame(PRUint32 framenum,
+                                         PRInt32 aX, PRInt32 aY,
+@@ -440,16 +442,21 @@ nsresult imgContainer::InternalAddFrame(
+     return NS_ERROR_INVALID_ARG;
+ 
+   nsAutoPtr<imgFrame> frame(new imgFrame());
+   NS_ENSURE_TRUE(frame, NS_ERROR_OUT_OF_MEMORY);
+ 
+   nsresult rv = frame->Init(aX, aY, aWidth, aHeight, aFormat, aPaletteDepth);
+   NS_ENSURE_SUCCESS(rv, rv);
+ 
++  if (mFrames.Length() > 0) {
++    imgFrame *prevframe = mFrames.ElementAt(mFrames.Length() - 1);
++    prevframe->UnlockImageData();
++  }
++
+   if (mFrames.Length() == 0) {
+     return InternalAddFrameHelper(framenum, frame.forget(), imageData, imageLength, 
+                                   paletteData, paletteLength);
+   }
+ 
+   if (mFrames.Length() == 1) {
+     // Since we're about to add our second frame, initialize animation stuff
+     if (!ensureAnimExists())
+diff --git a/modules/libpr0n/src/imgFrame.cpp b/modules/libpr0n/src/imgFrame.cpp
+--- a/modules/libpr0n/src/imgFrame.cpp
++++ b/modules/libpr0n/src/imgFrame.cpp
+@@ -152,16 +152,17 @@ imgFrame::imgFrame() :
+   mBlendMethod(1), /* imgIContainer::kBlendOver */
+   mSinglePixel(PR_FALSE),
+   mNeverUseDeviceSurface(PR_FALSE),
+   mFormatChanged(PR_FALSE),
+   mCompositingFailed(PR_FALSE)
+ #ifdef USE_WIN_SURFACE
+   , mIsDDBSurface(PR_FALSE)
+ #endif
++  , mLocked(PR_FALSE)
+ {
+   static PRBool hasCheckedOptimize = PR_FALSE;
+   if (!hasCheckedOptimize) {
+     if (PR_GetEnv("MOZ_DISABLE_IMAGE_OPTIMIZE")) {
+       gDisableOptimize = PR_TRUE;
+     }
+     hasCheckedOptimize = PR_TRUE;
+   }
+@@ -413,18 +414,17 @@ void imgFrame::Draw(gfxContext *aContext
+   nsRefPtr<gfxASurface> surface;
+   gfxImageSurface::gfxImageFormat format;
+ 
+   NS_ASSERTION(!sourceRect.Intersect(subimage).IsEmpty(),
+                "We must be allowed to sample *some* source pixels!");
+ 
+   PRBool doTile = !imageRect.Contains(sourceRect);
+   if (doPadding || doPartialDecode) {
+-    gfxRect available = gfxRect(mDecoded.x, mDecoded.y, mDecoded.width, mDecoded.height) +
+-      gfxPoint(aPadding.left, aPadding.top);
++    gfxRect available = gfxRect(mDecoded.x, mDecoded.y, mDecoded.width, mDecoded.height);
+ 
+     if (!doTile && !mSinglePixel) {
+       // Not tiling, and we have a surface, so we can account for
+       // padding and/or a partial decode just by twiddling parameters.
+       // First, update our user-space fill rect.
+       sourceRect = sourceRect.Intersect(available);
+       gfxMatrix imageSpaceToUserSpace = userSpaceToImageSpace;
+       imageSpaceToUserSpace.Invert();
+@@ -708,17 +708,17 @@ nsresult imgFrame::ImageUpdated(const ns
+   mem->IsLowMemory(&lowMemory);
+   if (lowMemory)
+     return NS_ERROR_OUT_OF_MEMORY;
+ 
+   mDecoded.UnionRect(mDecoded, aUpdateRect);
+ 
+   // clamp to bounds, in case someone sends a bogus updateRect (I'm looking at
+   // you, gif decoder)
+-  nsIntRect boundsRect(0, 0, mSize.width, mSize.height);
++  nsIntRect boundsRect(mOffset, mSize);
+   mDecoded.IntersectRect(mDecoded, boundsRect);
+ 
+ #ifdef XP_MACOSX
+   if (mQuartzSurface)
+     mQuartzSurface->Flush();
+ #endif
+   return NS_OK;
+ }
+@@ -806,17 +806,23 @@ void imgFrame::GetPaletteData(PRUint32 *
+     *aPalette = (PRUint32 *) mPalettedImageData;
+     *length = PaletteDataLength();
+   }
+ }
+ 
+ nsresult imgFrame::LockImageData()
+ {
+   if (mPalettedImageData)
+-    return NS_OK;
++    return NS_ERROR_NOT_AVAILABLE;
++
++  NS_ABORT_IF_FALSE(!mLocked, "Trying to lock already locked image data.");
++  if (mLocked) {
++    return NS_ERROR_FAILURE;
++  }
++  mLocked = PR_TRUE;
+ 
+   if ((mOptSurface || mSinglePixel) && !mImageSurface) {
+     // Recover the pixels
+     mImageSurface = new gfxImageSurface(gfxIntSize(mSize.width, mSize.height),
+                                         gfxImageSurface::ImageFormatARGB32);
+     if (!mImageSurface || mImageSurface->CairoStatus())
+       return NS_ERROR_OUT_OF_MEMORY;
+ 
+@@ -832,23 +838,35 @@ nsresult imgFrame::LockImageData()
+ #ifdef USE_WIN_SURFACE
+     mWinSurface = nsnull;
+ #endif
+ #ifdef XP_MACOSX
+     mQuartzSurface = nsnull;
+ #endif
+   }
+ 
++  if (mImageSurface)
++    mImageSurface->Flush();
++
+   return NS_OK;
+ }
+ 
+ nsresult imgFrame::UnlockImageData()
+ {
+   if (mPalettedImageData)
+-    return NS_OK;
++    return NS_ERROR_NOT_AVAILABLE;
++
++  NS_ABORT_IF_FALSE(mLocked, "Unlocking an unlocked image!");
++  if (!mLocked) {
++    return NS_ERROR_FAILURE;
++  }
++  mLocked = PR_FALSE;
++
++  if (mImageSurface)
++    mImageSurface->MarkDirty();
+ 
+ #ifdef XP_MACOSX
+   if (mQuartzSurface)
+     mQuartzSurface->Flush();
+ #endif
+   return NS_OK;
+ }
+ 
+@@ -895,17 +913,17 @@ PRInt32 imgFrame::GetBlendMethod() const
+ 
+ void imgFrame::SetBlendMethod(PRInt32 aBlendMethod)
+ {
+   mBlendMethod = (PRInt8)aBlendMethod;
+ }
+ 
+ PRBool imgFrame::ImageComplete() const
+ {
+-  return mDecoded == nsIntRect(0, 0, mSize.width, mSize.height);
++  return mDecoded == nsIntRect(mOffset, mSize);
+ }
+ 
+ // A hint from the image decoders that this image has no alpha, even
+ // though we created is ARGB32.  This changes our format to RGB24,
+ // which in turn will cause us to Optimize() to RGB24.  Has no effect
+ // after Optimize() is called, though in all cases it will be just a
+ // performance win -- the pixels are still correct and have the A byte
+ // set to 0xff.
+diff --git a/modules/libpr0n/src/imgFrame.h b/modules/libpr0n/src/imgFrame.h
+--- a/modules/libpr0n/src/imgFrame.h
++++ b/modules/libpr0n/src/imgFrame.h
+@@ -167,16 +167,17 @@ private: // data
+ 
+   gfxASurface::gfxImageFormat mFormat;
+   PRInt8       mPaletteDepth;
+   PRInt8       mBlendMethod;
+   PRPackedBool mSinglePixel;
+   PRPackedBool mNeverUseDeviceSurface;
+   PRPackedBool mFormatChanged;
+   PRPackedBool mCompositingFailed;
++  PRPackedBool mLocked;
+ 
+ #ifdef XP_WIN
+   PRPackedBool mIsDDBSurface;
+ #endif
+ 
+ };
+ 
+ #endif /* imgFrame_h */
================================================================


More information about the pld-cvs-commit mailing list