NPAPI:DrawImage

Problem Summary

It is very painful to render plugin content to non-X surfaces on Linux using X11. (For Mozilla if MOZ_X11 is defined then HandleEvent is operating with XEvent's). When browser renders its content into a memory buffer or to some other surface (Qt::RasterPaintEngine/cairo-image-surface which are not very friendly to X), then we are forced to do data moving X-client-X...

Proposal

I propose an NPAPI DrawImage event type which would allow a plugin to render directly into an image memory buffer, without involving X-Surface.

Drawing Image Event

For documentation on negotiating event type, see Plugins:IndependentEventModel. The drawing image type variable for Platform independent image rendering is:

* NPEventType_DrawImage

Using NPImageData structure as event where NPImageData:

typedef struct _NPImageData
{
  /* Image data parameters */
  char*         data;       /* image pointer */
  int32_t       stride;     /* Stride of data image pointer */
  NPImageFormat format;     /* Format of image pointer */
  NPSize        dataSize;   /* Data buffer size */
  /* Clip rectangle, must be used for trusted plugins */
  int32_t       x;          /* Expose x relative to 0,0 of plugin window area*/
  int32_t       y;          /* Expose y relative to 0,0 of plugin window area */
  uint32_t      width;      /* Expose width */
  uint32_t      height;     /* Expose height */
  /* Position and scale values for plugin area */
  float         translateX; /* translate X matrix value, (x offset) */
  float         translateY; /* translate Y matrix value, (y offset) */
  /* Defines plugin window size on scaled context, if 1 then size = window size */
  float         scaleX;     /* scale X matrix value */
  float         scaleY;     /* scale Y matrix value */
} NPImageData;

where NPImageFormat (similar to the current Cairo image format list):

typedef enum {
  NPImageFormatARGB32     = 0x0001,     /* a8r8g8b8 */
  NPImageFormatRGB24      = 0x0002,     /* x8r8g8b8 */
  NPImageFormatRGB16_565  = 0x0004      /* r5g6b5   */
  ......
  More formats could be added here if needed
  ......
} NPImageFormat;

NPImageFormat type negotiation

NPNVsupportsImageFormat = 5000,

Similar to Event types negotiation Plugins:IndependentEventModel#NPEventType_negotiation

NPImageFormat aFormats;
browser->getvalue(instance, NPNVsupportsImageFormat, &aFormats)

Then the plugin should decide which formats supported by plugin and browser (remove bits which are not supported by plugin), and send a value to browser:

browser->setvalue(instance, NPNVsupportsImageFormat, commonFormats);

And then browser should use only formats enumerated in commonFormats value.

According to plugin state (transparency), and platform proffered depth/image-format browser will send event to plugin with specific format.