diff --git a/pkgs/applications/networking/browsers/firefox/21.0.nix b/pkgs/applications/networking/browsers/firefox/21.0.nix index d4bec94616df..d1bcc1d718b9 100644 --- a/pkgs/applications/networking/browsers/firefox/21.0.nix +++ b/pkgs/applications/networking/browsers/firefox/21.0.nix @@ -41,7 +41,7 @@ rec { "--with-system-nspr" "--with-system-nss" # "--with-system-png" # <-- "--with-system-png won't work because the system's libpng doesn't have APNG support" - # "--enable-system-cairo" # <-- doesn't build + "--enable-system-cairo" "--enable-system-sqlite" "--disable-crashreporter" "--disable-tests" @@ -72,6 +72,10 @@ rec { enableParallelBuilding = true; + patches = [ + ./system-cairo.patch # accepted upstream, probably in 22 + ]; + preConfigure = '' export NIX_LDFLAGS="$NIX_LDFLAGS -L$out/lib/xulrunner-${xulVersion}" diff --git a/pkgs/applications/networking/browsers/firefox/system-cairo.patch b/pkgs/applications/networking/browsers/firefox/system-cairo.patch new file mode 100644 index 000000000000..76cf4d51c9cb --- /dev/null +++ b/pkgs/applications/networking/browsers/firefox/system-cairo.patch @@ -0,0 +1,73 @@ +# HG changeset patch +# From: https://hg.mozilla.org/mozilla-central/rev/52b02042b27f +# User Connor Behan +# Date 1370038985 -7200 +# Node ID 52b02042b27f75acbcb2bd4822bedb00ab680e67 +# Parent 08ed531fed70978385cf9253bbc8389b0abe76ca +Bug 722975: Unbreak builds using --with-system-cairo. r=bas + +diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp +--- a/gfx/thebes/gfxPlatform.cpp ++++ b/gfx/thebes/gfxPlatform.cpp +@@ -548,23 +548,31 @@ struct SourceSurfaceUserData + BackendType mBackendType; + }; + + void SourceBufferDestroy(void *srcSurfUD) + { + delete static_cast(srcSurfUD); + } + ++#if MOZ_TREE_CAIRO + void SourceSnapshotDetached(cairo_surface_t *nullSurf) + { + gfxImageSurface* origSurf = + static_cast(cairo_surface_get_user_data(nullSurf, &kSourceSurface)); + + origSurf->SetData(&kSourceSurface, NULL, NULL); + } ++#else ++void SourceSnapshotDetached(void *nullSurf) ++{ ++ gfxImageSurface* origSurf = static_cast(nullSurf); ++ origSurf->SetData(&kSourceSurface, NULL, NULL); ++} ++#endif + + RefPtr + gfxPlatform::GetSourceSurfaceForSurface(DrawTarget *aTarget, gfxASurface *aSurface) + { + void *userData = aSurface->GetData(&kSourceSurface); + + if (userData) { + SourceSurfaceUserData *surf = static_cast(userData); +@@ -667,24 +675,28 @@ gfxPlatform::GetSourceSurfaceForSurface( + } + + srcBuffer = Factory::CreateWrappingDataSourceSurface(imgSurface->Data(), + imgSurface->Stride(), + size, format); + + } + ++#if MOZ_TREE_CAIRO + cairo_surface_t *nullSurf = + cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); + cairo_surface_set_user_data(nullSurf, + &kSourceSurface, + imgSurface, + NULL); + cairo_surface_attach_snapshot(imgSurface->CairoSurface(), nullSurf, SourceSnapshotDetached); + cairo_surface_destroy(nullSurf); ++#else ++ cairo_surface_set_mime_data(imgSurface->CairoSurface(), "mozilla/magic", (const unsigned char*) "data", 4, SourceSnapshotDetached, imgSurface.get()); ++#endif + } + + SourceSurfaceUserData *srcSurfUD = new SourceSurfaceUserData; + srcSurfUD->mBackendType = aTarget->GetType(); + srcSurfUD->mSrcSurface = srcBuffer; + aSurface->SetData(&kSourceSurface, srcSurfUD, SourceBufferDestroy); + + return srcBuffer; +