diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in index bce0e860d864..1a23b9bea6aa 100644 --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in @@ -406,6 +406,10 @@ MOZ_XFT_CFLAGS = @MOZ_XFT_CFLAGS@ MOZ_XFT_LIBS = @MOZ_XFT_LIBS@ MOZ_ENABLE_COREXFONTS = @MOZ_ENABLE_COREXFONTS@ +MOZ_ENABLE_PANGO = @MOZ_ENABLE_PANGO@ +MOZ_PANGO_CFLAGS = @MOZ_PANGO_CFLAGS@ +MOZ_PANGO_LIBS = @MOZ_PANGO_LIBS@ + MOZ_EXTRA_X11CONVERTERS = @MOZ_EXTRA_X11CONVERTERS@ MOZ_ENABLE_XINERAMA = @MOZ_ENABLE_XINERAMA@ diff --git a/configure.in b/configure.in index 69d4ec5a492c..397a012787f7 100644 --- a/configure.in +++ b/configure.in @@ -3454,6 +3454,34 @@ AC_SUBST(MOZ_ENABLE_XFT) AC_SUBST(MOZ_XFT_CFLAGS) AC_SUBST(MOZ_XFT_LIBS) +dnl ======================================================== +dnl = pango font rendering +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(pango, +[ --enable-pango Enable Pango font rendering support], + MOZ_ENABLE_PANGO=1, + MOZ_ENABLE_PANGO=) + +if test "$MOZ_ENABLE_PANGO" +then + AC_DEFINE(MOZ_ENABLE_PANGO) + PKG_CHECK_MODULES(MOZ_PANGO, pango >= 1.5.0) + + dnl Make sure that the pango version is _actually_ new enough + _SAVE_CFLAGS=$CFLAGS + _SAVE_LDFLAGS=$LDFLAGS + CFLAGS="$MOZ_PANGO_CFLAGS $CFLAGS" + LDFLAGS="$MOZ_PANGO_LIBS $LDFLAGS" + AC_CHECK_LIB(pangoft2-1.0, pango_fc_font_map_add_decoder_find_func,, + AC_MSG_ERROR([Your Pango is too old. Sorry.])) + CFLAGS=$_SAVE_CFLAGS + LDFLAGS=$_SAVE_LDFLAGS + + AC_SUBST(MOZ_ENABLE_PANGO) + AC_SUBST(MOZ_PANGO_CFLAGS) + AC_SUBST(MOZ_PANGO_LIBS) +fi + dnl ======================================================== dnl = disabling x11 core support, enabled by default dnl ======================================================== diff --git a/gfx/src/gtk/nsFontMetricsGTK.cpp b/gfx/src/gtk/nsFontMetricsGTK.cpp index 54843f42e97a..ead9fdb12db1 100644 --- a/gfx/src/gtk/nsFontMetricsGTK.cpp +++ b/gfx/src/gtk/nsFontMetricsGTK.cpp @@ -4599,6 +4599,12 @@ nsFontMetricsGTK::GetCurrentGDKFont(void) return mCurrentFont->GetGDKFont(); } +nsresult +nsFontMetricsGTK::SetRightToLeftText(PRBool aIsRTL) +{ + return NS_OK; +} + PR_BEGIN_EXTERN_C static int CompareSizes(const void* aArg1, const void* aArg2, void *data) diff --git a/gfx/src/gtk/nsFontMetricsGTK.h b/gfx/src/gtk/nsFontMetricsGTK.h index c4efa7e237c0..b0adcdc9c31c 100644 --- a/gfx/src/gtk/nsFontMetricsGTK.h +++ b/gfx/src/gtk/nsFontMetricsGTK.h @@ -343,6 +343,8 @@ public: virtual GdkFont* GetCurrentGDKFont(void); + virtual nsresult SetRightToLeftText(PRBool aIsRTL); + static nsresult FamilyExists(nsIDeviceContext *aDevice, const nsString& aName); static PRUint32 GetHints(void); diff --git a/gfx/src/gtk/nsFontMetricsUtils.cpp b/gfx/src/gtk/nsFontMetricsUtils.cpp index a868e54e243c..ec9ab098fd09 100644 --- a/gfx/src/gtk/nsFontMetricsUtils.cpp +++ b/gfx/src/gtk/nsFontMetricsUtils.cpp @@ -50,11 +50,20 @@ #include "nsFontMetricsGTK.h" #endif +#ifdef MOZ_ENABLE_PANGO +#include "nsFontMetricsPango.h" +#endif + #include "nsFontMetricsUtils.h" PRUint32 NS_FontMetricsGetHints(void) { +#ifdef MOZ_ENABLE_PANGO + if (NS_IsPangoEnabled()) { + return nsFontMetricsPango::GetHints(); + } +#endif #ifdef MOZ_ENABLE_XFT if (NS_IsXftEnabled()) { return nsFontMetricsXft::GetHints(); @@ -69,6 +78,11 @@ NS_FontMetricsGetHints(void) nsresult NS_FontMetricsFamilyExists(nsIDeviceContext *aDevice, const nsString &aName) { +#ifdef MOZ_ENABLE_PANGO + if (NS_IsPangoEnabled()) { + return nsFontMetricsPango::FamilyExists(aDevice, aName); + } +#endif #ifdef MOZ_ENABLE_XFT // try to fall through to the core fonts if xft fails if (NS_IsXftEnabled()) { @@ -121,3 +135,17 @@ NS_IsXftEnabled(void) } #endif /* MOZ_ENABLE_XFT */ + +#ifdef MOZ_ENABLE_PANGO + +PRBool +NS_IsPangoEnabled(void) +{ + char *val = PR_GetEnv("MOZ_DISABLE_PANGO"); + if (val) + return FALSE; + + return TRUE; +} + +#endif diff --git a/gfx/src/gtk/nsFontMetricsUtils.h b/gfx/src/gtk/nsFontMetricsUtils.h index 161e5ff4b2eb..4ce82fe3b97b 100644 --- a/gfx/src/gtk/nsFontMetricsUtils.h +++ b/gfx/src/gtk/nsFontMetricsUtils.h @@ -42,9 +42,12 @@ extern PRUint32 NS_FontMetricsGetHints (void); extern nsresult NS_FontMetricsFamilyExists(nsIDeviceContext *aDevice, const nsString &aName); - #ifdef MOZ_ENABLE_XFT extern PRBool NS_IsXftEnabled(void); #endif +#ifdef MOZ_ENABLE_PANGO +extern PRBool NS_IsPangoEnabled(void); +#endif + #endif /* __nsFontMetricsUtils_h */ diff --git a/gfx/src/gtk/nsFontMetricsXft.cpp b/gfx/src/gtk/nsFontMetricsXft.cpp index adc2a52de4d6..9e1687efbc71 100644 --- a/gfx/src/gtk/nsFontMetricsXft.cpp +++ b/gfx/src/gtk/nsFontMetricsXft.cpp @@ -449,7 +449,7 @@ nsFontMetricsXft::Init(const nsFont& aFont, nsIAtom* aLangGroup, // Make sure that the pixel size is at least greater than zero if (mPixelSize < 1) { #ifdef DEBUG - printf("*** Warning: nsFontMetricsXft was passed a pixel size of %d\n", + printf("*** Warning: nsFontMetricsXft was passed a pixel size of %f\n", mPixelSize); #endif mPixelSize = 1; @@ -766,6 +766,12 @@ nsFontMetricsXft::GetCurrentGDKFont(void) return nsnull; } +nsresult +nsFontMetricsXft::SetRightToLeftText(PRBool aIsRTL) +{ + return NS_OK; +} + PRUint32 nsFontMetricsXft::GetHints(void) { diff --git a/gfx/src/gtk/nsFontMetricsXft.h b/gfx/src/gtk/nsFontMetricsXft.h index 3f2be688dee8..f04cbcd2a3a0 100644 --- a/gfx/src/gtk/nsFontMetricsXft.h +++ b/gfx/src/gtk/nsFontMetricsXft.h @@ -202,6 +202,8 @@ public: virtual GdkFont* GetCurrentGDKFont(void); + virtual nsresult SetRightToLeftText(PRBool aIsRTL); + // get hints for the font static PRUint32 GetHints (void); diff --git a/gfx/src/gtk/nsGCCache.cpp b/gfx/src/gtk/nsGCCache.cpp index 899984a90071..3217d3496ba8 100644 --- a/gfx/src/gtk/nsGCCache.cpp +++ b/gfx/src/gtk/nsGCCache.cpp @@ -248,98 +248,42 @@ void nsGCCache::ReuseGC(GCCacheEntry *entry, GdkGCValues *gcv, GdkGCValuesMask f // We have old GC, reuse it and check what // we have to change - XGCValues xvalues; - unsigned long xvalues_mask=0; + GdkGCValues xvalues; + int xvalues_mask = 0; if (entry->clipRegion) { // set it to none here and then set the clip region with // gdk_gc_set_clip_region in GetGC() xvalues.clip_mask = None; - xvalues_mask |= GCClipMask; + xvalues_mask |= GDK_GC_CLIP_MASK; gdk_region_destroy(entry->clipRegion); entry->clipRegion = NULL; } if (entry->gcv.foreground.pixel != gcv->foreground.pixel) { - xvalues.foreground = gcv->foreground.pixel; - xvalues_mask |= GCForeground; + xvalues.foreground.pixel = gcv->foreground.pixel; + xvalues_mask |= GDK_GC_FOREGROUND; } if (entry->gcv.function != gcv->function) { - switch (gcv->function) { - case GDK_COPY: - xvalues.function = GXcopy; - break; - case GDK_INVERT: - xvalues.function = GXinvert; - break; - case GDK_XOR: - xvalues.function = GXxor; - break; - case GDK_CLEAR: - xvalues.function = GXclear; - break; - case GDK_AND: - xvalues.function = GXand; - break; - case GDK_AND_REVERSE: - xvalues.function = GXandReverse; - break; - case GDK_AND_INVERT: - xvalues.function = GXandInverted; - break; - case GDK_NOOP: - xvalues.function = GXnoop; - break; - case GDK_OR: - xvalues.function = GXor; - break; - case GDK_EQUIV: - xvalues.function = GXequiv; - break; - case GDK_OR_REVERSE: - xvalues.function = GXorReverse; - break; - case GDK_COPY_INVERT: - xvalues.function = GXcopyInverted; - break; - case GDK_OR_INVERT: - xvalues.function = GXorInverted; - break; - case GDK_NAND: - xvalues.function = GXnand; - break; - case GDK_SET: - xvalues.function = GXset; - break; - } - xvalues_mask |= GCFunction; + xvalues.function = gcv->function; + xvalues_mask |= GDK_GC_FUNCTION; } if(entry->gcv.font != gcv->font && flags & GDK_GC_FONT) { - xvalues.font = ((XFontStruct *)GDK_FONT_XFONT(gcv->font))->fid; - xvalues_mask |= GCFont; + xvalues.font = gcv->font; + xvalues_mask |= GDK_GC_FONT; } if (entry->gcv.line_style != gcv->line_style) { - switch (gcv->line_style) { - case GDK_LINE_SOLID: - xvalues.line_style = LineSolid; - break; - case GDK_LINE_ON_OFF_DASH: - xvalues.line_style = LineOnOffDash; - break; - case GDK_LINE_DOUBLE_DASH: - xvalues.line_style = LineDoubleDash; - break; - } - xvalues_mask |= GCLineStyle; + xvalues.line_style = gcv->line_style; + xvalues_mask |= GDK_GC_LINE_STYLE; } if (xvalues_mask != 0) { - XChangeGC(GDK_GC_XDISPLAY(entry->gc), GDK_GC_XGC(entry->gc), - xvalues_mask, &xvalues); + gdk_gc_set_values(entry->gc, &xvalues, (GdkGCValuesMask)xvalues_mask); } + entry->flags = flags; entry->gcv = *gcv; } diff --git a/gfx/src/gtk/nsGfxFactoryGTK.cpp b/gfx/src/gtk/nsGfxFactoryGTK.cpp index 396166c54090..39e40c29483b 100644 --- a/gfx/src/gtk/nsGfxFactoryGTK.cpp +++ b/gfx/src/gtk/nsGfxFactoryGTK.cpp @@ -61,6 +61,9 @@ #ifdef NATIVE_THEME_SUPPORT #include "nsNativeThemeGTK.h" #endif +#ifdef MOZ_ENABLE_PANGO +#include "nsFontMetricsPango.h" +#endif #ifdef MOZ_ENABLE_XFT #include "nsFontMetricsXft.h" #endif @@ -111,6 +114,13 @@ nsFontMetricsConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) if (aOuter) return NS_ERROR_NO_AGGREGATION; +#ifdef MOZ_ENABLE_PANGO + if (NS_IsPangoEnabled()) { + result = new nsFontMetricsPango(); + if (!result) + return NS_ERROR_OUT_OF_MEMORY; + } else { +#endif #ifdef MOZ_ENABLE_XFT if (NS_IsXftEnabled()) { result = new nsFontMetricsXft(); @@ -126,6 +136,9 @@ nsFontMetricsConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) #ifdef MOZ_ENABLE_XFT } #endif +#ifdef MOZ_ENABLE_PANGO + } +#endif NS_ADDREF(result); nsresult rv = result->QueryInterface(aIID, aResult); @@ -147,6 +160,13 @@ nsFontEnumeratorConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) if (aOuter) return NS_ERROR_NO_AGGREGATION; +#ifdef MOZ_ENABLE_PANGO + if (NS_IsPangoEnabled()) { + result = new nsFontEnumeratorPango(); + if (!result) + return NS_ERROR_OUT_OF_MEMORY; + } else { +#endif #ifdef MOZ_ENABLE_XFT if (NS_IsXftEnabled()) { result = new nsFontEnumeratorXft(); @@ -162,6 +182,9 @@ nsFontEnumeratorConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) #ifdef MOZ_ENABLE_XFT } #endif +#ifdef MOZ_ENABLE_PANGO + } +#endif NS_ADDREF(result); nsresult rv = result->QueryInterface(aIID, aResult); diff --git a/gfx/src/gtk/nsIFontMetricsGTK.h b/gfx/src/gtk/nsIFontMetricsGTK.h index 065d16b6a6e5..a527a30cc2fd 100644 --- a/gfx/src/gtk/nsIFontMetricsGTK.h +++ b/gfx/src/gtk/nsIFontMetricsGTK.h @@ -121,6 +121,9 @@ public: // particular handle. virtual GdkFont* GetCurrentGDKFont(void) = 0; + // Set the direction of the text rendering + virtual nsresult SetRightToLeftText(PRBool aIsRTL) = 0; + }; #endif /* __nsIFontMetricsGTK_h */ diff --git a/gfx/src/gtk/nsRenderingContextGTK.cpp b/gfx/src/gtk/nsRenderingContextGTK.cpp index 00069c0e3edd..ba307a023d43 100644 --- a/gfx/src/gtk/nsRenderingContextGTK.cpp +++ b/gfx/src/gtk/nsRenderingContextGTK.cpp @@ -548,6 +548,9 @@ void nsRenderingContextGTK::UpdateGC() values.foreground.pixel = gdk_rgb_xpixel_from_rgb(NS_TO_GDK_RGB(mCurrentColor)); + values.foreground.red = (NS_GET_R(mCurrentColor) << 8) | NS_GET_R(mCurrentColor); + values.foreground.green = (NS_GET_G(mCurrentColor) << 8) | NS_GET_G(mCurrentColor); + values.foreground.blue = (NS_GET_B(mCurrentColor) << 8) | NS_GET_B(mCurrentColor); valuesMask = GDK_GC_FOREGROUND; #ifdef MOZ_ENABLE_COREXFONTS @@ -1440,6 +1443,11 @@ nsRenderingContextGTK::GetBoundingMetrics(const PRUnichar* aString, #endif /* MOZ_MATHML */ +NS_IMETHODIMP nsRenderingContextGTK::SetRightToLeftText(PRBool aIsRTL) +{ + return mFontMetrics->SetRightToLeftText(aIsRTL); +} + NS_IMETHODIMP nsRenderingContextGTK::DrawImage(imgIContainer *aImage, const nsRect & aSrcRect, const nsRect & aDestRect) { UpdateGC(); diff --git a/gfx/src/gtk/nsRenderingContextGTK.h b/gfx/src/gtk/nsRenderingContextGTK.h index 82fb03a70e69..a6dde565f0b8 100644 --- a/gfx/src/gtk/nsRenderingContextGTK.h +++ b/gfx/src/gtk/nsRenderingContextGTK.h @@ -192,6 +192,8 @@ public: const nsRect &aDestBounds, PRUint32 aCopyFlags); NS_IMETHOD RetrieveCurrentNativeGraphicData(PRUint32 * ngd); + NS_IMETHOD SetRightToLeftText(PRBool aIsRTL); + NS_IMETHOD DrawImage(imgIContainer *aImage, const nsRect & aSrcRect, const nsRect & aDestRect); NS_IMETHOD GetBackbuffer(const nsRect &aRequestedSize, const nsRect &aMaxSize, nsIDrawingSurface* &aBackbuffer);