Index: pdf/paint_manager.h |
=================================================================== |
--- pdf/paint_manager.h (revision 0) |
+++ pdf/paint_manager.h (revision 0) |
@@ -0,0 +1,205 @@ |
+// Copyright (c) 2010 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 PDF_PAINT_MANAGER_H_ |
+#define PDF_PAINT_MANAGER_H_ |
+ |
+#include <vector> |
+ |
+#include "pdf/paint_aggregator.h" |
+#include "ppapi/cpp/graphics_2d.h" |
+#include "ppapi/utility/completion_callback_factory.h" |
+ |
+namespace pp { |
+class Graphics2D; |
+class Instance; |
+class Point; |
+class Rect; |
+}; |
+ |
+// Custom PaintManager for the PDF plugin. This is branched from the Pepper |
+// version. The difference is that this supports progressive rendering of dirty |
+// rects, where multiple calls to the rendering engine are needed. It also |
+// supports having higher-priority rects flushing right away, i.e. the |
+// scrollbars. |
+// |
+// The client's OnPaint |
+class PaintManager { |
+ public: |
+ // Like PaintAggregator's version, but allows the plugin to tell us whether |
+ // it should be flushed to the screen immediately or when the rest of the |
+ // plugin viewport is ready. |
+ struct ReadyRect { |
+ pp::Point offset; |
+ pp::Rect rect; |
+ pp::ImageData image_data; |
+ bool flush_now; |
+ |
+ ReadyRect(const pp::Rect& r, const pp::ImageData& i, bool f) |
+ : rect(r), image_data(i), flush_now(f) {} |
+ |
+ operator PaintAggregator::ReadyRect() const { |
+ PaintAggregator::ReadyRect rv; |
+ rv.offset = offset; |
+ rv.rect = rect; |
+ rv.image_data = image_data; |
+ return rv; |
+ } |
+ }; |
+ class Client { |
+ public: |
+ // Paints the given invalid area of the plugin to the given graphics |
+ // device. Returns true if anything was painted. |
+ // |
+ // You are given the list of rects to paint in |paint_rects|. You can |
+ // combine painting into less rectangles if it's more efficient. When a |
+ // rect is painted, information about that paint should be inserted into |
+ // |ready|. Otherwise if a paint needs more work, add the rect to |
+ // |pending|. If |pending| is not empty, your OnPaint function will get |
+ // called again. Once OnPaint is called and it returns no pending rects, |
+ // all the previously ready rects will be flushed on screen. The exception |
+ // is for ready rects that have |flush_now| set to true. These will be |
+ // flushed right away. |
+ // |
+ // Do not call Flush() on the graphics device, this will be done |
+ // automatically if you return true from this function since the |
+ // PaintManager needs to handle the callback. |
+ // |
+ // Calling Invalidate/Scroll is not allowed while inside an OnPaint |
+ virtual void OnPaint(const std::vector<pp::Rect>& paint_rects, |
+ std::vector<ReadyRect>* ready, |
+ std::vector<pp::Rect>* pending) = 0; |
+ protected: |
+ // You shouldn't be doing deleting through this interface. |
+ virtual ~Client() {} |
+ }; |
+ |
+ // The instance is the plugin 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). |
+ // |
+ // The Client is a non-owning pointer and must remain valid (normally the |
+ // object implementing the Client interface will own the paint manager). |
+ // |
+ // The is_always_opaque flag will be passed to the device contexts that this |
+ // class creates. Set this to true if your plugin 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. |
+ // |
+ // You will need to call SetSize before this class will do anything. Normally |
+ // you do this from the ViewChanged method of your plugin instance. |
+ PaintManager(pp::Instance* instance, Client* client, bool is_always_opaque); |
+ |
+ ~PaintManager(); |
+ |
+ // Returns the size of the graphics context to allocate for a given plugin |
+ // size. We may allocated a slightly larger buffer than required so that we |
+ // don't have to resize the context when scrollbars appear/dissapear due to |
+ // zooming (which can result in flickering). |
+ static pp::Size GetNewContextSize(const pp::Size& current_context_size, |
+ const pp::Size& plugin_size); |
+ |
+ // You must call this function before using if you use the 0-arg constructor. |
+ // See the constructor for what these arguments mean. |
+ void Initialize(pp::Instance* instance, Client* client, |
+ bool is_always_opaque); |
+ |
+ // Sets the size of the plugin. 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 is intended to be called from ViewChanged with the size of the |
+ // plugin. 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). |
+ void SetSize(const pp::Size& new_size, float new_device_scale); |
+ |
+ // Invalidate the entire plugin. |
+ void Invalidate(); |
+ |
+ // Invalidate the given rect. |
+ void InvalidateRect(const pp::Rect& rect); |
+ |
+ // The given rect should be scrolled by the given amounts. |
+ void ScrollRect(const pp::Rect& clip_rect, const pp::Point& amount); |
+ |
+ // Returns the size of the graphics context for the next paint operation. |
+ // This is the pending size if a resize is pending (the plugin has called |
+ // SetSize but we haven't actually painted it yet), or the current size of |
+ // no resize is pending. |
+ pp::Size GetEffectiveSize() const; |
+ float GetEffectiveDeviceScale() 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); |
+ |
+ pp::Instance* instance_; |
+ |
+ // Non-owning pointer. See the constructor. |
+ Client* client_; |
+ |
+ bool is_always_opaque_; |
+ |
+ pp::CompletionCallbackFactory<PaintManager> callback_factory_; |
+ |
+ // This graphics device will be is_null() if no graphics has been manually |
+ // set yet. |
+ pp::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_; |
+ bool graphics_need_to_be_bound_; |
+ pp::Size pending_size_; |
+ pp::Size plugin_size_; |
+ float pending_device_scale_; |
+ float device_scale_; |
+ |
+ // True iff we're in the middle of a paint. |
+ bool in_paint_; |
+ |
+ // True if we haven't painted the plugin viewport yet. |
+ bool first_paint_; |
+ |
+ // True when the view size just changed and we're waiting for a paint. |
+ bool view_size_changed_waiting_for_paint_; |
+}; |
+ |
+#endif // PDF_PAINT_MANAGER_H_ |
Property changes on: pdf\paint_manager.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |