Renderer* GtkAggGlue::createRenderHandler() { GdkVisual* wvisual = gdk_drawable_get_visual(_drawing_area->window); GdkImage* tmpimage = gdk_image_new (GDK_IMAGE_FASTEST, wvisual, 1, 1); const GdkVisual* visual = tmpimage->visual; // FIXME: we use bpp instead of depth, because depth doesn't appear to // include the padding byte(s) the GdkImage actually has. const char *pixelformat = agg_detect_pixel_format( visual->red_shift, visual->red_prec, visual->green_shift, visual->green_prec, visual->blue_shift, visual->blue_prec, tmpimage->bpp * 8); gdk_image_destroy(tmpimage); _agg_renderer = create_Renderer_agg(pixelformat); if (! _agg_renderer) { boost::format fmt = boost::format( _("Could not create AGG renderer with pixelformat %s") ) % pixelformat; throw GnashException(fmt.str()); } return _agg_renderer; }
Renderer * FBAggGlue::createRenderHandler() { // GNASH_REPORT_FUNCTION; if (!_device) { log_error(_("No Device layer initialized yet!")); return 0; } const int width = _device->getWidth(); const int height = _device->getHeight(); _validbounds.setTo(0, 0, width - 1, height - 1); // choose apropriate pixel format renderer::rawfb::RawFBDevice *rawfb = reinterpret_cast <renderer::rawfb::RawFBDevice *>(_device.get()); log_debug("red channel: %d / %d", rawfb->getRedOffset(), rawfb->getRedSize()); log_debug("green channel: %d / %d", rawfb->getGreenOffset(), rawfb->getGreenSize()); log_debug("blue channel: %d / %d", rawfb->getBlueOffset(), rawfb->getBlueSize()); log_debug("Total bits per pixel: %d", rawfb->getDepth()); const char* pixelformat = agg_detect_pixel_format( rawfb->getRedOffset(), rawfb->getRedSize(), rawfb->getGreenOffset(), rawfb->getGreenSize(), rawfb->getBlueOffset(), rawfb->getBlueSize(), rawfb->getDepth()); Renderer_agg_base *agg_handler = 0; if (pixelformat) { agg_handler = create_Renderer_agg(pixelformat); } else { log_error(_("The pixel format of your framebuffer could not be detected.")); return false; } assert(agg_handler != NULL); // Get the memory buffer to have AGG render into. boost::uint8_t *mem = 0; if (rawfb->isSingleBuffered()) { log_debug(_("Double buffering disabled")); mem = rawfb->getFBMemory(); } else { log_debug(_("Double buffering enabled")); mem = rawfb->getOffscreenBuffer(); } // This attaches the memory from the device to the AGG renderer agg_handler->init_buffer((unsigned char *)mem, rawfb->getFBMemSize(), width, height, rawfb->getStride()); _renderer.reset(agg_handler); return (Renderer *)agg_handler; }