| Index: pdf/paint_aggregator.h
|
| ===================================================================
|
| --- pdf/paint_aggregator.h (revision 0)
|
| +++ pdf/paint_aggregator.h (revision 0)
|
| @@ -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_
|
|
|
| Property changes on: pdf\paint_aggregator.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|