Index: ppapi/cpp/paint_manager.h |
=================================================================== |
--- ppapi/cpp/paint_manager.h (revision 116706) |
+++ ppapi/cpp/paint_manager.h (working copy) |
@@ -1,297 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef PPAPI_CPP_PAINT_MANAGER_H_ |
-#define PPAPI_CPP_PAINT_MANAGER_H_ |
- |
-#include <vector> |
- |
-#include "ppapi/cpp/completion_callback.h" |
-#include "ppapi/cpp/graphics_2d.h" |
-#include "ppapi/cpp/paint_aggregator.h" |
- |
-/// @file |
-/// This file defines the API to convert the "plugin push" model of painting |
-/// in PPAPI to a paint request at a later time. |
- |
-namespace pp { |
- |
-class Graphics2D; |
-class Instance; |
-class Point; |
-class Rect; |
- |
-/// This class converts the "instance push" model of painting in PPAPI to a |
-/// paint request at a later time. Usage is that you call Invalidate and |
-/// Scroll, and implement the Client interface. Your OnPaint handler will |
-/// then get called with coalesced paint events. |
-/// |
-/// This class is basically a <code>PaintAggregator</code> that groups updates, |
-/// plus management of callbacks for scheduling paints. |
-/// |
-/// <strong>Example:</strong> |
-/// |
-/// <code> |
-/// |
-/// class MyClass : public pp::Instance, public PaintManager::Client { |
-/// public: |
-/// MyClass() { |
-/// paint_manager_.Initialize(this, this, false); |
-/// } |
-/// |
-/// void ViewChanged(const pp::Rect& position, const pp::Rect& clip) { |
-/// paint_manager_.SetSize(position.size()); |
-/// } |
-/// |
-/// void DoSomething() { |
-/// // This function does something like respond to an event that causes |
-/// // the screen to need updating. |
-/// paint_manager_.InvalidateRect(some_rect); |
-/// } |
-/// |
-/// // Implementation of PaintManager::Client |
-/// virtual bool OnPaint(pp::Graphics2D& device, |
-/// const pp::PaintUpdate& update) { |
-/// // If our app needed scrolling, we would apply that first here. |
-/// |
-/// // Then we would either repaint the area returned by GetPaintBounds or |
-/// // iterate through all the paint_rects. |
-/// |
-/// // The caller will call Flush() for us, so don't do that here. |
-/// return true; |
-/// } |
-/// |
-/// private: |
-/// pp::PaintManager paint_manager_; |
-/// }; |
-/// </code> |
-class PaintManager { |
- public: |
- class Client { |
- public: |
- /// OnPaint() paints the given invalid area of the instance to the given |
- /// graphics device. Returns true if anything was painted. |
- /// |
- /// You are given the list of rects to paint in <code>paint_rects</code>, |
- /// and the union of all of these rects in <code>paint_bounds</code>. You |
- /// only have to paint the area inside each of the |
- /// <code>paint_rects</code>, but can paint more if you want (some apps may |
- /// just want to paint the union). |
- /// |
- /// Do not call Flush() on the graphics device, this will be done |
- /// automatically if you return true from this function since the |
- /// <code>PaintManager</code> needs to handle the callback. |
- /// |
- /// It is legal for you to cause invalidates inside of Paint which will |
- /// then get executed as soon as the Flush for this update has completed. |
- /// However, this is not very nice to the host system since it will spin the |
- /// CPU, possibly updating much faster than necessary. It is best to have a |
- /// 1/60 second timer to do an invalidate instead. This will limit your |
- /// animation to the slower of 60Hz or "however fast Flush can complete." |
- /// |
- /// @param[in] graphics A <code>Graphics2D</code> to be painted. |
- /// @param[in] paint_rects A list of rects to paint. |
- /// @param[in] paint_bounds A union of the rects to paint. |
- /// |
- /// @return true if successful, otherwise false. |
- virtual bool OnPaint(Graphics2D& graphics, |
- const std::vector<Rect>& paint_rects, |
- const Rect& paint_bounds) = 0; |
- |
- protected: |
- // You shouldn't be doing deleting through this interface. |
- virtual ~Client() {} |
- }; |
- |
- /// Default constructor for creating an is_null() <code>PaintManager</code> |
- /// object. If you use this version of the constructor, you must call |
- /// Initialize() below. |
- PaintManager(); |
- |
- /// A constructor to create a new <code>PaintManager</code> with an instance |
- /// and client. |
- /// |
- /// <strong>Note:</strong> You will need to call SetSize() before this class |
- /// will do anything. Normally you do this from the <code>ViewChanged</code> |
- /// method of your instance. |
- /// |
- /// @param instance The instance using this paint manager to do its |
- /// painting. Painting will automatically go to this instance and you don't |
- /// have to manually bind any device context (this is all handled by the |
- /// paint manager). |
- /// |
- /// @param client A non-owning pointer and must remain valid (normally the |
- /// object implementing the Client interface will own the paint manager). |
- /// |
- /// @param is_always_opaque A flag passed to the device contexts that this |
- /// class creates. Set this to true if your instance always draws an opaque |
- /// image to the device. This is used as a hint to the browser that it does |
- /// not need to do alpha blending, which speeds up painting. If you generate |
- /// non-opqaue pixels or aren't sure, set this to false for more general |
- /// blending. |
- /// |
- /// If you set is_always_opaque, your alpha channel should always be set to |
- /// 0xFF or there may be painting artifacts. Being opaque will allow the |
- /// browser to do a memcpy rather than a blend to paint the plugin, and this |
- /// means your alpha values will get set on the page backing store. If these |
- /// values are incorrect, it could mess up future blending. If you aren't |
- /// sure, it is always correct to specify that it it not opaque. |
- PaintManager(Instance* instance, Client* client, bool is_always_opaque); |
- |
- /// Destructor. |
- ~PaintManager(); |
- |
- /// Initialize() must be called if you are using the 0-arg constructor. |
- /// |
- /// @param instance The instance using this paint manager to do its |
- /// painting. Painting will automatically go to this instance and you don't |
- /// have to manually bind any device context (this is all handled by the |
- /// paint manager). |
- /// @param client A non-owning pointer and must remain valid (normally the |
- /// object implementing the Client interface will own the paint manager). |
- /// @param is_always_opaque A flag passed to the device contexts that this |
- /// class creates. Set this to true if your instance always draws an opaque |
- /// image to the device. This is used as a hint to the browser that it does |
- /// not need to do alpha blending, which speeds up painting. If you generate |
- /// non-opqaue pixels or aren't sure, set this to false for more general |
- /// blending. |
- /// |
- /// If you set <code>is_always_opaque</code>, your alpha channel should |
- /// always be set to <code>0xFF</code> or there may be painting artifacts. |
- /// Being opaque will allow the browser to do a memcpy rather than a blend |
- /// to paint the plugin, and this means your alpha values will get set on the |
- /// page backing store. If these values are incorrect, it could mess up |
- /// future blending. If you aren't sure, it is always correct to specify that |
- /// it it not opaque. |
- void Initialize(Instance* instance, Client* client, bool is_always_opaque); |
- |
- /// Setter function setting the max ratio of paint rect area to scroll rect |
- /// area that we will tolerate before downgrading the scroll into a repaint. |
- /// |
- /// If the combined area of paint rects contained within the scroll |
- /// rect grows too large, then we might as well just treat |
- /// the scroll rect as a paint rect. |
- /// |
- /// @param[in] area The max ratio of paint rect area to scroll rect area that |
- /// we will tolerate before downgrading the scroll into a repaint. |
- void set_max_redundant_paint_to_scroll_area(float area) { |
- aggregator_.set_max_redundant_paint_to_scroll_area(area); |
- } |
- |
- /// Setter function for setting the maximum number of paint rects. If we |
- /// exceed this limit, then we'll start combining paint rects (refer to |
- /// CombinePaintRects() for further information). This limiting can be |
- /// important since there is typically some overhead in deciding what to |
- /// paint. If your module is fast at doing these computations, raise this |
- /// threshold, if your module is slow, lower it (probably requires some |
- /// tuning to find the right value). |
- /// |
- /// @param[in] max_rects The maximum number of paint rects. |
- void set_max_paint_rects(size_t max_rects) { |
- aggregator_.set_max_paint_rects(max_rects); |
- } |
- |
- /// SetSize() sets the size of the instance. If the size is the same as the |
- /// previous call, this will be a NOP. If the size has changed, a new device |
- /// will be allocated to the given size and a paint to that device will be |
- /// scheduled. |
- /// |
- /// This function is intended to be called from <code>ViewChanged</code> with |
- /// the size of the instance. Since it tracks the old size and only allocates |
- /// when the size changes, you can always call this function without worrying |
- /// about whether the size changed or ViewChanged() is called for another |
- /// reason (like the position changed). |
- /// |
- /// @param new_size The new size for the instance. |
- void SetSize(const Size& new_size); |
- |
- /// This function provides access to the underlying device in case you need |
- /// it. If you have done a SetSize(), note that the graphics context won't be |
- /// updated until right before the next call to OnPaint(). |
- /// |
- /// <strong>Note:</strong> If you call Flush on this device the paint manager |
- /// will get very confused, don't do this! |
- const Graphics2D& graphics() const { return graphics_; } |
- |
- /// This function provides access to the underlying device in case you need |
- /// it. If you have done a SetSize(), note that the graphics context won't be |
- /// updated until right before the next call to OnPaint(). |
- /// |
- /// <strong>Note:</strong> If you call Flush on this device the paint manager |
- /// will get very confused, don't do this! |
- Graphics2D& graphics() { return graphics_; } |
- |
- /// Invalidate() invalidate the entire instance. |
- void Invalidate(); |
- |
- /// InvalidateRect() Invalidate the provided rect. |
- /// |
- /// @param[in] rect The <code>Rect</code> to be invalidated. |
- void InvalidateRect(const Rect& rect); |
- |
- /// ScrollRect() scrolls the provided <code>clip_rect</code> by the |
- /// <code>amount</code> argument. |
- /// |
- /// @param clip_rect The clip rectangle to scroll. |
- /// @param amount The amount to scroll <code>clip_rect</code>. |
- void ScrollRect(const Rect& clip_rect, const Point& amount); |
- |
- /// GetEffectiveSize() returns the size of the graphics context for the |
- /// next paint operation. This is the pending size if a resize is pending |
- /// (the instance has called SetSize() but we haven't actually painted it |
- /// yet), or the current size of no resize is pending. |
- /// |
- /// @return The effective size. |
- Size GetEffectiveSize() const; |
- |
- private: |
- // Disallow copy and assign (these are unimplemented). |
- PaintManager(const PaintManager&); |
- PaintManager& operator=(const PaintManager&); |
- |
- // Makes sure there is a callback that will trigger a paint at a later time. |
- // This will be either a Flush callback telling us we're allowed to generate |
- // more data, or, if there's no flush callback pending, a manual call back |
- // to the message loop via ExecuteOnMainThread. |
- void EnsureCallbackPending(); |
- |
- // Does the client paint and executes a Flush if necessary. |
- void DoPaint(); |
- |
- // Callback for asynchronous completion of Flush. |
- void OnFlushComplete(int32_t); |
- |
- // Callback for manual scheduling of paints when there is no flush callback |
- // pending. |
- void OnManualCallbackComplete(int32_t); |
- |
- Instance* instance_; |
- |
- // Non-owning pointer. See the constructor. |
- Client* client_; |
- |
- bool is_always_opaque_; |
- |
- CompletionCallbackFactory<PaintManager> callback_factory_; |
- |
- // This graphics device will be is_null() if no graphics has been manually |
- // set yet. |
- Graphics2D graphics_; |
- |
- PaintAggregator aggregator_; |
- |
- // See comment for EnsureCallbackPending for more on how these work. |
- bool manual_callback_pending_; |
- bool flush_pending_; |
- |
- // When we get a resize, we don't bind right away (see SetSize). The |
- // has_pending_resize_ tells us that we need to do a resize for the next |
- // paint operation. When true, the new size is in pending_size_. |
- bool has_pending_resize_; |
- Size pending_size_; |
-}; |
- |
-} // namespace pp |
- |
-#endif // PPAPI_CPP_PAINT_MANAGER_H_ |