Home | History | Annotate | Download | only in api
      1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 /**
      7  * Defines the <code>PPB_Graphics2D</code> struct representing a 2D graphics
      8  * context within the browser.
      9  */
     10 
     11 [generate_thunk]
     12 
     13 label Chrome {
     14   M14 = 1.0,
     15   M27 = 1.1
     16 };
     17 
     18 /**
     19  * <code>PPB_Graphics2D</code> defines the interface for a 2D graphics context.
     20  */
     21 [macro="PPB_GRAPHICS_2D_INTERFACE"]
     22 interface PPB_Graphics2D {
     23   /**
     24    * Create() creates a 2D graphics context. The returned graphics context will
     25    * not be bound to the module instance on creation (call BindGraphics() on
     26    * the module instance to bind the returned graphics context to the module
     27    * instance).
     28    *
     29    * @param[in] instance The module instance.
     30    * @param[in] size The size of the graphic context.
     31    * @param[in] is_always_opaque Set the <code>is_always_opaque</code> flag to
     32    * <code>PP_TRUE</code> if you know that you will be painting only opaque
     33    * data to this context. This option will disable blending when compositing
     34    * the module with the web page, which might give higher performance on some
     35    * computers.
     36    *
     37    * If you set <code>is_always_opaque</code>, your alpha channel should always
     38    * be set to 0xFF or there may be painting artifacts. The alpha values
     39    * overwrite the destination alpha values without blending when
     40    * <code>is_always_opaque</code> is true.
     41    *
     42    * @return A <code>PP_Resource</code> containing the 2D graphics context if
     43    * successful or 0 if unsuccessful.
     44    */
     45   PP_Resource Create(
     46       [in] PP_Instance instance,
     47       [in] PP_Size size,
     48       [in] PP_Bool is_always_opaque);
     49 
     50   /**
     51    * IsGraphics2D() determines if the given resource is a valid
     52    * <code>Graphics2D</code>.
     53    *
     54    * @param[in] resource A <code>Graphics2D</code> context resource.
     55    *
     56    * @return PP_TRUE if the given resource is a valid <code>Graphics2D</code>,
     57    * <code>PP_FALSE</code> if it is an invalid resource or is a resource of
     58    * another type.
     59    */
     60   PP_Bool IsGraphics2D(
     61       [in] PP_Resource resource);
     62 
     63   /**
     64    * Describe() retrieves the configuration for the given graphics context,
     65    * filling the given values (which must not be <code>NULL</code>).
     66    *
     67    * @param[in] resource The 2D Graphics resource.
     68    * @param[in,out] size The size of the 2D graphics context in the browser.
     69    * @param[in,out] is_always_opaque Identifies whether only opaque data
     70    * will be painted.
     71    *
     72    * @return Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if
     73    * the resource is invalid. The output parameters will be set to 0 on a
     74    * <code>PP_FALSE</code>.
     75    */
     76   [always_set_output_parameters]
     77   PP_Bool Describe(
     78       [in] PP_Resource graphics_2d,
     79       [out] PP_Size size,
     80       [out] PP_Bool is_always_opaque);
     81 
     82   /**
     83    * PaintImageData() enqueues a paint of the given image into the context.
     84    * This function has no effect until you call Flush() As a result, what
     85    * counts is the contents of the bitmap when you call Flush(), not when
     86    * you call this function.
     87    *
     88    * The provided image will be placed at <code>top_left</code> from the top
     89    *  left of the context's internal backing store. Then the pixels contained
     90    * in <code>src_rect</code> will be copied into the backing store. This
     91    * means that the rectangle being painted will be at <code>src_rect</code>
     92    * offset by <code>top_left</code>.
     93    *
     94    * The <code>src_rect</code> is specified in the coordinate system of the
     95    * image being painted, not the context. For the common case of copying the
     96    * entire image, you may specify an empty <code>src_rect</code>.
     97    *
     98    * The painted area of the source bitmap must fall entirely within the
     99    * context. Attempting to paint outside of the context will result in an
    100    * error. However, the source bitmap may fall outside the context, as long
    101    * as the <code>src_rect</code> subset of it falls entirely within the
    102    * context.
    103    *
    104    * There are two methods most modules will use for painting. The first
    105    * method is to generate a new <code>ImageData</code> and then paint it. In
    106    * this case, you'll set the location of your painting to
    107    * <code>top_left</code> and set <code>src_rect</code> to <code>NULL</code>.
    108    * The second is that you're generating small invalid regions out of a larger
    109    * bitmap representing your entire instance. In this case, you would set the
    110    * location of your image to (0,0) and then set <code>src_rect</code> to the
    111    * pixels you changed.
    112    *
    113    * @param[in] resource The 2D Graphics resource.
    114    * @param[in] image The <code>ImageData</code> to be painted.
    115    * @param[in] top_left A <code>Point</code> representing the
    116    * <code>top_left</code> location where the <code>ImageData</code> will be
    117    * painted.
    118    * @param[in] src_rect The rectangular area where the <code>ImageData</code>
    119    * will be painted.
    120    */
    121   void PaintImageData(
    122       [in] PP_Resource graphics_2d,
    123       [in] PP_Resource image_data,
    124       [in] PP_Point top_left,
    125       [in] PP_Rect src_rect);
    126 
    127   /**
    128    * Scroll() enqueues a scroll of the context's backing store. This
    129    * function has no effect until you call Flush(). The data within the
    130    * provided clipping rectangle will be shifted by (dx, dy) pixels.
    131    *
    132    * This function will result in some exposed region which will have undefined
    133    * contents. The module should call PaintImageData() on these exposed regions
    134    * to give the correct contents.
    135    *
    136    * The scroll can be larger than the area of the clipping rectangle, which
    137    * means the current image will be scrolled out of the rectangle. This
    138    * scenario is not an error but will result in a no-op.
    139    *
    140    * @param[in] graphics_2d The 2D Graphics resource.
    141    * @param[in] clip The clipping rectangle.
    142    * @param[in] amount The amount the area in the clipping rectangle will
    143    * shifted.
    144    */
    145   void Scroll(
    146       [in] PP_Resource graphics_2d,
    147       [in] PP_Rect clip_rect,
    148       [in] PP_Point amount);
    149 
    150   /**
    151    * ReplaceContents() provides a slightly more efficient way to paint the
    152    * entire module's image. Normally, calling PaintImageData() requires that
    153    * the browser copy the pixels out of the image and into the graphics
    154    * context's backing store. This function replaces the graphics context's
    155    * backing store with the given image, avoiding the copy.
    156    *
    157    * The new image must be the exact same size as this graphics context. If the
    158    * new image uses a different image format than the browser's native bitmap
    159    * format (use <code>PPB_ImageData.GetNativeImageDataFormat()</code> to
    160    * retrieve the format), then a conversion will be done inside the browser
    161    * which may slow the performance a little bit.
    162    *
    163    * <strong>Note:</strong> The new image will not be painted until you call
    164    * Flush().
    165    *
    166    * After this call, you should take care to release your references to the
    167    * image. If you paint to the image after ReplaceContents(), there is the
    168    * possibility of significant painting artifacts because the page might use
    169    * partially-rendered data when copying out of the backing store.
    170    *
    171    * In the case of an animation, you will want to allocate a new image for the
    172    * next frame. It is best if you wait until the flush callback has executed
    173    * before allocating this bitmap. This gives the browser the option of
    174    * caching the previous backing store and handing it back to you (assuming
    175    * the sizes match). In the optimal case, this means no bitmaps are allocated
    176    * during the animation, and the backing store and "front buffer" (which the
    177    * plugin is painting into) are just being swapped back and forth.
    178    *
    179    * @param[in] graphics_2d The 2D Graphics resource.
    180    * @param[in] image The <code>ImageData</code> to be painted.
    181    */
    182   void ReplaceContents(
    183       [in] PP_Resource graphics_2d,
    184       [in] PP_Resource image_data);
    185 
    186   /**
    187    * Flush() flushes any enqueued paint, scroll, and replace commands to the
    188    * backing store. This function actually executes the updates, and causes a
    189    * repaint of the webpage, assuming this graphics context is bound to a module
    190    * instance.
    191    *
    192    * Flush() runs in asynchronous mode. Specify a callback function and the
    193    * argument for that callback function. The callback function will be
    194    * executed on the calling thread when the image has been painted to the
    195    * screen. While you are waiting for a flush callback, additional calls to
    196    * Flush() will fail.
    197    *
    198    * Because the callback is executed (or thread unblocked) only when the
    199    * instance's image is actually on the screen, this function provides
    200    * a way to rate limit animations. By waiting until the image is on the
    201    * screen before painting the next frame, you can ensure you're not
    202    * flushing 2D graphics faster than the screen can be updated.
    203    *
    204    * <strong>Unbound contexts</strong>
    205    * If the context is not bound to a module instance, you will
    206    * still get a callback. The callback will execute after Flush() returns
    207    * to avoid reentrancy. The callback will not wait until anything is
    208    * painted to the screen because there will be nothing on the screen. The
    209    * timing of this callback is not guaranteed and may be deprioritized by
    210    * the browser because it is not affecting the user experience.
    211    *
    212    * <strong>Off-screen instances</strong>
    213    * If the context is bound to an instance that is currently not visible (for
    214    * example, scrolled out of view) it will behave like the "unbound context"
    215    * case.
    216    *
    217    * <strong>Detaching a context</strong>
    218    * If you detach a context from a module instance, any pending flush
    219    * callbacks will be converted into the "unbound context" case.
    220    *
    221    * <strong>Released contexts</strong>
    222    * A callback may or may not get called even if you have released all
    223    * of your references to the context. This scenario can occur if there are
    224    * internal references to the context suggesting it has not been internally
    225    * destroyed (for example, if it is still bound to an instance) or due to
    226    * other implementation details. As a result, you should be careful to
    227    * check that flush callbacks are for the context you expect and that
    228    * you're capable of handling callbacks for unreferenced contexts.
    229    *
    230    * <strong>Shutdown</strong>
    231    * If a module instance is removed when a flush is pending, the
    232    * callback will not be executed.
    233    *
    234    * @param[in] graphics_2d The 2D Graphics resource.
    235    * @param[in] callback A <code>CompletionCallback</code> to be called when
    236    * the image has been painted on the screen.
    237    *
    238    * @return Returns <code>PP_OK</code> on success or
    239    * <code>PP_ERROR_BADRESOURCE</code> if the graphics context is invalid,
    240    * <code>PP_ERROR_BADARGUMENT</code> if the callback is null and flush is
    241    * being called from the main thread of the module, or
    242    * <code>PP_ERROR_INPROGRESS</code> if a flush is already pending that has
    243    * not issued its callback yet.  In the failure case, nothing will be updated
    244    * and no callback will be scheduled.
    245    */
    246   int32_t Flush(
    247       [in] PP_Resource graphics_2d,
    248       [in] PP_CompletionCallback callback);
    249 
    250   /**
    251    * SetScale() sets the scale factor that will be applied when painting the
    252    * graphics context onto the output device. Typically, if rendering at device
    253    * resolution is desired, the context would be created with the width and
    254    * height scaled up by the view's GetDeviceScale and SetScale called with a
    255    * scale of 1.0 / GetDeviceScale(). For example, if the view resource passed
    256    * to DidChangeView has a rectangle of (w=200, h=100) and a device scale of
    257    * 2.0, one would call Create with a size of (w=400, h=200) and then call
    258    * SetScale with 0.5. One would then treat each pixel in the context as a
    259    * single device pixel.
    260    *
    261    * @param[in] resource A <code>Graphics2D</code> context resource.
    262    * @param[in] scale The scale to apply when painting.
    263    *
    264    * @return Returns <code>PP_TRUE</code> on success or <code>PP_FALSE</code> if
    265    * the resource is invalid or the scale factor is 0 or less.
    266    */
    267   [version=1.1]
    268   PP_Bool SetScale(
    269       [in] PP_Resource resource,
    270       [in] float_t scale);
    271 
    272   /***
    273    * GetScale() gets the scale factor that will be applied when painting the
    274    * graphics context onto the output device.
    275    *
    276    * @param[in] resource A <code>Graphics2D</code> context resource.
    277    *
    278    * @return Returns the scale factor for the graphics context. If the resource
    279    * is not a valid <code>Graphics2D</code> context, this will return 0.0.
    280    */
    281   [version=1.1]
    282   float_t GetScale(
    283       [in] PP_Resource resource);
    284 
    285 };
    286 
    287