rpms/openoffice.org/devel openoffice.org-2.4.0.ooo85470.vcl.cairotext.patch, NONE, 1.1 openoffice.org.spec, 1.1403, 1.1404

Caolan McNamara (caolanm) fedora-extras-commits at redhat.com
Wed Jan 23 13:15:02 UTC 2008


Author: caolanm

Update of /cvs/pkgs/rpms/openoffice.org/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv4398

Modified Files:
	openoffice.org.spec 
Added Files:
	openoffice.org-2.4.0.ooo85470.vcl.cairotext.patch 
Log Message:
Resolves: rhbz#426295 openoffice.org-2.4.0.ooo85470.vcl.cairotext.patch

openoffice.org-2.4.0.ooo85470.vcl.cairotext.patch:

--- NEW FILE openoffice.org-2.4.0.ooo85470.vcl.cairotext.patch ---
diff -ru vcl.precairo/inc/vcl/glyphcache.hxx vcl/inc/vcl/glyphcache.hxx
--- openoffice.org.orig/vcl/inc/vcl/glyphcache.hxx	2008-01-21 15:29:34.000000000 +0000
+++ openoffice.org/vcl/inc/vcl/glyphcache.hxx	2008-01-23 12:49:48.000000000 +0000
@@ -186,6 +186,10 @@
     virtual const ::rtl::OString*   GetFontFileName() const { return NULL; }
     virtual int                 GetFontFaceNumber() const   { return 0; }
     virtual bool                TestFont() const            { return true; }
+    virtual void*               GetFtFace() const { return 0; }
+    virtual int                 GetLoadFlags() const { return 0; }
+    virtual bool                NeedsArtificialBold() const { return false; }
+    virtual bool                NeedsArtificialItalic() const { return false; }
 
     const ImplFontSelectData&   GetFontSelData() const      { return maFontSelData; }
 
diff -ru vcl.precairo/source/glyphs/gcach_ftyp.hxx vcl/source/glyphs/gcach_ftyp.hxx
--- openoffice.org.orig/vcl/source/glyphs/gcach_ftyp.hxx	2008-01-21 15:29:27.000000000 +0000
+++ openoffice.org/vcl/source/glyphs/gcach_ftyp.hxx	2008-01-23 12:50:19.000000000 +0000
@@ -181,6 +181,10 @@
     virtual const ::rtl::OString* GetFontFileName() const { return mpFontInfo->GetFontFileName(); }
     virtual int                 GetFontFaceNum() const { return mpFontInfo->GetFaceNum(); }
     virtual bool                TestFont() const;
+    virtual void*               GetFtFace() const { return maFaceFT; }
+    virtual int                 GetLoadFlags() const { return mnLoadFlags; }
+    virtual bool                NeedsArtificialBold() const { return mbArtBold; }
+    virtual bool                NeedsArtificialItalic() const { return mbArtItalic; }
 
     virtual void                FetchFontMetric( ImplFontMetricData&, long& rFactor ) const;
 
diff -ru vcl.precairo/unx/inc/salgdi.h vcl/unx/inc/salgdi.h
--- openoffice.org.orig/vcl/unx/inc/salgdi.h	2008-01-21 15:29:33.000000000 +0000
+++ openoffice.org/vcl/unx/inc/salgdi.h	2008-01-22 14:19:55.000000000 +0000
@@ -198,6 +198,7 @@
     void                    DrawServerSimpleFontString( const ServerFontLayout& );
     void                    DrawServerAAFontString( const ServerFontLayout& );
     bool                    DrawServerAAForcedString( const ServerFontLayout& );
+    void                    DrawCairoAAFontString( const ServerFontLayout& );
     
     void freeResources();
 public:
diff -ru vcl.precairo/unx/source/gdi/salgdi3.cxx vcl/unx/source/gdi/salgdi3.cxx
--- openoffice.org.orig/vcl/unx/source/gdi/salgdi3.cxx	2008-01-21 15:29:33.000000000 +0000
+++ openoffice.org/vcl/unx/source/gdi/salgdi3.cxx	2008-01-23 12:46:32.000000000 +0000
@@ -123,6 +123,31 @@
 
 #include <hash_set>
 
+#include <X11/Xregion.h>
+
+struct cairo_surface_t;
+struct cairo_t;
+struct cairo_font_face_t;
+typedef void* FT_Face;
+struct cairo_matrix_t {
+    double xx; double yx;
+    double xy; double yy;
+    double x0; double y0;
+};
+struct cairo_glyph_t
+{
+    unsigned long index;
+    double x;
+    double y;
+};
+struct FcPattern;
+typedef sal_Char FcChar8;
+struct FcBlanks;
+typedef int FcBool;
+struct FcConfig;
+enum FcResult { FcResultMatch, FcResultNoMatch };
+enum FcMatchKind { FcMatchPattern, FcMatchFont, FcMatchScan };
+
 using namespace rtl;
 
 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@@ -734,6 +759,318 @@
 }
 
 //--------------------------------------------------------------------------
+namespace {
+
+class EmboldenWrapper
+{
+private:
+    bool mbIsValid;
+
+    FcPattern * (*mp_FcFreeTypeQueryFace)(const FT_Face face, const FcChar8 *file, int
+       id, FcBlanks *blanks);
+    FcBool (*mp_FcPatternAddInteger)(FcPattern*,const char*,int);
+    FcBool (*mp_FcConfigSubstitute)(FcConfig*,FcPattern*,FcMatchKind);
+    void (*mp_FcDefaultSubstitute)(FcPattern*);
+    FcPattern * (*mp_FcFontMatch)(FcConfig *, FcPattern *, FcResult *);
+    void (*mp_FcPatternDestroy)(FcPattern*);
+
+    EmboldenWrapper();
+public:
+    static EmboldenWrapper& get();
+    bool isValid() const { return mbIsValid; }
+
+    FcPattern* FcFreeTypeQueryFace( const FT_Face face, const FcChar8 *pFile, int id, FcBlanks* pBlanks )
+    { return mp_FcFreeTypeQueryFace( face, pFile, id, pBlanks ); }
+    FcBool FcPatternAddInteger( FcPattern* pPattern, const char* pObject, int nValue )
+    { return mp_FcPatternAddInteger( pPattern, pObject, nValue ); }
+    FcBool FcConfigSubstitute( FcConfig* pConfig, FcPattern* pPattern, FcMatchKind eKind )
+    { return mp_FcConfigSubstitute( pConfig, pPattern, eKind ); }
+    void FcDefaultSubstitute( FcPattern* pPattern )
+    { mp_FcDefaultSubstitute( pPattern ); }
+    FcPattern* FcFontMatch( FcConfig* pConfig, FcPattern* pPattern, FcResult* pResult)
+    { return mp_FcFontMatch( pConfig, pPattern, pResult); }
+    void FcPatternDestroy( FcPattern* pPattern )
+    { mp_FcPatternDestroy( pPattern ); }
+};
+
+class CairoWrapper
+{
+private:
+    bool mbIsValid;
+
+    cairo_surface_t* (*mp_xlib_surface_create)(Display *, Drawable , Visual *, int , int );
+    void (*mp_surface_destroy)(cairo_surface_t *);
+    cairo_t* (*mp_create)(cairo_surface_t *);
+    void (*mp_destroy)(cairo_t*);
+    void (*mp_clip)(cairo_t*);
+    void (*mp_rectangle)(cairo_t*, double, double, double, double);
+    cairo_font_face_t * (*mp_ft_font_face_create_for_ft_face)(FT_Face, int);
+    cairo_font_face_t * (*mp_ft_font_face_create_for_pattern)(FcPattern *);
+    void (*mp_set_font_face)(cairo_t *, cairo_font_face_t *);
+    void (*mp_font_face_destroy)(cairo_font_face_t *);
+    void (*mp_matrix_init_scale)(cairo_matrix_t *, double, double);
+    void (*mp_matrix_rotate)(cairo_matrix_t *, double);
+    void (*mp_set_font_matrix)(cairo_t *, const cairo_matrix_t *);
+    void (*mp_show_glyphs)(cairo_t *, const cairo_glyph_t *, int );
+    void (*mp_set_source_rgb)(cairo_t *, double , double , double );
+
+    bool canEmbolden() const { return false; }
+
+    CairoWrapper();
+public:
+    static CairoWrapper& get();
+    bool isValid() const { return mbIsValid; }
+    bool isCairoRenderable(const ServerFont& rFont);
+
+    cairo_surface_t* xlib_surface_create(Display *pDisplay, Drawable drawable, Visual *pVisual, int width, int height)
+        { return (*mp_xlib_surface_create)(pDisplay, drawable, pVisual, width, height); }
+    void surface_destroy(cairo_surface_t *surface) { (*mp_surface_destroy)(surface); }
+    cairo_t* create(cairo_surface_t *surface) { return (*mp_create)(surface); }
+    void destroy(cairo_t *cr) { (*mp_destroy)(cr); }
+    void clip(cairo_t *cr) { (*mp_clip)(cr); }
+    void rectangle(cairo_t *cr, double x, double y, double width, double height) 
+        { (*mp_rectangle)(cr, x, y, width, height); }
+    cairo_font_face_t* ft_font_face_create_for_ft_face(FT_Face face, int load_flags)
+        { return (*mp_ft_font_face_create_for_ft_face)(face, load_flags); }
+    cairo_font_face_t* ft_font_face_create_for_pattern(FcPattern *pattern)
+        { return (*mp_ft_font_face_create_for_pattern)(pattern); }
+    void set_font_face(cairo_t *cr, cairo_font_face_t *font_face)
+        { (*mp_set_font_face)(cr, font_face); }
+    void font_face_destroy(cairo_font_face_t *font_face)
+        { (*mp_font_face_destroy)(font_face); }
+    void matrix_init_scale(cairo_matrix_t *matrix, double sx, double sy)
+        { (*mp_matrix_init_scale)(matrix, sx, sy); }
+    void matrix_rotate(cairo_matrix_t *matrix, double radians)
+        { (*mp_matrix_rotate)(matrix, radians); }
+    void set_font_matrix(cairo_t *cr, const cairo_matrix_t *matrix)
+        { (*mp_set_font_matrix)(cr, matrix); }
+    void show_glyphs(cairo_t *cr, const cairo_glyph_t *glyphs, int no_glyphs)
+        { (*mp_show_glyphs)(cr, glyphs, no_glyphs); }
+    void set_source_rgb(cairo_t *cr, double red, double green, double blue)
+        { (*mp_set_source_rgb)(cr, red, green, blue); }
+};
+
+static EmboldenWrapper* pEmbInstance = NULL;
+
+EmboldenWrapper& EmboldenWrapper::get()
+{
+    if( ! pEmbInstance )
+        pEmbInstance = new EmboldenWrapper();
+    return *pEmbInstance;
+}
+
+EmboldenWrapper::EmboldenWrapper() : mbIsValid(false)
+{
+    mp_FcFreeTypeQueryFace = (FcPattern* (*)(const FT_Face, const FcChar8 *, int
+       , FcBlanks *))
+        osl_getAsciiFunctionSymbol(NULL, "FcFreeTypeQueryFace" );
+    mp_FcPatternAddInteger = (FcBool (*)(FcPattern*,const char*,int))
+        osl_getAsciiFunctionSymbol(NULL, "FcPatternAddInteger" );
+    mp_FcConfigSubstitute = (FcBool (*)(FcConfig*,FcPattern*,FcMatchKind))
+        osl_getAsciiFunctionSymbol(NULL, "FcConfigSubstitute" );
+    mp_FcDefaultSubstitute = (void (*)(FcPattern*))
+        osl_getAsciiFunctionSymbol(NULL, "FcDefaultSubstitute" );
+    mp_FcFontMatch = (FcPattern* (*)(FcConfig *, FcPattern *, FcResult *))
+        osl_getAsciiFunctionSymbol(NULL, "FcFontMatch" );
+    mp_FcPatternDestroy = (void (*)(FcPattern*))
+        osl_getAsciiFunctionSymbol(NULL, "FcPatternDestroy" );
+    mbIsValid = 
+        (
+            mp_FcFreeTypeQueryFace &&
+            mp_FcPatternAddInteger &&
+            mp_FcConfigSubstitute &&
+            mp_FcDefaultSubstitute &&
+            mp_FcFontMatch &&
+            mp_FcPatternDestroy
+        );
+    if (!mbIsValid)
+    {
+#if OSL_DEBUG_LEVEL > 1
+        fprintf( stderr, "not all needed symbols were found to embolden\n" );
+#endif
+    }
+}
+static CairoWrapper* pCairoInstance = NULL;
+
+CairoWrapper& CairoWrapper::get()
+{
+    if( ! pCairoInstance )
+        pCairoInstance = new CairoWrapper();
+    return *pCairoInstance;
+}
+
+CairoWrapper::CairoWrapper() : mbIsValid(false)
+{
+    static const char* pDisableCairoText = getenv( "SAL_ENABLE_CAIROTEXT" );
+    if( !pDisableCairoText || (pDisableCairoText[0] == '0') )
+        return;
+
+    mp_xlib_surface_create = (cairo_surface_t* (*)(Display *, Drawable , Visual *, int , int )) 
+        osl_getAsciiFunctionSymbol(NULL, "cairo_xlib_surface_create" );
+    mp_surface_destroy = (void(*)(cairo_surface_t*)) 
+        osl_getAsciiFunctionSymbol(NULL, "cairo_surface_destroy" );
+    mp_create = (cairo_t*(*)(cairo_surface_t*)) 
+        osl_getAsciiFunctionSymbol(NULL, "cairo_create" );
+    mp_destroy = (void(*)(cairo_t*))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_destroy" );
+    mp_clip = (void(*)(cairo_t*))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_clip" );
+    mp_rectangle = (void(*)(cairo_t*, double, double, double, double))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_rectangle" );
+    mp_ft_font_face_create_for_ft_face = (cairo_font_face_t * (*)(FT_Face, int))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_ft_font_face_create_for_ft_face" );
+    mp_ft_font_face_create_for_pattern = (cairo_font_face_t * (*)(FcPattern*))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_ft_font_face_create_for_pattern" );
+    mp_set_font_face = (void (*)(cairo_t *, cairo_font_face_t *))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_set_font_face" );
+    mp_font_face_destroy = (void (*)(cairo_font_face_t *))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_font_face_destroy" );
+    mp_matrix_init_scale = (void (*)(cairo_matrix_t *, double, double))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_matrix_init_scale" );
+    mp_matrix_rotate = (void (*)(cairo_matrix_t *, double))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_matrix_rotate" );
+    mp_set_font_matrix = (void (*)(cairo_t *, const cairo_matrix_t *))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_set_font_matrix" );
+    mp_show_glyphs = (void (*)(cairo_t *, const cairo_glyph_t *, int ))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_show_glyphs" );
+    mp_set_source_rgb = (void (*)(cairo_t *, double , double , double ))
+        osl_getAsciiFunctionSymbol(NULL, "cairo_set_source_rgb" );
+
+    mbIsValid = 
+        (
+            mp_xlib_surface_create &&
+            mp_surface_destroy &&
+            mp_create &&
+            mp_destroy &&
+            mp_clip &&
+            mp_rectangle &&
+            mp_ft_font_face_create_for_ft_face &&
+            mp_ft_font_face_create_for_pattern &&
+            mp_set_font_face &&
+            mp_font_face_destroy &&
+            mp_matrix_init_scale &&
+            mp_matrix_rotate &&
+            mp_set_font_matrix &&
+            mp_show_glyphs &&
+            mp_set_source_rgb
+        );
+    if (!mbIsValid)
+    {
+#if OSL_DEBUG_LEVEL > 1
+        fprintf( stderr, "not all needed symbols were found\n" );
+#endif
+    }
+}
+
+bool CairoWrapper::isCairoRenderable(const ServerFont& rFont)
+{
+    return rFont.GetFtFace() && isValid() && 
+        (rFont.NeedsArtificialBold() ? canEmbolden() : true);
+}
+
+} //namespace
+
+void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout )
+{
+    Display* pDisplay = GetXDisplay();
+    Visual* pVisual = GetDisplay()->GetVisual( GetScreenNumber() ).GetVisual();
+    CairoWrapper &rCairo = CairoWrapper::get();
+
+    cairo_surface_t *surface = rCairo.xlib_surface_create (pDisplay,
+	hDrawable_, pVisual, 1, 1);
+
+    cairo_t *cr = rCairo.create (surface);
+    rCairo.surface_destroy (surface);
+
+    if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) )
+    {
+	for (long i = 0; i < pClipRegion_->numRects; ++i)
+	{
+            rCairo.rectangle(cr, 
+                pClipRegion_->rects[i].x1, 
+                pClipRegion_->rects[i].y1,
+                pClipRegion_->rects[i].x2 - pClipRegion_->rects[i].x1,
+                pClipRegion_->rects[i].y2 - pClipRegion_->rects[i].y1);
+	}
+        rCairo.clip(cr);
+    }
+
+    rCairo.set_source_rgb(cr, 
+        SALCOLOR_RED(nTextColor_)/255.0, 
+        SALCOLOR_GREEN(nTextColor_)/255.0,
+        SALCOLOR_BLUE(nTextColor_)/255.0);
+
+    ServerFont& rFont = rLayout.GetServerFont();
+
+    cairo_font_face_t* font_face;
+
+    if (rFont.NeedsArtificialBold())
+    {
+	/*
+         Artificial Bold is a PITA as there's no way currently to do it through
+         the ft api of cairo that I can see, if one is added then we can prefer
+         that way of doing it to this, emboldening is pretty care, so we defer
+         looking for emboldening symbols until the first time it's checked for
+         in isCairoRenderable
+        */
+        EmboldenWrapper &rEmb = EmboldenWrapper::get();
+
+        const ::rtl::OString *pFileName = rFont.GetFontFileName();
+        FcPattern *pattern = rEmb.FcFreeTypeQueryFace(rFont.GetFtFace(), 
+            pFileName->getStr(), rFont.GetFontFaceNumber(), NULL);
+        rEmb.FcPatternAddInteger(pattern, "weight", 200);
+        rEmb.FcConfigSubstitute(NULL, pattern, FcMatchPattern);
+   	rEmb.FcDefaultSubstitute(pattern);
+	FcPattern *resolved = rEmb.FcFontMatch(NULL, pattern, NULL);
+        rEmb.FcPatternDestroy(pattern);
+
+        font_face = rCairo.ft_font_face_create_for_pattern(resolved);
+
+        rEmb.FcPatternDestroy(resolved);
+    }
+    else
+    {
+        font_face = 
+            rCairo.ft_font_face_create_for_ft_face((FT_Face)rFont.GetFtFace(), 
+                rFont.GetLoadFlags());
+    }
+
+    rCairo.set_font_face(cr, font_face);
+
+    cairo_matrix_t m;
+    const ImplFontSelectData& rFSD = rFont.GetFontSelData();
+    int nWidth = rFSD.mnWidth ? rFSD.mnWidth : rFSD.mnHeight;
+
+    rCairo.matrix_init_scale(&m, nWidth, rFSD.mnHeight);
+    if (rFont.NeedsArtificialItalic())
+        m.xy = -m.xx * 0x6000L / 0x10000L;
+
+    if (rLayout.GetOrientation())
+        rCairo.matrix_rotate(&m, (3600 - rLayout.GetOrientation()) * M_PI / 1800.0);
+    rCairo.set_font_matrix(cr, &m);
+
+    std::vector<cairo_glyph_t> cairo_glyphs;
+    sal_Int32 nGlyph;
+    Point aPos;
+    int nStart = 0;
+    while (rLayout.GetNextGlyphs( 1, &nGlyph, aPos, nStart ))
+    {
+        cairo_glyph_t aGlyph;
+        aGlyph.index = nGlyph;
+        aGlyph.x = aPos.X();
+        aGlyph.y = aPos.Y();
+        cairo_glyphs.push_back(aGlyph);
+    }
+
+    if (!cairo_glyphs.empty())
+        rCairo.show_glyphs (cr, &cairo_glyphs[0], cairo_glyphs.size());
+
+    rCairo.font_face_destroy(font_face);
+
+    rCairo.destroy (cr);
+}
+
+//--------------------------------------------------------------------------
 
 void X11SalGraphics::DrawServerAAFontString( const ServerFontLayout& rLayout )
 {
@@ -1111,15 +1448,20 @@
     // draw complex text
     ServerFont& rFont = rLayout.GetServerFont();
 
-    X11GlyphPeer& rGlyphPeer = X11GlyphCache::GetInstance().GetPeer();
-    if( rGlyphPeer.GetGlyphSet( rFont, m_nScreen ) )
-        DrawServerAAFontString( rLayout );
+    if (CairoWrapper::get().isCairoRenderable(rFont))
+        DrawCairoAAFontString( rLayout );
+    else
+    {
+        X11GlyphPeer& rGlyphPeer = X11GlyphCache::GetInstance().GetPeer();
+        if( rGlyphPeer.GetGlyphSet( rFont, m_nScreen ) )
+            DrawServerAAFontString( rLayout );
 #ifndef MACOSX        /* ignore X11 fonts on MACOSX */
-    else if( !rGlyphPeer.ForcedAntialiasing( rFont, m_nScreen ) )
-        DrawServerSimpleFontString( rLayout );
+        else if( !rGlyphPeer.ForcedAntialiasing( rFont, m_nScreen ) )
+            DrawServerSimpleFontString( rLayout );
 #endif // MACOSX
-    else
-        DrawServerAAForcedString( rLayout );
+        else
+            DrawServerAAForcedString( rLayout );
+    }
 }
 
 //--------------------------------------------------------------------------


Index: openoffice.org.spec
===================================================================
RCS file: /cvs/pkgs/rpms/openoffice.org/devel/openoffice.org.spec,v
retrieving revision 1.1403
retrieving revision 1.1404
diff -u -r1.1403 -r1.1404
--- openoffice.org.spec	23 Jan 2008 08:55:15 -0000	1.1403
+++ openoffice.org.spec	23 Jan 2008 13:14:09 -0000	1.1404
@@ -141,6 +141,7 @@
 Patch67: workspace.sw24bf02.patch
 Patch68: openoffice.org-2.4.0.ooo85448.emptyrpath.patch
 Patch69: openoffice.org-2.4.0.ooo85487.evoconnectivity.patch
+Patch70: openoffice.org-2.4.0.ooo85470.vcl.cairotext.patch
 
 %define instdir %{_libdir}/openoffice.org
 
@@ -1096,6 +1097,7 @@
 %patch67 -p1 -b .workspace.sw24bf02.patch
 %patch68 -p1 -b .ooo85448.emptyrpath.patch
 %patch69 -p1 -b .ooo85487.evoconnectivity.patch
+%patch70 -p1 -b .ooo85470.vcl.cairotext.patch
 
 %build
 echo build start time is `date`, diskspace: `df -h . | tail -n 1`
@@ -2861,7 +2863,7 @@
 
 
 %changelog
-* Tue Jan 22 2008 Caolan McNamara <caolanm at redhat.com> - 1:2.4.0-4.1
+* Wed Jan 22 2008 Caolan McNamara <caolanm at redhat.com> - 1:2.4.0-4.1
 - next milestone
 - drop integrated openoffice.org-2.4.0.ooo83410.solenv.renameserbian.patch
 - drop integrated openoffice.org-2.3.1.ooo83877.sal.allowsoftlinkdelete.patch
@@ -2869,6 +2871,8 @@
 - drop integrated workspace.impress132.patch
 - add openoffice.org-2.4.0.ooo85487.evoconnectivity.patch to make evoab2 build
 - new finnish autocorrect file
+- Resolves: rhbz#426295 openoffice.org-2.4.0.ooo85470.vcl.cairotext.patch
+  use export SAL_ENABLE_CAIROTEXT=1 to enable
 
 * Mon Jan 21 2008 Caolan McNamara <caolanm at redhat.com> - 1:2.4.0-3.3
 - fix openoffice.org-2.4.0.ooo85321.vcl.pixmapleak.patch for warren




More information about the fedora-extras-commits mailing list