aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/mozilla/fennec/use-native-bpp.patch
blob: fd3f9b71f8d28af2365a5b966ad4e1f620b88b93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
diff -r f603fec24bf7 gfx/thebes/src/gfxPlatformGtk.cpp
--- a/gfx/thebes/src/gfxPlatformGtk.cpp	Tue Dec 02 16:05:36 2008 -0500
+++ b/gfx/thebes/src/gfxPlatformGtk.cpp	Tue Dec 02 23:14:03 2008 -0500
@@ -80,18 +80,23 @@
 
 #define GDK_PIXMAP_SIZE_MAX 32767
 
 #ifndef MOZ_PANGO
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #endif
 
+#include "nsIPrefService.h"
+#include "nsIPrefBranch.h"
+#include "nsServiceManagerUtils.h"
+
 double gfxPlatformGtk::sDPI = -1.0;
 gfxFontconfigUtils *gfxPlatformGtk::sFontconfigUtils = nsnull;
+static PRBool gUseSystemVisualFormat = PR_FALSE;
 
 #ifndef MOZ_PANGO
 typedef nsDataHashtable<nsStringHashKey, nsRefPtr<FontFamily> > FontTable;
 static FontTable *gPlatformFonts = NULL;
 static FontTable *gPlatformFontAliases = NULL;
 static FT_Library gPlatformFTLibrary = NULL;
 #endif
 
@@ -113,16 +118,26 @@ gfxPlatformGtk::gfxPlatformGtk()
     gPlatformFonts = new FontTable();
     gPlatformFonts->Init(100);
     gPlatformFontAliases = new FontTable();
     gPlatformFontAliases->Init(100);
     UpdateFontList();
 #endif
 
     InitDPI();
+
+    nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
+    if (!prefs)
+        return;
+
+    PRBool val = PR_FALSE;
+    nsresult rv;
+    rv = prefs->GetBoolPref("gfx.system.visual.format", &val);
+    if (NS_SUCCEEDED(rv))
+        gUseSystemVisualFormat = val;
 }
 
 gfxPlatformGtk::~gfxPlatformGtk()
 {
     gfxFontconfigUtils::Shutdown();
     sFontconfigUtils = nsnull;
 
 #ifdef MOZ_PANGO
@@ -184,18 +199,24 @@ gfxPlatformGtk::CreateOffscreenSurface(c
     // XXX we really need a different interface here, something that passes
     // in more context, including the display and/or target surface type that
     // we should try to match
     Display* display = GDK_DISPLAY();
     if (!display)
         return nsnull;
 
     GdkPixmap* pixmap = nsnull;
-    XRenderPictFormat* xrenderFormat =
-        XRenderFindStandardFormat(display, xrenderFormatID);
+    XRenderPictFormat* xrenderFormat = nsnull;
+
+    if (xrenderFormatID == PictStandardRGB24 && gUseSystemVisualFormat) {
+        // Actually we want not strictly RGB24, but the fastest non-alpha
+        // format (XXX to be verified if it is actually safe)
+        xrenderFormat = XRenderFindVisualFormat(display, GDK_VISUAL_XVISUAL(gdk_visual_get_system()));
+    }
+    if (!xrenderFormat) xrenderFormat = XRenderFindStandardFormat(display, xrenderFormatID);
 
     if (xrenderFormat && sizeOk) {
         pixmap = gdk_pixmap_new(nsnull, size.width, size.height,
                                 xrenderFormat->depth);
 
         if (pixmap) {
             gdk_drawable_set_colormap(GDK_DRAWABLE(pixmap), nsnull);
             newSurface = new gfxXlibSurface(display,