Hi,

Now that we have cairo-1.10.2, that has fixed many annoying bugs
present in version 1.10.0,
we can safely re-enable system-cairo for mozilla-firefox and
mozilla-thunderbird.
The only remaining problem was with animated gifs, but this[1] patch,
backported from
the firefox-4 branch, fixes it:

[1] 
http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/net-libs/xulrunner/files/fix-animated-gifs.patch

Unfortunately, the above trick cannot be applied to firefox35,
seamonkey and sunbird, which will
remain with their in-tree cairo.

What about the following diff?

CIAO
David

Index: devel/xulrunner/1.9/Makefile
===================================================================
RCS file: /cvs/ports/devel/xulrunner/1.9/Makefile,v
retrieving revision 1.36
diff -u -p -r1.36 Makefile
--- devel/xulrunner/1.9/Makefile        18 Jan 2011 12:37:44 -0000      1.36
+++ devel/xulrunner/1.9/Makefile        19 Jan 2011 14:01:13 -0000
@@ -5,7 +5,7 @@ FFX_VERSION =           3.6.13
 MOZILLA_BRANCH =       1.9.2
 MOZILLA_PROJECT =      xulrunner1.9
 DISTNAME =             firefox-${FFX_VERSION}.source
-REVISION-main =                2
+REVISION-main =                3
 REVISION-devel =       1

 MASTER_SITES = 
http://releases.mozilla.org/pub/mozilla.org/firefox/releases/${FFX_VERSION}/source/
@@ -26,6 +26,8 @@ PKG_ARGS+=    -Djit=0 -Damd64=0
 # use files and patches from www/mozilla-firefox
 PATCHDIR =             ${PORTSDIR}/www/mozilla-firefox/patches
 FILESDIR =             ${PORTSDIR}/www/mozilla-firefox/files
+
+CONFIGURE_ARGS +=      --enable-system-cairo

 MOZILLA_DATADIRS =     chrome components defaults dictionaries greprefs \
                        icons modules plugins res
Index: mail/mozilla-thunderbird/Makefile
===================================================================
RCS file: /cvs/ports/mail/mozilla-thunderbird/Makefile,v
retrieving revision 1.116
diff -u -p -r1.116 Makefile
--- mail/mozilla-thunderbird/Makefile   18 Jan 2011 12:37:44 -0000      1.116
+++ mail/mozilla-thunderbird/Makefile   19 Jan 2011 13:57:47 -0000
@@ -12,7 +12,7 @@ MOZILLA_CODENAME =    mail

 MULTI_PACKAGES =       -main -lightning
 PKGNAME-main =         ${PKGNAME}
-REVISION-main =                2
+REVISION-main =                3
 PKGNAME-lightning =    lightning-1.0beta2
 EPOCH-lightning =      0
 REVISION-lightning =   13
@@ -69,6 +69,8 @@ BUILD_DEPENDS +=      archivers/unzip #to unz
 # build lightning xpi
 CONFIGURE_ARGS +=      --enable-calendar \
                        --enable-official-branding
+
+CONFIGURE_ARGS +=      --enable-system-cairo

 ALL_TARGET =   default

Index: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
===================================================================
RCS file: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
diff -N 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
       19
Jan 2011 13:57:47 -0000
@@ -0,0 +1,20 @@
+$OpenBSD$
+--- mozilla/modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp.orig        Tue
Dec  7 17:35:50 2010
++++ mozilla/modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp     Wed Jan 19
11:28:20 2011
+@@ -202,7 +202,7 @@ static NS_METHOD ReadDataOut(nsIInputStream* in,
+ 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);
+@@ -215,7 +215,6 @@ nsGIFDecoder2::FlushImageData(PRUint32 fromRow, PRUint
+   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;
Index: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgContainer_cpp
===================================================================
RCS file: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgContainer_cpp
diff -N 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgContainer_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgContainer_cpp
 19
Jan 2011 13:57:47 -0000
@@ -0,0 +1,24 @@
+$OpenBSD$
+--- mozilla/modules/libpr0n/src/imgContainer.cpp.orig  Tue Dec  7 17:35:50 2010
++++ mozilla/modules/libpr0n/src/imgContainer.cpp       Wed Jan 19 11:28:20 2011
+@@ -420,6 +420,8 @@ nsresult imgContainer::InternalAddFrameHelper(PRUint32
+
+   frame->GetImageData(imageData, imageLength);
+
++  frame->LockImageData();
++
+   mFrames.InsertElementAt(framenum, frame.forget());
+   mNumFrames++;
+
+@@ -444,6 +446,11 @@ nsresult imgContainer::InternalAddFrame(PRUint32 frame
+
+   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,
Index: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_cpp
===================================================================
RCS file: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_cpp
diff -N 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_cpp 
    19
Jan 2011 13:57:47 -0000
@@ -0,0 +1,83 @@
+$OpenBSD$
+--- mozilla/modules/libpr0n/src/imgFrame.cpp.orig      Tue Dec  7 17:35:50 2010
++++ mozilla/modules/libpr0n/src/imgFrame.cpp   Wed Jan 19 11:28:20 2011
+@@ -157,6 +157,7 @@ imgFrame::imgFrame() :
+ #ifdef USE_WIN_SURFACE
+   , mIsDDBSurface(PR_FALSE)
+ #endif
++  , mLocked(PR_FALSE)
+ {
+   static PRBool hasCheckedOptimize = PR_FALSE;
+   if (!hasCheckedOptimize) {
+@@ -418,8 +419,7 @@ void imgFrame::Draw(gfxContext *aContext, gfxPattern::
+
+   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
+@@ -713,7 +713,7 @@ nsresult imgFrame::ImageUpdated(const nsIntRect &aUpda
+
+   // 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
+@@ -811,8 +811,14 @@ void imgFrame::GetPaletteData(PRUint32 **aPalette, PRU
+ 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),
+@@ -837,14 +843,26 @@ nsresult imgFrame::LockImageData()
+ #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();
+@@ -900,7 +918,7 @@ void imgFrame::SetBlendMethod(PRInt32 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
Index: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_h
===================================================================
RCS file: 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_h
diff -N 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ 
mail/mozilla-thunderbird/patches/patch-mozilla_modules_libpr0n_src_imgFrame_h   
    19
Jan 2011 13:57:47 -0000
@@ -0,0 +1,11 @@
+$OpenBSD$
+--- mozilla/modules/libpr0n/src/imgFrame.h.orig        Tue Dec  7 17:35:50 2010
++++ mozilla/modules/libpr0n/src/imgFrame.h     Wed Jan 19 11:28:20 2011
+@@ -172,6 +172,7 @@ class imgFrame (private)
+   PRPackedBool mNeverUseDeviceSurface;
+   PRPackedBool mFormatChanged;
+   PRPackedBool mCompositingFailed;
++  PRPackedBool mLocked;
+
+ #ifdef XP_WIN
+   PRPackedBool mIsDDBSurface;
Index: www/mozilla-firefox/Makefile
===================================================================
RCS file: /cvs/ports/www/mozilla-firefox/Makefile,v
retrieving revision 1.165
diff -u -p -r1.165 Makefile
--- www/mozilla-firefox/Makefile        18 Jan 2011 12:33:38 -0000      1.165
+++ www/mozilla-firefox/Makefile        19 Jan 2011 13:57:48 -0000
@@ -7,7 +7,7 @@ MOZILLA_VERSION =       3.6.13
 MOZILLA_BRANCH =       1.9.2
 MOZILLA_PROJECT =      mozilla-firefox
 MOZILLA_CODENAME =     browser
-REVISION =             2
+REVISION =             3

 SO_VERSION =   22.2
 # NOTE: Must bump minor version if any shlib's are removed from the
@@ -39,6 +39,8 @@ CONFIGURE_STYLE =     autoconf no-autoheader
 CONFIGURE_ARGS +=      --enable-official-branding
 # --with-system-png=${LOCALBASE}
 # no system png : apng support not bundled in
+
+CONFIGURE_ARGS +=      --enable-system-cairo

 MOZILLA_DATADIRS =     chrome components defaults dictionaries extensions \
                        greprefs icons modules plugins res searchplugins
Index: 
www/mozilla-firefox/patches/patch-modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
===================================================================
RCS file: 
www/mozilla-firefox/patches/patch-modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
diff -N 
www/mozilla-firefox/patches/patch-modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ 
www/mozilla-firefox/patches/patch-modules_libpr0n_decoders_gif_nsGIFDecoder2_cpp
    19
Jan 2011 13:57:48 -0000
@@ -0,0 +1,20 @@
+$OpenBSD$
+--- modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp.orig        Fri Dec  3
16:48:47 2010
++++ modules/libpr0n/decoders/gif/nsGIFDecoder2.cpp     Wed Jan 19 11:07:31 2011
+@@ -202,7 +202,7 @@ static NS_METHOD ReadDataOut(nsIInputStream* in,
+ 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);
+@@ -215,7 +215,6 @@ nsGIFDecoder2::FlushImageData(PRUint32 fromRow, PRUint
+   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;
Index: www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgContainer_cpp
===================================================================
RCS file: www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgContainer_cpp
diff -N www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgContainer_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgContainer_cpp      
19
Jan 2011 13:57:48 -0000
@@ -0,0 +1,24 @@
+$OpenBSD$
+--- modules/libpr0n/src/imgContainer.cpp.orig  Fri Dec  3 16:48:47 2010
++++ modules/libpr0n/src/imgContainer.cpp       Wed Jan 19 11:07:31 2011
+@@ -420,6 +420,8 @@ nsresult imgContainer::InternalAddFrameHelper(PRUint32
+
+   frame->GetImageData(imageData, imageLength);
+
++  frame->LockImageData();
++
+   mFrames.InsertElementAt(framenum, frame.forget());
+   mNumFrames++;
+
+@@ -444,6 +446,11 @@ nsresult imgContainer::InternalAddFrame(PRUint32 frame
+
+   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,
Index: www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_cpp
===================================================================
RCS file: www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_cpp
diff -N www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_cpp  19
Jan 2011 13:57:48 -0000
@@ -0,0 +1,83 @@
+$OpenBSD$
+--- modules/libpr0n/src/imgFrame.cpp.orig      Fri Dec  3 16:48:47 2010
++++ modules/libpr0n/src/imgFrame.cpp   Wed Jan 19 11:07:31 2011
+@@ -157,6 +157,7 @@ imgFrame::imgFrame() :
+ #ifdef USE_WIN_SURFACE
+   , mIsDDBSurface(PR_FALSE)
+ #endif
++  , mLocked(PR_FALSE)
+ {
+   static PRBool hasCheckedOptimize = PR_FALSE;
+   if (!hasCheckedOptimize) {
+@@ -418,8 +419,7 @@ void imgFrame::Draw(gfxContext *aContext, gfxPattern::
+
+   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
+@@ -713,7 +713,7 @@ nsresult imgFrame::ImageUpdated(const nsIntRect &aUpda
+
+   // 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
+@@ -811,8 +811,14 @@ void imgFrame::GetPaletteData(PRUint32 **aPalette, PRU
+ 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),
+@@ -837,14 +843,26 @@ nsresult imgFrame::LockImageData()
+ #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();
+@@ -900,7 +918,7 @@ void imgFrame::SetBlendMethod(PRInt32 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
Index: www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_h
===================================================================
RCS file: www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_h
diff -N www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ www/mozilla-firefox/patches/patch-modules_libpr0n_src_imgFrame_h    19
Jan 2011 13:57:48 -0000
@@ -0,0 +1,11 @@
+$OpenBSD$
+--- modules/libpr0n/src/imgFrame.h.orig        Fri Dec  3 16:48:47 2010
++++ modules/libpr0n/src/imgFrame.h     Wed Jan 19 11:07:31 2011
+@@ -172,6 +172,7 @@ class imgFrame (private)
+   PRPackedBool mNeverUseDeviceSurface;
+   PRPackedBool mFormatChanged;
+   PRPackedBool mCompositingFailed;
++  PRPackedBool mLocked;
+
+ #ifdef XP_WIN
+   PRPackedBool mIsDDBSurface;

Attachment: moz_sys_cairo.patch
Description: Binary data

Reply via email to