android_npapi.h revision 1a15528b92bc6af8faeaad983c380fcca4d1de44
1/*
2 * Copyright 2009, The Android Open Source Project
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *  * Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 *  * Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26/*  Defines the android-specific types and functions as part of npapi
27
28    In particular, defines the window and event types that are passed to
29    NPN_GetValue, NPP_SetWindow and NPP_HandleEvent.
30
31    To minimize what native libraries the plugin links against, some
32    functionality is provided via function-ptrs (e.g. time, sound)
33 */
34
35#ifndef android_npapi_H
36#define android_npapi_H
37
38#include <stdint.h>
39
40#include "npapi.h"
41
42///////////////////////////////////////////////////////////////////////////////
43// General types
44
45enum ANPBitmapFormats {
46    kUnknown_ANPBitmapFormat    = 0,
47    kRGBA_8888_ANPBitmapFormat  = 1,
48    kRGB_565_ANPBitmapFormat    = 2
49};
50typedef int32_t ANPBitmapFormat;
51
52struct ANPPixelPacking {
53    uint8_t AShift;
54    uint8_t ABits;
55    uint8_t RShift;
56    uint8_t RBits;
57    uint8_t GShift;
58    uint8_t GBits;
59    uint8_t BShift;
60    uint8_t BBits;
61};
62
63struct ANPBitmap {
64    void*           baseAddr;
65    ANPBitmapFormat format;
66    int32_t         width;
67    int32_t         height;
68    int32_t         rowBytes;
69};
70
71struct ANPRectF {
72    float   left;
73    float   top;
74    float   right;
75    float   bottom;
76};
77
78struct ANPRectI {
79    int32_t left;
80    int32_t top;
81    int32_t right;
82    int32_t bottom;
83};
84
85struct ANPCanvas;
86struct ANPMatrix;
87struct ANPPaint;
88struct ANPPath;
89struct ANPRegion;
90struct ANPTypeface;
91
92enum ANPMatrixFlags {
93    kIdentity_ANPMatrixFlag     = 0,
94    kTranslate_ANPMatrixFlag    = 0x01,
95    kScale_ANPMatrixFlag        = 0x02,
96    kAffine_ANPMatrixFlag       = 0x04,
97    kPerspective_ANPMatrixFlag  = 0x08,
98};
99typedef uint32_t ANPMatrixFlag;
100
101///////////////////////////////////////////////////////////////////////////////
102// NPN_GetValue
103
104/** queries for a specific ANPInterface.
105
106    Maybe called with NULL for the NPP instance
107
108    NPN_GetValue(inst, interface_enum, ANPInterface*)
109 */
110#define kLogInterfaceV0_ANPGetValue         ((NPNVariable)1000)
111#define kAudioTrackInterfaceV0_ANPGetValue  ((NPNVariable)1001)
112#define kCanvasInterfaceV0_ANPGetValue      ((NPNVariable)1002)
113#define kMatrixInterfaceV0_ANPGetValue      ((NPNVariable)1003)
114#define kPaintInterfaceV0_ANPGetValue       ((NPNVariable)1004)
115#define kPathInterfaceV0_ANPGetValue        ((NPNVariable)1005)
116#define kTypefaceInterfaceV0_ANPGetValue    ((NPNVariable)1006)
117#define kWindowInterfaceV0_ANPGetValue      ((NPNVariable)1007)
118#define kBitmapInterfaceV0_ANPGetValue      ((NPNVariable)1008)
119#define kSurfaceInterfaceV0_ANPGetValue     ((NPNVariable)1009)
120#define kSystemInterfaceV0_ANPGetValue      ((NPNVariable)1010)
121
122/** queries for which drawing model is desired (for the draw event)
123
124    Should be called inside NPP_New(...)
125
126    NPN_GetValue(inst, ANPSupportedDrawingModel_EnumValue, uint32_t* bits)
127 */
128#define kSupportedDrawingModel_ANPGetValue  ((NPNVariable)2000)
129
130///////////////////////////////////////////////////////////////////////////////
131// NPN_SetValue
132
133/** Request to set the drawing model. SetValue will return false if the drawing
134    model is not supported or has insufficient information for configuration.
135
136    NPN_SetValue(inst, kRequestDrawingModel_ANPSetValue, (void*)foo_ANPDrawingModel)
137 */
138#define kRequestDrawingModel_ANPSetValue    ((NPPVariable)1000)
139
140/** These are used as bitfields in ANPSupportedDrawingModels_EnumValue,
141    and as-is in ANPRequestDrawingModel_EnumValue. The drawing model determines
142    how to interpret the ANPDrawingContext provided in the Draw event and how
143    to interpret the NPWindow->window field.
144 */
145enum ANPDrawingModels {
146    /** Draw into a bitmap from the browser thread in response to a Draw event.
147        NPWindow->window is reserved (ignore)
148     */
149    kBitmap_ANPDrawingModel  = 0,
150    /** Draw into a surface (e.g. raster, openGL, etc.) using the Java surface
151        interface. When this model is used the browser will invoke the Java
152        class specified in the plugin's apk manifest. From that class the browser
153        will invoke the appropriate method to return an an instance of a android
154        Java View. The instance is then embedded in the html. The plugin can then
155        manipulate the view as it would any normal Java View in android.
156
157        Unlike the bitmap model, a surface model is opaque so no html content
158        behind the plugin will be  visible. Unless the plugin needs to be
159        transparent the surface model should be chosen over the bitmap model as
160        it will have better performance.
161
162        Further, a plugin can manipulate some surfaces in native code using the
163        ANPSurfaceInterface.  This interface can be used to manipulate Java
164        objects that extend Surface.class by allowing them to access the
165        surface's underlying bitmap in native code.  For instance, if a raster
166        surface is used the plugin can lock, draw directly into the bitmap, and
167        unlock the surface in native code without making JNI calls to the Java
168        surface object.
169     */
170    kSurface_ANPDrawingModel = 0x01,
171};
172typedef int32_t ANPDrawingModel;
173
174/** Request to receive/disable events. If the pointer is NULL then all flags will
175    be disabled. Otherwise, the event type will be enabled iff its corresponding
176    bit in the EventFlags bit field is set.
177
178    NPN_SetValue(inst, ANPAcceptEvents, (void*)EventFlags)
179 */
180#define kAcceptEvents_ANPSetValue           ((NPPVariable)1001)
181
182/** The EventFlags are a set of bits used to determine which types of events the
183    plugin wishes to receive. For example, if the value is 0x03 then both key
184    and touch events will be provided to the plugin.
185 */
186enum ANPEventFlag {
187    kKey_ANPEventFlag               = 0x01,
188    kTouch_ANPEventFlag             = 0x02,
189};
190typedef uint32_t ANPEventFlags;
191
192
193///////////////////////////////////////////////////////////////////////////////
194// ANDROID INTERFACE DEFINITIONS
195
196/** Interfaces provide additional functionality to the plugin via function ptrs.
197    Once an interface is retrieved, it is valid for the lifetime of the plugin
198    (just like browserfuncs).
199
200    All ANPInterfaces begin with an inSize field, which must be set by the
201    caller (plugin) with the number of bytes allocated for the interface.
202    e.g. SomeInterface si; si.inSize = sizeof(si); browser->getvalue(..., &si);
203 */
204struct ANPInterface {
205    uint32_t    inSize;     // size (in bytes) of this struct
206};
207
208enum ANPLogTypes {
209    kError_ANPLogType   = 0,    // error
210    kWarning_ANPLogType = 1,    // warning
211    kDebug_ANPLogType   = 2     // debug only (informational)
212};
213typedef int32_t ANPLogType;
214
215struct ANPLogInterfaceV0 : ANPInterface {
216    /** dumps printf messages to the log file
217        e.g. interface->log(instance, kWarning_ANPLogType, "value is %d", value);
218     */
219    void (*log)(NPP instance, ANPLogType, const char format[], ...);
220};
221
222struct ANPBitmapInterfaceV0 : ANPInterface {
223    /** Returns true if the specified bitmap format is supported, and if packing
224        is non-null, sets it to the packing info for that format.
225     */
226    bool (*getPixelPacking)(ANPBitmapFormat, ANPPixelPacking* packing);
227};
228
229struct ANPMatrixInterfaceV0 : ANPInterface {
230    /** Return a new identity matrix
231     */
232    ANPMatrix*  (*newMatrix)();
233    /** Delete a matrix previously allocated by newMatrix()
234     */
235    void        (*deleteMatrix)(ANPMatrix*);
236
237    ANPMatrixFlag (*getFlags)(const ANPMatrix*);
238
239    void        (*copy)(ANPMatrix* dst, const ANPMatrix* src);
240
241    /** Return the matrix values in a float array (allcoated by the caller),
242        where the values are treated as follows:
243        w  = x * [6] + y * [7] + [8];
244        x' = (x * [0] + y * [1] + [2]) / w;
245        y' = (x * [3] + y * [4] + [5]) / w;
246     */
247    void        (*get3x3)(const ANPMatrix*, float[9]);
248    /** Initialize the matrix from values in a float array,
249        where the values are treated as follows:
250         w  = x * [6] + y * [7] + [8];
251         x' = (x * [0] + y * [1] + [2]) / w;
252         y' = (x * [3] + y * [4] + [5]) / w;
253     */
254    void        (*set3x3)(ANPMatrix*, const float[9]);
255
256    void        (*setIdentity)(ANPMatrix*);
257    void        (*preTranslate)(ANPMatrix*, float tx, float ty);
258    void        (*postTranslate)(ANPMatrix*, float tx, float ty);
259    void        (*preScale)(ANPMatrix*, float sx, float sy);
260    void        (*postScale)(ANPMatrix*, float sx, float sy);
261    void        (*preSkew)(ANPMatrix*, float kx, float ky);
262    void        (*postSkew)(ANPMatrix*, float kx, float ky);
263    void        (*preRotate)(ANPMatrix*, float degrees);
264    void        (*postRotate)(ANPMatrix*, float degrees);
265    void        (*preConcat)(ANPMatrix*, const ANPMatrix*);
266    void        (*postConcat)(ANPMatrix*, const ANPMatrix*);
267
268    /** Return true if src is invertible, and if so, return its inverse in dst.
269        If src is not invertible, return false and ignore dst.
270     */
271    bool        (*invert)(ANPMatrix* dst, const ANPMatrix* src);
272
273    /** Transform the x,y pairs in src[] by this matrix, and store the results
274        in dst[]. The count parameter is treated as the number of pairs in the
275        array. It is legal for src and dst to point to the same memory, but
276        illegal for the two arrays to partially overlap.
277     */
278    void        (*mapPoints)(ANPMatrix*, float dst[], const float src[],
279                             int32_t count);
280};
281
282struct ANPPathInterfaceV0 : ANPInterface {
283    /** Return a new path */
284    ANPPath* (*newPath)();
285
286    /** Delete a path previously allocated by ANPPath() */
287    void (*deletePath)(ANPPath*);
288
289    /** Make a deep copy of the src path, into the dst path (already allocated
290        by the caller).
291     */
292    void (*copy)(ANPPath* dst, const ANPPath* src);
293
294    /** Returns true if the two paths are the same (i.e. have the same points)
295     */
296    bool (*equal)(const ANPPath* path0, const ANPPath* path1);
297
298    /** Remove any previous points, initializing the path back to empty. */
299    void (*reset)(ANPPath*);
300
301    /** Return true if the path is empty (has no lines, quads or cubics). */
302    bool (*isEmpty)(const ANPPath*);
303
304    /** Return the path's bounds in bounds. */
305    void (*getBounds)(const ANPPath*, ANPRectF* bounds);
306
307    void (*moveTo)(ANPPath*, float x, float y);
308    void (*lineTo)(ANPPath*, float x, float y);
309    void (*quadTo)(ANPPath*, float x0, float y0, float x1, float y1);
310    void (*cubicTo)(ANPPath*, float x0, float y0, float x1, float y1,
311                    float x2, float y2);
312    void (*close)(ANPPath*);
313
314    /** Offset the src path by [dx, dy]. If dst is null, apply the
315        change directly to the src path. If dst is not null, write the
316        changed path into dst, and leave the src path unchanged. In that case
317        dst must have been previously allocated by the caller.
318     */
319    void (*offset)(ANPPath* src, float dx, float dy, ANPPath* dst);
320
321    /** Transform the path by the matrix. If dst is null, apply the
322        change directly to the src path. If dst is not null, write the
323        changed path into dst, and leave the src path unchanged. In that case
324        dst must have been previously allocated by the caller.
325     */
326    void (*transform)(ANPPath* src, const ANPMatrix*, ANPPath* dst);
327};
328
329/** ANPColor is always defined to have the same packing on all platforms, and
330    it is always unpremultiplied.
331
332    This is in contrast to 32bit format(s) in bitmaps, which are premultiplied,
333    and their packing may vary depending on the platform, hence the need for
334    ANPBitmapInterface::getPixelPacking()
335 */
336typedef uint32_t ANPColor;
337#define ANPColor_ASHIFT     24
338#define ANPColor_RSHIFT     16
339#define ANPColor_GSHIFT     8
340#define ANPColor_BSHIFT     0
341#define ANP_MAKE_COLOR(a, r, g, b)  \
342                   (((a) << ANPColor_ASHIFT) |  \
343                    ((r) << ANPColor_RSHIFT) |  \
344                    ((g) << ANPColor_GSHIFT) |  \
345                    ((b) << ANPColor_BSHIFT))
346
347enum ANPPaintFlag {
348    kAntiAlias_ANPPaintFlag         = 1 << 0,
349    kFilterBitmap_ANPPaintFlag      = 1 << 1,
350    kDither_ANPPaintFlag            = 1 << 2,
351    kUnderlineText_ANPPaintFlag     = 1 << 3,
352    kStrikeThruText_ANPPaintFlag    = 1 << 4,
353    kFakeBoldText_ANPPaintFlag      = 1 << 5,
354};
355typedef uint32_t ANPPaintFlags;
356
357enum ANPPaintStyles {
358    kFill_ANPPaintStyle             = 0,
359    kStroke_ANPPaintStyle           = 1,
360    kFillAndStroke_ANPPaintStyle    = 2
361};
362typedef int32_t ANPPaintStyle;
363
364enum ANPPaintCaps {
365    kButt_ANPPaintCap   = 0,
366    kRound_ANPPaintCap  = 1,
367    kSquare_ANPPaintCap = 2
368};
369typedef int32_t ANPPaintCap;
370
371enum ANPPaintJoins {
372    kMiter_ANPPaintJoin = 0,
373    kRound_ANPPaintJoin = 1,
374    kBevel_ANPPaintJoin = 2
375};
376typedef int32_t ANPPaintJoin;
377
378enum ANPPaintAligns {
379    kLeft_ANPPaintAlign     = 0,
380    kCenter_ANPPaintAlign   = 1,
381    kRight_ANPPaintAlign    = 2
382};
383typedef int32_t ANPPaintAlign;
384
385enum ANPTextEncodings {
386    kUTF8_ANPTextEncoding   = 0,
387    kUTF16_ANPTextEncoding  = 1,
388};
389typedef int32_t ANPTextEncoding;
390
391enum ANPTypefaceStyles {
392    kBold_ANPTypefaceStyle      = 1 << 0,
393    kItalic_ANPTypefaceStyle    = 1 << 1
394};
395typedef uint32_t ANPTypefaceStyle;
396
397typedef uint32_t ANPFontTableTag;
398
399struct ANPFontMetrics {
400    /** The greatest distance above the baseline for any glyph (will be <= 0) */
401    float   fTop;
402    /** The recommended distance above the baseline (will be <= 0) */
403    float   fAscent;
404    /** The recommended distance below the baseline (will be >= 0) */
405    float   fDescent;
406    /** The greatest distance below the baseline for any glyph (will be >= 0) */
407    float   fBottom;
408    /** The recommended distance to add between lines of text (will be >= 0) */
409    float   fLeading;
410};
411
412struct ANPTypefaceInterfaceV0 : ANPInterface {
413    /** Return a new reference to the typeface that most closely matches the
414        requested name and style. Pass null as the name to return
415        the default font for the requested style. Will never return null
416
417        The 5 generic font names "serif", "sans-serif", "monospace", "cursive",
418        "fantasy" are recognized, and will be mapped to their logical font
419        automatically by this call.
420
421        @param name     May be NULL. The name of the font family.
422        @param style    The style (normal, bold, italic) of the typeface.
423        @return reference to the closest-matching typeface. Caller must call
424                unref() when they are done with the typeface.
425     */
426    ANPTypeface* (*createFromName)(const char name[], ANPTypefaceStyle);
427
428    /** Return a new reference to the typeface that most closely matches the
429        requested typeface and specified Style. Use this call if you want to
430        pick a new style from the same family of the existing typeface.
431        If family is NULL, this selects from the default font's family.
432
433        @param family  May be NULL. The name of the existing type face.
434        @param s       The style (normal, bold, italic) of the type face.
435        @return reference to the closest-matching typeface. Call must call
436                unref() when they are done.
437     */
438    ANPTypeface* (*createFromTypeface)(const ANPTypeface* family,
439                                       ANPTypefaceStyle);
440
441    /** Return the owner count of the typeface. A newly created typeface has an
442        owner count of 1. When the owner count is reaches 0, the typeface is
443        deleted.
444     */
445    int32_t (*getRefCount)(const ANPTypeface*);
446
447    /** Increment the owner count on the typeface
448     */
449    void (*ref)(ANPTypeface*);
450
451    /** Decrement the owner count on the typeface. When the count goes to 0,
452        the typeface is deleted.
453     */
454    void (*unref)(ANPTypeface*);
455
456    /** Return the style bits for the specified typeface
457     */
458    ANPTypefaceStyle (*getStyle)(const ANPTypeface*);
459
460    /** Some fonts are stored in files. If that is true for the fontID, then
461        this returns the byte length of the full file path. If path is not null,
462        then the full path is copied into path (allocated by the caller), up to
463        length bytes. If index is not null, then it is set to the truetype
464        collection index for this font, or 0 if the font is not in a collection.
465
466        Note: getFontPath does not assume that path is a null-terminated string,
467        so when it succeeds, it only copies the bytes of the file name and
468        nothing else (i.e. it copies exactly the number of bytes returned by the
469        function. If the caller wants to treat path[] as a C string, it must be
470        sure that it is allocated at least 1 byte larger than the returned size,
471        and it must copy in the terminating 0.
472
473        If the fontID does not correspond to a file, then the function returns
474        0, and the path and index parameters are ignored.
475
476        @param fontID  The font whose file name is being queried
477        @param path    Either NULL, or storage for receiving up to length bytes
478                       of the font's file name. Allocated by the caller.
479        @param length  The maximum space allocated in path (by the caller).
480                       Ignored if path is NULL.
481        @param index   Either NULL, or receives the TTC index for this font.
482                       If the font is not a TTC, then will be set to 0.
483        @return The byte length of th font's file name, or 0 if the font is not
484                baked by a file.
485     */
486    int32_t (*getFontPath)(const ANPTypeface*, char path[], int32_t length,
487                           int32_t* index);
488
489    /** Return a UTF8 encoded path name for the font directory, or NULL if not
490        supported. If returned, this string address will be valid for the life
491        of the plugin instance. It will always end with a '/' character.
492     */
493    const char* (*getFontDirectoryPath)();
494};
495
496struct ANPPaintInterfaceV0 : ANPInterface {
497    /** Return a new paint object, which holds all of the color and style
498        attributes that affect how things (geometry, text, bitmaps) are drawn
499        in a ANPCanvas.
500
501        The paint that is returned is not tied to any particular plugin
502        instance, but it must only be accessed from one thread at a time.
503     */
504    ANPPaint*   (*newPaint)();
505    void        (*deletePaint)(ANPPaint*);
506
507    ANPPaintFlags (*getFlags)(const ANPPaint*);
508    void        (*setFlags)(ANPPaint*, ANPPaintFlags);
509
510    ANPColor    (*getColor)(const ANPPaint*);
511    void        (*setColor)(ANPPaint*, ANPColor);
512
513    ANPPaintStyle (*getStyle)(const ANPPaint*);
514    void        (*setStyle)(ANPPaint*, ANPPaintStyle);
515
516    float       (*getStrokeWidth)(const ANPPaint*);
517    float       (*getStrokeMiter)(const ANPPaint*);
518    ANPPaintCap (*getStrokeCap)(const ANPPaint*);
519    ANPPaintJoin (*getStrokeJoin)(const ANPPaint*);
520    void        (*setStrokeWidth)(ANPPaint*, float);
521    void        (*setStrokeMiter)(ANPPaint*, float);
522    void        (*setStrokeCap)(ANPPaint*, ANPPaintCap);
523    void        (*setStrokeJoin)(ANPPaint*, ANPPaintJoin);
524
525    ANPTextEncoding (*getTextEncoding)(const ANPPaint*);
526    ANPPaintAlign (*getTextAlign)(const ANPPaint*);
527    float       (*getTextSize)(const ANPPaint*);
528    float       (*getTextScaleX)(const ANPPaint*);
529    float       (*getTextSkewX)(const ANPPaint*);
530    void        (*setTextEncoding)(ANPPaint*, ANPTextEncoding);
531    void        (*setTextAlign)(ANPPaint*, ANPPaintAlign);
532    void        (*setTextSize)(ANPPaint*, float);
533    void        (*setTextScaleX)(ANPPaint*, float);
534    void        (*setTextSkewX)(ANPPaint*, float);
535
536    /** Return the typeface ine paint, or null if there is none. This does not
537        modify the owner count of the returned typeface.
538     */
539    ANPTypeface* (*getTypeface)(const ANPPaint*);
540
541    /** Set the paint's typeface. If the paint already had a non-null typeface,
542        its owner count is decremented. If the new typeface is non-null, its
543        owner count is incremented.
544     */
545    void (*setTypeface)(ANPPaint*, ANPTypeface*);
546
547    /** Return the width of the text. If bounds is not null, return the bounds
548        of the text in that rectangle.
549     */
550    float (*measureText)(ANPPaint*, const void* text, uint32_t byteLength,
551                         ANPRectF* bounds);
552
553    /** Return the number of unichars specifed by the text.
554        If widths is not null, returns the array of advance widths for each
555            unichar.
556        If bounds is not null, returns the array of bounds for each unichar.
557     */
558    int (*getTextWidths)(ANPPaint*, const void* text, uint32_t byteLength,
559                         float widths[], ANPRectF bounds[]);
560
561    /** Return in metrics the spacing values for text, respecting the paint's
562        typeface and pointsize, and return the spacing between lines
563        (descent - ascent + leading). If metrics is NULL, it will be ignored.
564     */
565    float (*getFontMetrics)(ANPPaint*, ANPFontMetrics* metrics);
566};
567
568struct ANPCanvasInterfaceV0 : ANPInterface {
569    /** Return a canvas that will draw into the specified bitmap. Note: the
570        canvas copies the fields of the bitmap, so it need not persist after
571        this call, but the canvas DOES point to the same pixel memory that the
572        bitmap did, so the canvas should not be used after that pixel memory
573        goes out of scope. In the case of creating a canvas to draw into the
574        pixels provided by kDraw_ANPEventType, those pixels are only while
575        handling that event.
576
577        The canvas that is returned is not tied to any particular plugin
578        instance, but it must only be accessed from one thread at a time.
579     */
580    ANPCanvas*  (*newCanvas)(const ANPBitmap*);
581    void        (*deleteCanvas)(ANPCanvas*);
582
583    void        (*save)(ANPCanvas*);
584    void        (*restore)(ANPCanvas*);
585    void        (*translate)(ANPCanvas*, float tx, float ty);
586    void        (*scale)(ANPCanvas*, float sx, float sy);
587    void        (*rotate)(ANPCanvas*, float degrees);
588    void        (*skew)(ANPCanvas*, float kx, float ky);
589    void        (*concat)(ANPCanvas*, const ANPMatrix*);
590    void        (*clipRect)(ANPCanvas*, const ANPRectF*);
591    void        (*clipPath)(ANPCanvas*, const ANPPath*);
592
593    /** Return the current matrix on the canvas
594     */
595    void        (*getTotalMatrix)(ANPCanvas*, ANPMatrix*);
596    /** Return the current clip bounds in local coordinates, expanding it to
597        account for antialiasing edge effects if aa is true. If the
598        current clip is empty, return false and ignore the bounds argument.
599     */
600    bool        (*getLocalClipBounds)(ANPCanvas*, ANPRectF* bounds, bool aa);
601    /** Return the current clip bounds in device coordinates in bounds. If the
602        current clip is empty, return false and ignore the bounds argument.
603     */
604    bool        (*getDeviceClipBounds)(ANPCanvas*, ANPRectI* bounds);
605
606    void        (*drawColor)(ANPCanvas*, ANPColor);
607    void        (*drawPaint)(ANPCanvas*, const ANPPaint*);
608    void        (*drawLine)(ANPCanvas*, float x0, float y0, float x1, float y1,
609                            const ANPPaint*);
610    void        (*drawRect)(ANPCanvas*, const ANPRectF*, const ANPPaint*);
611    void        (*drawOval)(ANPCanvas*, const ANPRectF*, const ANPPaint*);
612    void        (*drawPath)(ANPCanvas*, const ANPPath*, const ANPPaint*);
613    void        (*drawText)(ANPCanvas*, const void* text, uint32_t byteLength,
614                            float x, float y, const ANPPaint*);
615    void       (*drawPosText)(ANPCanvas*, const void* text, uint32_t byteLength,
616                               const float xy[], const ANPPaint*);
617    void        (*drawBitmap)(ANPCanvas*, const ANPBitmap*, float x, float y,
618                              const ANPPaint*);
619    void        (*drawBitmapRect)(ANPCanvas*, const ANPBitmap*,
620                                  const ANPRectI* src, const ANPRectF* dst,
621                                  const ANPPaint*);
622};
623
624struct ANPWindowInterfaceV0 : ANPInterface {
625    /** Given the window field from the NPWindow struct, and an optional rect
626        describing the subset of the window that will be drawn to (may be null)
627        return true if the bitmap for that window can be accessed, and if so,
628        fill out the specified ANPBitmap to point to the window's pixels.
629
630        When drawing is complete, call unlock(window)
631     */
632    bool    (*lockRect)(void* window, const ANPRectI* inval, ANPBitmap*);
633    /** The same as lockRect, but takes a region instead of a rect to specify
634        the area that will be changed/drawn.
635     */
636    bool    (*lockRegion)(void* window, const ANPRegion* inval, ANPBitmap*);
637    /** Given a successful call to lock(window, inval, &bitmap), call unlock
638        to release access to the pixels, and allow the browser to display the
639        results. If lock returned false, unlock should not be called.
640     */
641    void    (*unlock)(void* window);
642    /** Registers a set of rectangles that the plugin would like to keep on
643        screen. The rectangles are listed in order of priority with the highest
644        priority rectangle in location rects[0].  The browser will attempt to keep
645        as many of the rectangles on screen as possible and will scroll them into
646        view in response to the invocation of this method and other various events.
647        The count specifies how many rectangles are in the array. If the count is
648        zero it signals the browser that any existing rectangles should be cleared
649        and no rectangles will be tracked.
650     */
651    void (*setVisibleRects)(NPP instance, const ANPRectI rects[], int32_t count);
652    /** Clears any rectangles that are being tracked as a result of a call to
653        setVisibleRects. This call is equivalent to setVisibleRect(inst, NULL, 0).
654     */
655    void    (*clearVisibleRects)(NPP instance);
656    /** Given a boolean value of true the device will be requested to provide
657        a keyboard. A value of false will result in a request to hide the
658        keyboard. Further, the on-screen keyboard will not be displayed if a
659        physical keyboard is active.
660     */
661    void    (*showKeyboard)(NPP instance, bool value);
662    /** Called when a plugin wishes to enter into full screen mode. The plugin's
663        Java class (defined in the plugin's apk manifest) will be called
664        asynchronously to provide a View object to be displayed full screen.
665     */
666    void    (*requestFullScreen)(NPP instance);
667};
668
669///////////////////////////////////////////////////////////////////////////////
670
671enum ANPSampleFormats {
672    kUnknown_ANPSamleFormat     = 0,
673    kPCM16Bit_ANPSampleFormat   = 1,
674    kPCM8Bit_ANPSampleFormat    = 2
675};
676typedef int32_t ANPSampleFormat;
677
678/** The audio buffer is passed to the callback proc to request more samples.
679    It is owned by the system, and the callback may read it, but should not
680    maintain a pointer to it outside of the scope of the callback proc.
681 */
682struct ANPAudioBuffer {
683    // RO - repeat what was specified in newTrack()
684    int32_t     channelCount;
685    // RO - repeat what was specified in newTrack()
686    ANPSampleFormat  format;
687    /** This buffer is owned by the caller. Inside the callback proc, up to
688        "size" bytes of sample data should be written into this buffer. The
689        address is only valid for the scope of a single invocation of the
690        callback proc.
691     */
692    void*       bufferData;
693    /** On input, specifies the maximum number of bytes that can be written
694        to "bufferData". On output, specifies the actual number of bytes that
695        the callback proc wrote into "bufferData".
696     */
697    uint32_t    size;
698};
699
700enum ANPAudioEvents {
701    /** This event is passed to the callback proc when the audio-track needs
702        more sample data written to the provided buffer parameter.
703     */
704    kMoreData_ANPAudioEvent = 0,
705    /** This event is passed to the callback proc if the audio system runs out
706        of sample data. In this event, no buffer parameter will be specified
707        (i.e. NULL will be passed to the 3rd parameter).
708     */
709    kUnderRun_ANPAudioEvent = 1
710};
711typedef int32_t ANPAudioEvent;
712
713/** Called to feed sample data to the track. This will be called in a separate
714    thread. However, you may call trackStop() from the callback (but you
715    cannot delete the track).
716
717    For example, when you have written the last chunk of sample data, you can
718    immediately call trackStop(). This will take effect after the current
719    buffer has been played.
720
721    The "user" parameter is the same value that was passed to newTrack()
722 */
723typedef void (*ANPAudioCallbackProc)(ANPAudioEvent event, void* user,
724                                     ANPAudioBuffer* buffer);
725
726struct ANPAudioTrack;   // abstract type for audio tracks
727
728struct ANPAudioTrackInterfaceV0 : ANPInterface {
729    /** Create a new audio track, or NULL on failure. The track is initially in
730        the stopped state and therefore ANPAudioCallbackProc will not be called
731        until the track is started.
732     */
733    ANPAudioTrack*  (*newTrack)(uint32_t sampleRate,    // sampling rate in Hz
734                                ANPSampleFormat,
735                                int channelCount,       // MONO=1, STEREO=2
736                                ANPAudioCallbackProc,
737                                void* user);
738    /** Deletes a track that was created using newTrack.  The track can be
739        deleted in any state and it waits for the ANPAudioCallbackProc thread
740        to exit before returning.
741     */
742    void (*deleteTrack)(ANPAudioTrack*);
743
744    void (*start)(ANPAudioTrack*);
745    void (*pause)(ANPAudioTrack*);
746    void (*stop)(ANPAudioTrack*);
747    /** Returns true if the track is not playing (e.g. pause or stop was called,
748        or start was never called.
749     */
750    bool (*isStopped)(ANPAudioTrack*);
751};
752
753///////////////////////////////////////////////////////////////////////////////
754// DEFINITION OF VALUES PASSED THROUGH NPP_HandleEvent
755
756enum ANPEventTypes {
757    kNull_ANPEventType          = 0,
758    kKey_ANPEventType           = 1,
759    /** Mouse events are triggered by either clicking with the navigational pad
760        or by tapping the touchscreen (if the kDown_ANPTouchAction is handled by
761        the plugin then no mouse event is generated).  The kKey_ANPEventFlag has
762        to be set to true in order to receive these events.
763     */
764    kMouse_ANPEventType         = 2,
765    /** Touch events are generated when the user touches on the screen. The
766        kTouch_ANPEventFlag has to be set to true in order to receive these
767        events.
768     */
769    kTouch_ANPEventType         = 3,
770    /** Only triggered by a plugin using the kBitmap_ANPDrawingModel. This event
771        signals that the plugin needs to redraw itself into the provided bitmap.
772     */
773    kDraw_ANPEventType          = 4,
774    kLifecycle_ANPEventType     = 5,
775};
776typedef int32_t ANPEventType;
777
778enum ANPKeyActions {
779    kDown_ANPKeyAction  = 0,
780    kUp_ANPKeyAction    = 1,
781};
782typedef int32_t ANPKeyAction;
783
784#include "ANPKeyCodes.h"
785typedef int32_t ANPKeyCode;
786
787enum ANPKeyModifiers {
788    kAlt_ANPKeyModifier     = 1 << 0,
789    kShift_ANPKeyModifier   = 1 << 1,
790};
791// bit-field containing some number of ANPKeyModifier bits
792typedef uint32_t ANPKeyModifier;
793
794enum ANPMouseActions {
795    kDown_ANPMouseAction  = 0,
796    kUp_ANPMouseAction    = 1,
797};
798typedef int32_t ANPMouseAction;
799
800enum ANPTouchActions {
801    /** This occurs when the user first touches on the screen. As such, this
802        action will always occur prior to any of the other touch actions. If
803        the plugin chooses to not handle this action then no other events
804        related to that particular touch gesture will be generated.
805     */
806    kDown_ANPTouchAction   = 0,
807    kUp_ANPTouchAction     = 1,
808    kMove_ANPTouchAction   = 2,
809    kCancel_ANPTouchAction = 3,
810};
811typedef int32_t ANPTouchAction;
812
813enum ANPLifecycleActions {
814    /** The web view containing this plugin has been paused.  See documentation
815        on the android activity lifecycle for more information.
816     */
817    kPause_ANPLifecycleAction      = 0,
818    /** The web view containing this plugin has been resumed. See documentation
819        on the android activity lifecycle for more information.
820     */
821    kResume_ANPLifecycleAction     = 1,
822    /** The plugin has focus and is now the recipient of input events (e.g. key,
823        touch, etc.)
824     */
825    kGainFocus_ANPLifecycleAction  = 2,
826    /** The plugin has lost focus and will not receive any input events until it
827        regains focus. This event is always preceded by a GainFocus action.
828     */
829    kLoseFocus_ANPLifecycleAction  = 3,
830    /** The browser is running low on available memory and is requesting that
831        the plugin free any unused/inactive resources to prevent a performance
832        degradation.
833     */
834    kFreeMemory_ANPLifecycleAction = 4,
835    /** The page has finished loading. This happens when the page's top level
836        frame reports that it has completed loading.
837     */
838    kOnLoad_ANPLifecycleAction     = 5,
839};
840typedef uint32_t ANPLifecycleAction;
841
842/* This is what is passed to NPP_HandleEvent() */
843struct ANPEvent {
844    uint32_t        inSize;  // size of this struct in bytes
845    ANPEventType    eventType;
846    // use based on the value in eventType
847    union {
848        struct {
849            ANPKeyAction    action;
850            ANPKeyCode      nativeCode;
851            int32_t         virtualCode;    // windows virtual key code
852            ANPKeyModifier  modifiers;
853            int32_t         repeatCount;    // 0 for initial down (or up)
854            int32_t         unichar;        // 0 if there is no value
855        } key;
856        struct {
857            ANPMouseAction  action;
858            int32_t         x;  // relative to your "window" (0...width)
859            int32_t         y;  // relative to your "window" (0...height)
860        } mouse;
861        struct {
862            ANPTouchAction  action;
863            ANPKeyModifier  modifiers;
864            int32_t         x;  // relative to your "window" (0...width)
865            int32_t         y;  // relative to your "window" (0...height)
866        } touch;
867        struct {
868            ANPLifecycleAction  action;
869        } lifecycle;
870        struct {
871            ANPDrawingModel model;
872            // relative to (0,0) in top-left of your plugin
873            ANPRectI        clip;
874            // use based on the value in model
875            union {
876                ANPBitmap   bitmap;
877            } data;
878        } draw;
879        int32_t     other[8];
880    } data;
881};
882
883#endif
884