From 8ce094f4ec97c223a711fcea18803e02fb2f4461 Mon Sep 17 00:00:00 2001 From: Michael Ventnor Date: Mon, 26 Jan 2009 11:21:46 -0500 Subject: [PATCH] Bug 469831 - need gtk2 drawing code for test plugin. r+sr=roc --- modules/plugin/test/reftest/reftest.list | 4 +- modules/plugin/test/testplugin/Makefile.in | 6 + .../plugin/test/testplugin/nptest_gtk2.cpp | 109 ++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) diff --git a/modules/plugin/test/reftest/reftest.list b/modules/plugin/test/reftest/reftest.list index 884af596a89..0a2a25103f0 100644 --- a/modules/plugin/test/reftest/reftest.list +++ b/modules/plugin/test/reftest/reftest.list @@ -1,3 +1,3 @@ # basic sanity checking -random-if(!haveTestPlugin||(MOZ_WIDGET_TOOLKIT!="cocoa"&&MOZ_WIDGET_TOOLKIT!="windows")) != plugin-sanity.html about:blank -fails-if(!haveTestPlugin||(MOZ_WIDGET_TOOLKIT!="cocoa"&&MOZ_WIDGET_TOOLKIT!="windows")) == plugin-sanity.html div-sanity.html +random-if(!haveTestPlugin) != plugin-sanity.html about:blank +fails-if(!haveTestPlugin) == plugin-sanity.html div-sanity.html diff --git a/modules/plugin/test/testplugin/Makefile.in b/modules/plugin/test/testplugin/Makefile.in index f37f59425c9..b4f57bf9a38 100644 --- a/modules/plugin/test/testplugin/Makefile.in +++ b/modules/plugin/test/testplugin/Makefile.in @@ -76,6 +76,12 @@ endif include $(topsrcdir)/config/rules.mk +ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) +CXXFLAGS += $(MOZ_GTK2_CFLAGS) +CFLAGS += $(MOZ_GTK2_CFLAGS) +EXTRA_DSO_LDOPTS += $(MOZ_GTK2_LIBS) +endif + install-plugin: $(SHARED_LIBRARY) ifdef SHARED_LIBRARY ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa) diff --git a/modules/plugin/test/testplugin/nptest_gtk2.cpp b/modules/plugin/test/testplugin/nptest_gtk2.cpp index b7fd96bd141..f512be0e3fb 100644 --- a/modules/plugin/test/testplugin/nptest_gtk2.cpp +++ b/modules/plugin/test/testplugin/nptest_gtk2.cpp @@ -28,24 +28,133 @@ * * Contributor(s): * Josh Aas + * Michael Ventnor * * ***** END LICENSE BLOCK ***** */ #include "nptest_platform.h" +#include "npapi.h" +#include +#ifdef MOZ_X11 +#include +#endif + +void pluginDrawSolid(InstanceData* instanceData, GdkDrawable* gdkWindow); NPError pluginInstanceInit(InstanceData* instanceData) { +#ifdef MOZ_X11 return NPERR_NO_ERROR; +#else + // we only support X11 here, since thats what the plugin system uses + return NPERR_INCOMPATIBLE_VERSION_ERROR; +#endif } int16_t pluginHandleEvent(InstanceData* instanceData, void* event) { +#ifdef MOZ_X11 + XEvent *nsEvent = (XEvent *)event; + gboolean handled = 0; + + if (nsEvent->type != GraphicsExpose) + return 0; + + XGraphicsExposeEvent *expose = &nsEvent->xgraphicsexpose; + instanceData->window.window = (void*)(expose->drawable); + + pluginDraw(instanceData); +#endif return 0; } +static void +SetCairoRGBA(cairo_t* cairoWindow, PRUint32 rgba) +{ + float b = (rgba & 0xFF) / 255.0; + float g = ((rgba & 0xFF00) >> 8) / 255.0; + float r = ((rgba & 0xFF0000) >> 16) / 255.0; + float a = ((rgba & 0xFF000000) >> 24) / 255.0; + + cairo_set_source_rgba(cairoWindow, r, g, b, a); +} + +void +pluginDrawSolid(InstanceData* instanceData, GdkDrawable* gdkWindow) +{ +#ifdef MOZ_X11 + cairo_t* cairoWindow = gdk_cairo_create(gdkWindow); + + NPWindow window = instanceData->window; + GdkRectangle windowRect; + windowRect.x = window.x; + windowRect.y = window.y; + windowRect.width = window.width; + windowRect.height = window.height; + + gdk_cairo_rectangle(cairoWindow, &windowRect); + SetCairoRGBA(cairoWindow, instanceData->scriptableObject->drawColor); + + cairo_fill(cairoWindow); + cairo_destroy(cairoWindow); + g_object_unref(gdkWindow); +#endif +} + void pluginDraw(InstanceData* instanceData) { +#ifdef MOZ_X11 + if (!instanceData) + return; + + NPP npp = instanceData->npp; + if (!npp) + return; + + const char* uaString = NPN_UserAgent(npp); + if (!uaString) + return; + + NPWindow window = instanceData->window; + GdkNativeWindow nativeWinId = reinterpret_cast(window.window); + GdkDrawable* gdkWindow = GDK_DRAWABLE(gdk_window_foreign_new(nativeWinId)); + + if (instanceData->scriptableObject->drawMode == DM_SOLID_COLOR) { + // drawing a solid color for reftests + pluginDrawSolid(instanceData, gdkWindow); + return; + } + + GdkGC* gdkContext = gdk_gc_new(gdkWindow); + PangoContext* pangoContext = gdk_pango_context_get(); + PangoLayout* pangoTextLayout = pango_layout_new(pangoContext); + + // draw a grey background for the plugin frame + GdkColor grey; + grey.red = grey.blue = grey.green = 32767; + gdk_gc_set_rgb_fg_color(gdkContext, &grey); + gdk_draw_rectangle(gdkWindow, gdkContext, TRUE, window.x, window.y, + window.width, window.height); + + // draw a 3-pixel-thick black frame around the plugin + GdkColor black; + black.red = black.green = black.blue = 0; + gdk_gc_set_rgb_fg_color(gdkContext, &black); + gdk_gc_set_line_attributes(gdkContext, 3, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); + gdk_draw_rectangle(gdkWindow, gdkContext, FALSE, window.x + 1, window.y + 1, + window.width - 3, window.height - 3); + + // paint the UA string + pango_layout_set_width(pangoTextLayout, (window.width - 10) * PANGO_SCALE); + pango_layout_set_text(pangoTextLayout, uaString, -1); + gdk_draw_layout(gdkWindow, gdkContext, window.x + 5, window.y + 5, pangoTextLayout); + + g_object_unref(pangoTextLayout); + g_object_unref(gdkContext); + g_object_unref(gdkWindow); + +#endif }