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,
|