gnash-commit
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]