summaryrefslogtreecommitdiff
path: root/xfa_test/pdf/paint_aggregator.h
diff options
context:
space:
mode:
Diffstat (limited to 'xfa_test/pdf/paint_aggregator.h')
-rw-r--r--xfa_test/pdf/paint_aggregator.h130
1 files changed, 130 insertions, 0 deletions
diff --git a/xfa_test/pdf/paint_aggregator.h b/xfa_test/pdf/paint_aggregator.h
new file mode 100644
index 0000000000..96f61e0878
--- /dev/null
+++ b/xfa_test/pdf/paint_aggregator.h
@@ -0,0 +1,130 @@
+// 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_AGGREGATOR_H_
+#define PDF_PAINT_AGGREGATOR_H_
+
+#include <vector>
+
+#include "ppapi/cpp/image_data.h"
+#include "ppapi/cpp/rect.h"
+#include "ppapi/cpp/rect.h"
+
+// This class is responsible for aggregating multiple invalidation and scroll
+// commands to produce a scroll and repaint sequence. You can use this manually
+// to track your updates, but most applications will use the PaintManager to
+// additionally handle the necessary callbacks on top of the PaintAggregator
+// functionality.
+//
+// See http://code.google.com/p/ppapi/wiki/2DPaintingModel
+class PaintAggregator {
+ public:
+ // Stores information about a rectangle that has finished painting. The
+ // PaintManager will paint it only when everything else on the screen is also
+ // ready.
+ struct ReadyRect {
+ pp::Point offset;
+ pp::Rect rect;
+ pp::ImageData image_data;
+ };
+
+ struct PaintUpdate {
+ PaintUpdate();
+ ~PaintUpdate();
+
+ // True if there is a scroll applied. This indicates that the scroll delta
+ // and scroll_rect are nonzero (just as a convenience).
+ bool has_scroll;
+
+ // The amount to scroll by. Either the X or Y may be nonzero to indicate a
+ // scroll in that direction, but there will never be a scroll in both
+ // directions at the same time (this will be converted to a paint of the
+ // region instead).
+ //
+ // If there is no scroll, this will be (0, 0).
+ pp::Point scroll_delta;
+
+ // The rectangle that should be scrolled by the scroll_delta. If there is no
+ // scroll, this will be (0, 0, 0, 0). We only track one scroll command at
+ // once. If there are multiple ones, they will be converted to invalidates.
+ pp::Rect scroll_rect;
+
+ // A list of all the individual dirty rectangles. This is an aggregated list
+ // of all invalidate calls. Different rectangles may be unified to produce a
+ // minimal list with no overlap that is more efficient to paint. This list
+ // also contains the region exposed by any scroll command.
+ std::vector<pp::Rect> paint_rects;
+ };
+
+ PaintAggregator();
+
+ // There is a PendingUpdate if InvalidateRect or ScrollRect were called and
+ // ClearPendingUpdate was not called.
+ bool HasPendingUpdate() const;
+ void ClearPendingUpdate();
+
+ PaintUpdate GetPendingUpdate();
+
+ // Sets the result of a call to the plugin to paint. This includes rects that
+ // are finished painting (ready), and ones that are still in-progress
+ // (pending).
+ void SetIntermediateResults(const std::vector<ReadyRect>& ready,
+ const std::vector<pp::Rect>& pending);
+
+ // Returns the rectangles that are ready to be painted.
+ std::vector<ReadyRect> GetReadyRects() const;
+
+ // The given rect should be repainted.
+ 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);
+
+ private:
+ // This structure is an internal version of PaintUpdate. It's different in
+ // two respects:
+ //
+ // - The scroll damange (area exposed by the scroll operation, if any) is
+ // maintained separately from the dirty rects generated by calling
+ // InvalidateRect. We need to know this distinction for some operations.
+ //
+ // - The paint bounds union is computed on the fly so we don't have to keep
+ // a rectangle up-to-date as we do different operations.
+ class InternalPaintUpdate {
+ public:
+ InternalPaintUpdate();
+ ~InternalPaintUpdate();
+
+ // Computes the rect damaged by scrolling within |scroll_rect| by
+ // |scroll_delta|. This rect must be repainted. It is not included in
+ // paint_rects.
+ pp::Rect GetScrollDamage() const;
+
+ pp::Point scroll_delta;
+ pp::Rect scroll_rect;
+
+ // Does not include the scroll damage rect unless
+ // synthesized_scroll_damage_rect_ is set.
+ std::vector<pp::Rect> paint_rects;
+
+ // Rectangles that are finished painting.
+ std::vector<ReadyRect> ready_rects;
+
+ // Whether we have added the scroll damage rect to paint_rects yet or not.
+ bool synthesized_scroll_damage_rect_;
+ };
+
+ pp::Rect ScrollPaintRect(const pp::Rect& paint_rect,
+ const pp::Point& amount) const;
+ void InvalidateScrollRect();
+
+ // Internal method used by InvalidateRect. If |check_scroll| is true, then the
+ // method checks if there's a pending scroll and if so also invalidates |rect|
+ // in the new scroll position.
+ void InvalidateRectInternal(const pp::Rect& rect, bool check_scroll);
+
+ InternalPaintUpdate update_;
+};
+
+#endif // PDF_PAINT_AGGREGATOR_H_