[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog gui/fb.cpp gui/gtk_glue_agg.cpp...
From: |
Udo Giacomozzi |
Subject: |
[Gnash-commit] gnash ChangeLog gui/fb.cpp gui/gtk_glue_agg.cpp... |
Date: |
Tue, 26 Jun 2007 17:40:09 +0000 |
CVSROOT: /cvsroot/gnash
Module name: gnash
Changes by: Udo Giacomozzi <udog> 07/06/26 17:40:09
Modified files:
. : ChangeLog
gui : fb.cpp gtk_glue_agg.cpp gtk_glue_agg.h
Log message:
* backend/render_handler_agg.{cpp,h}, gui/fb.cpp: moved pixel format
detection code to AGG backend files (so it can be used by any GUI)
* gui/gtk_glue_agg.{cpp,h}: initial work for MIT-SHM support (not
compiled in by default because there is much left to do)
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3612&r2=1.3613
http://cvs.savannah.gnu.org/viewcvs/gnash/gui/fb.cpp?cvsroot=gnash&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/gnash/gui/gtk_glue_agg.cpp?cvsroot=gnash&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/gnash/gui/gtk_glue_agg.h?cvsroot=gnash&r1=1.7&r2=1.8
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/gnash/gnash/ChangeLog,v
retrieving revision 1.3612
retrieving revision 1.3613
diff -u -b -r1.3612 -r1.3613
--- ChangeLog 26 Jun 2007 08:00:53 -0000 1.3612
+++ ChangeLog 26 Jun 2007 17:40:08 -0000 1.3613
@@ -1,3 +1,12 @@
+2007-06-26 Udo Giacomozzi <address@hidden>
+
+ * backend/render_handler_agg_style.h: always premultiply image accessors
+ with alpha channel (partial fix for bug #20257)
+ * backend/render_handler_agg.{cpp,h}, gui/fb.cpp: moved pixel format
+ detection code to AGG backend files (so it can be used by any GUI)
+ * gui/gtk_glue_agg.{cpp,h}: initial work for MIT-SHM support (not
+ compiled in by default because there is much left to do)
+
2007-06-26 Zou Lunkai <address@hidden>
* testsuite/misc-ming.all/callFunction_test.c: testcase for
ActionCallFunction,
Index: gui/fb.cpp
===================================================================
RCS file: /cvsroot/gnash/gnash/gui/fb.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- gui/fb.cpp 28 May 2007 15:40:59 -0000 1.32
+++ gui/fb.cpp 26 Jun 2007 17:40:09 -0000 1.33
@@ -255,57 +255,15 @@
var_screeninfo.blue.length);
log_msg("Total bits per pixel: %d", var_screeninfo.bits_per_pixel);
+ char* pixelformat = agg_detect_pixel_format(
+ var_screeninfo.red.offset, var_screeninfo.red.length,
+ var_screeninfo.green.offset, var_screeninfo.green.length,
+ var_screeninfo.blue.offset, var_screeninfo.blue.length,
+ _bpp
+ );
- // 15 bits RGB (hicolor)
- if ((var_screeninfo.red.offset==10)
- && (var_screeninfo.red.length==5)
- && (var_screeninfo.green.offset==5)
- && (var_screeninfo.green.length==5)
- && (var_screeninfo.blue.offset==0)
- && (var_screeninfo.blue.length==5) ) {
-
- agg_handler = create_render_handler_agg("RGB555");
-
- } else
- // 16 bits RGB (hicolor)
- if ((var_screeninfo.red.offset==11)
- && (var_screeninfo.red.length==5)
- && (var_screeninfo.green.offset==5)
- && (var_screeninfo.green.length==6)
- && (var_screeninfo.blue.offset==0)
- && (var_screeninfo.blue.length==5) ) {
-
- agg_handler = create_render_handler_agg("RGB565");
-
- } else
-
- // 24 bits RGB (truecolor)
- if ((var_screeninfo.red.offset==16)
- && (var_screeninfo.red.length==8)
- && (var_screeninfo.green.offset==8)
- && (var_screeninfo.green.length==8)
- && (var_screeninfo.blue.offset==0)
- && (var_screeninfo.blue.length==8) ) {
-
- if (_bpp==24)
- agg_handler = create_render_handler_agg("BGR24");
- else
- agg_handler = create_render_handler_agg("BGRA32");
-
- } else
- // 24 bits BGR (truecolor)
- if ((var_screeninfo.red.offset==0)
- && (var_screeninfo.red.length==8)
- && (var_screeninfo.green.offset==8)
- && (var_screeninfo.green.length==8)
- && (var_screeninfo.blue.offset==16)
- && (var_screeninfo.blue.length==8)) {
-
- if (_bpp==24)
- agg_handler = create_render_handler_agg("RGB24");
- else
- agg_handler = create_render_handler_agg("RGBA32");
-
+ if (pixelformat) {
+ agg_handler = create_render_handler_agg(pixelformat);
} else {
log_error("The pixel format of your framebuffer is not supported.");
return false;
Index: gui/gtk_glue_agg.cpp
===================================================================
RCS file: /cvsroot/gnash/gnash/gui/gtk_glue_agg.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- gui/gtk_glue_agg.cpp 28 May 2007 15:41:00 -0000 1.17
+++ gui/gtk_glue_agg.cpp 26 Jun 2007 17:40:09 -0000 1.18
@@ -18,7 +18,7 @@
//
//
-/* $Id: gtk_glue_agg.cpp,v 1.17 2007/05/28 15:41:00 ann Exp $ */
+/* $Id: gtk_glue_agg.cpp,v 1.18 2007/06/26 17:40:09 udog Exp $ */
/*
@@ -47,6 +47,15 @@
#include "render_handler_agg.h"
#include "gtk_glue_agg.h"
+#ifdef ENABLE_MIT_SHM
+#include <X11/Xlib.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/extensions/XShm.h>
+#include <gdk/gdkprivate.h>
+#endif
+
+
namespace gnash
{
@@ -63,12 +72,16 @@
GtkAggGlue::~GtkAggGlue()
{
free(_offscreenbuf);
+ destroy_shm_image();
}
bool
GtkAggGlue::init(int /*argc*/, char **/*argv*/[])
{
gdk_rgb_init();
+
+ _have_shm = check_mit_shm(gdk_display);
+
#ifdef PIXELFORMAT_RGB565
_bpp = 16;
#else
@@ -79,6 +92,65 @@
return true;
}
+bool
+GtkAggGlue::check_mit_shm(Display *display)
+{
+#ifdef ENABLE_MIT_SHM
+ int major, minor, dummy;
+ Bool pixmaps;
+
+ log_msg("Checking support for MIT-SHM...");
+
+ if (!XQueryExtension(display, "MIT-SHM", &dummy, &dummy, &dummy))
+ {
+ log_msg("WARNING: No MIT-SHM extension available, using standard XLib "
+ "calls (slower)");
+ return false;
+ }
+
+ if (XShmQueryVersion(display, &major, &minor, &pixmaps )!=True)
+ {
+ log_msg("WARNING: MIT-SHM not ready (network link?), using standard XLib "
+ "calls (slower)");
+ return false;
+ }
+
+ log_msg("NOTICE: MIT-SHM available (version %d.%d)!", major, minor);
+
+
+#else
+ return false; // !ifdef ENABLE_MIT_SHM
+#endif
+
+}
+
+void
+GtkAggGlue::create_shm_image(unsigned int width, unsigned int height)
+{
+
+ //Visual xvisual = ((GdkVisualPrivate*) visual)->xvisual;
+
+ destroy_shm_image();
+
+ /*if (!_shm_info) {
+ _shm_info = malloc(sizeof XShmSegmentInfo);
+ }*/
+
+ //_shm_image = XShmCreateImage();
+}
+
+void
+GtkAggGlue::destroy_shm_image()
+{
+#ifdef ENABLE_MIT_SHM
+ if (!_shm_image) return; // not allocated
+
+ XDestroyImage(_shm_image);
+ _shm_image=NULL;
+
+#endif
+}
+
void
GtkAggGlue::prepDrawingArea(GtkWidget *drawing_area)
{
@@ -86,8 +158,51 @@
}
render_handler*
+GtkAggGlue::create_shm_handler()
+{
+#ifdef ENABLE_MIT_SHM
+ GdkVisual *visual = gdk_drawable_get_visual(_drawing_area->window);
+
+ char *pixelformat = agg_detect_pixel_format(
+ visual->red_shift, visual->red_prec,
+ visual->green_shift, visual->green_prec,
+ visual->blue_shift, visual->blue_prec,
+ visual->depth);
+
+ if (!pixelformat) {
+ log_msg("Pixel format of X server not recognized (%d:%d, %d:%d, %d:%d, %d
bpp)",
+ visual->red_shift, visual->red_prec,
+ visual->green_shift, visual->green_prec,
+ visual->blue_shift, visual->blue_prec,
+ visual->depth);
+ return NULL;
+ }
+
+ log_msg("X server is using %s pixel format", pixelformat);
+
+ render_handler* res = create_render_handler_agg(pixelformat);
+
+ if (!res)
+ log_msg("Failed creating a renderer instance for this pixel format. "
+ "Most probably Gnash has not compiled in (configured) support "
+ "for this pixel format - using standard pixmaps instead");
+
+
+ return res;
+
+#else
+ return NULL;
+#endif
+}
+
+render_handler*
GtkAggGlue::createRenderHandler()
{
+
+ // try with MIT-SHM
+ _agg_renderer = create_shm_handler();
+ if (_agg_renderer) return _agg_renderer;
+
#ifdef PIXELFORMAT_RGB565
#warning A pixel format of RGB565; you must have a (hacked) GTK which supports
\
this format (e.g., GTK on the OLPC).
@@ -107,6 +222,8 @@
#define CHUNK_SIZE (100*100*(_bpp/8))
+ create_shm_image(width, height);
+
if (width == _width && height == _height)
return;
Index: gui/gtk_glue_agg.h
===================================================================
RCS file: /cvsroot/gnash/gnash/gui/gtk_glue_agg.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- gui/gtk_glue_agg.h 28 May 2007 15:41:00 -0000 1.7
+++ gui/gtk_glue_agg.h 26 Jun 2007 17:40:09 -0000 1.8
@@ -18,11 +18,20 @@
//
//
+// Define this macro to enable experimental support for MIT-SHM
+// see http://www.xfree86.org/current/mit-shm.html
+//#define ENABLE_MIT_SHM 1
+
#include "gtk_glue.h"
#include <gtk/gtk.h>
#include <gdk/gdk.h>
+#ifdef ENABLE_MIT_SHM
+#include <X11/extensions/XShm.h>
+#endif
+
+
namespace gnash
{
@@ -45,6 +54,29 @@
int _offscreenbuf_size;
render_handler *_agg_renderer;
int _width, _height, _bpp;
+ bool _have_shm;
+#ifdef ENABLE_MIT_SHM
+ XImage *_shm_image;
+ XShmSegmentInfo *_shm_info;
+#endif
+
+ /// Checks if the MIT-SHM extension is available (supported by the server)
+ bool check_mit_shm(Display *display);
+
+ /// Tries to create a SHM image.
+ ///
+ /// This can still fail even if check_mit_shm() returned true in case
+ /// we have not the appropriate pixel format compiled in or any other
+ /// error happened.
+ void create_shm_image(unsigned int width, unsigned int height);
+
+ /// Destroys a previously created SHM image (deals with NULL pointer)
+ void destroy_shm_image();
+
+ /// Tries to create a AGG render handler based on the X server pixel
+ /// format. Returns NULL on failure.
+ render_handler *create_shm_handler();
+
};
} // namespace gnash
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog gui/fb.cpp gui/gtk_glue_agg.cpp...,
Udo Giacomozzi <=