Confirmed users
180
edits
No edit summary |
|||
(10 intermediate revisions by 2 users not shown) | |||
Line 5: | Line 5: | ||
= Contributors = | = Contributors = | ||
* Last modified: | * Last modified: May 12, 2010 | ||
* Authors: Oleg Romashin (Nokia), Josh Aas (Mozilla) | * Authors: Oleg Romashin (Nokia), Josh Aas (Mozilla) | ||
* Contributors: Robert O'Callahan (Mozilla) | * Contributors: Robert O'Callahan (Mozilla) | ||
Line 38: | Line 38: | ||
typedef enum { | typedef enum { | ||
/* each pixel is a 32-bit quantity, with | |||
* alpha in the upper 8 bits, then red, then green, then blue. | |||
* The 32-bit quantities are stored native-endian. Pre-multiplied | |||
* alpha is used. (That is, 50% transparent red is 0x80800000, | |||
* not 0x80ff0000.) */ | |||
NPImageFormatARGB32_pre = 0x1, | |||
/* each pixel is a 32-bit quantity, with | |||
* the upper 8 bits unused. Red, Green, and Blue are stored | |||
* in the remaining 24 bits in that order. */ | |||
NPImageFormatRGB24 = 0x2, /* x8r8g8b8 */ | NPImageFormatRGB24 = 0x2, /* x8r8g8b8 */ | ||
NPImageFormatRGB16_565 = 0x4 /* r5g6b5 */ | NPImageFormatRGB16_565 = 0x4 /* r5g6b5 */ | ||
/* non-premultiplied version of RGBA32 format */ | |||
NPImageFormatARGB32 = 0x8, | |||
/* can be extended */ | /* can be extended */ | ||
} NPImageFormat; | } NPImageFormat; | ||
Line 50: | Line 60: | ||
int32_t stride; /* Stride of data image pointer */ | int32_t stride; /* Stride of data image pointer */ | ||
NPImageFormat format; /* Format of image pointer */ | NPImageFormat format; /* Format of image pointer */ | ||
/* size of plugin window in current buffer, used for scale information */ | |||
/* | NPSize pluginSize; | ||
/* "data" points to exposeX/Y point, which is also offset in plugin window area */ | |||
/* | int32_t exposeX; | ||
int32_t exposeY; | |||
/* size of data buffer, size of area where plugin should paint */ | |||
/* exposeX/Y + exposeSize <= pluginSize */ | |||
NPSize exposeSize; | |||
} NPImageData; | } NPImageData; | ||
How to initialize cairo destination surface with this info: | |||
<pre> | |||
cairo_surface_t *src = plugin_window_image (probably cached) | |||
cairo_surface_t *dest = | |||
cairo_image_surface_create_for_data((unsigned char*)event->data, | |||
CAIRO_FORMAT_XXX(event->format), | |||
event->exposeSize.width, | |||
event->exposeSize.height, | |||
event->stride); | |||
cairo_t *cr = cairo_create(dest); | |||
cairo_set_source_surface (cr, src, -event->exposeRect.left, -event->exposeRect.top); | |||
</pre> | |||
= NPImageFormat Type Negotiation = | = NPImageFormat Type Negotiation = | ||
* NPNVsupportedImageFormats (NPNVariable = 19) | * NPNVsupportedImageFormats (NPNVariable = 19) | ||
* | * NPPVImageFormats (NPPVariable = 22) | ||
Negotiating the image format will work similarly to [[NPAPI:Models|drawing and event model negotiation]], but the value of | Negotiating the image format will work similarly to [[NPAPI:Models|drawing and event model negotiation]], but the value of NPNVsupportedImageFormats will be a bitmap of supported types. Based on the browser's supported formats, the plugin should select a subset which it can handle. The format for any given event will be specified in the event, and will be from the plugin's supported subset. | ||
NPImageFormat supportedFormats; | NPImageFormat supportedFormats; | ||
browserFuncs->getvalue(instance, | browserFuncs->getvalue(instance, NPNVsupportedImageFormats, &supportedFormats); | ||
... | ... | ||
browserFuncs->setvalue(instance, | browserFuncs->setvalue(instance, NPPVImageFormats, (void*)supportedSubset); |