| Index: pdf/paint_manager.cc
|
| diff --git a/pdf/paint_manager.cc b/pdf/paint_manager.cc
|
| index 226994c3b054faa2e8b30af6768d844daa66f51e..01256e2f9e98cc18da693152857be6d952f6cded 100644
|
| --- a/pdf/paint_manager.cc
|
| +++ b/pdf/paint_manager.cc
|
| @@ -23,6 +23,7 @@ PaintManager::PaintManager(pp::Instance* instance,
|
| callback_factory_(NULL),
|
| manual_callback_pending_(false),
|
| flush_pending_(false),
|
| + flush_requested_(false),
|
| has_pending_resize_(false),
|
| graphics_need_to_be_bound_(false),
|
| pending_device_scale_(1.0),
|
| @@ -89,16 +90,38 @@ void PaintManager::SetSize(const pp::Size& new_size, float device_scale) {
|
| if (GetEffectiveSize() == new_size &&
|
| GetEffectiveDeviceScale() == device_scale)
|
| return;
|
| -
|
| has_pending_resize_ = true;
|
| pending_size_ = new_size;
|
| pending_device_scale_ = device_scale;
|
|
|
| view_size_changed_waiting_for_paint_ = true;
|
| -
|
| Invalidate();
|
| }
|
|
|
| +void PaintManager::SetTransform(float scale,
|
| + pp::Point origin,
|
| + pp::Point translate) {
|
| + if (!flush_pending_) {
|
| + graphics_.SetLayerTransform(scale, origin, translate);
|
| + flush_pending_ = true;
|
| + flush_requested_ = false;
|
| + graphics_.Flush(
|
| + callback_factory_.NewCallback(&PaintManager::OnFlushComplete));
|
| + scale_ = 1.f;
|
| + origin_ = pp::Point();
|
| + transform_ = pp::Point();
|
| + } else {
|
| + flush_requested_ = true;
|
| + graphics_.SetLayerTransform(scale, origin, translate);
|
| + }
|
| +}
|
| +
|
| +void PaintManager::SetTransform(float scale) {
|
| + graphics_.SetLayerTransform(scale, pp::Point(), pp::Point());
|
| +
|
| + EnsureCallbackPending();
|
| +}
|
| +
|
| void PaintManager::Invalidate() {
|
| if (graphics_.is_null() && !has_pending_resize_)
|
| return;
|
| @@ -251,10 +274,8 @@ void PaintManager::DoPaint() {
|
| graphics_.PaintImageData(
|
| ready_rect.image_data, ready_rect.offset, ready_rect.rect);
|
| }
|
| -
|
| int32_t result = graphics_.Flush(
|
| callback_factory_.NewCallback(&PaintManager::OnFlushComplete));
|
| -
|
| // If you trigger this assertion, then your plugin has called Flush()
|
| // manually. When using the PaintManager, you should not call Flush, it will
|
| // handle that for you because it needs to know when it can do the next paint
|
| @@ -284,7 +305,12 @@ void PaintManager::DoPaint() {
|
| void PaintManager::OnFlushComplete(int32_t) {
|
| DCHECK(flush_pending_);
|
| flush_pending_ = false;
|
| -
|
| + // If there was another flush request while flushing we flush again.
|
| + if (flush_requested_) {
|
| + flush_requested_ = false;
|
| + graphics_.Flush(
|
| + callback_factory_.NewCallback(&PaintManager::OnFlushComplete));
|
| + }
|
| // If more paints were enqueued while we were waiting for the flush to
|
| // complete, execute them now.
|
| if (aggregator_.HasPendingUpdate())
|
| @@ -294,7 +320,6 @@ void PaintManager::OnFlushComplete(int32_t) {
|
| void PaintManager::OnManualCallbackComplete(int32_t) {
|
| DCHECK(manual_callback_pending_);
|
| manual_callback_pending_ = false;
|
| -
|
| // Just because we have a manual callback doesn't mean there are actually any
|
| // invalid regions. Even though we only schedule this callback when something
|
| // is pending, a Flush callback could have come in before this callback was
|
|
|