| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/glue/plugins/pepper_graphics_2d.h" | 5 #include "webkit/glue/plugins/pepper_graphics_2d.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 int32_t Graphics2D::Flush(const PP_CompletionCallback& callback) { | 327 int32_t Graphics2D::Flush(const PP_CompletionCallback& callback) { |
| 328 // Don't allow more than one pending flush at a time. | 328 // Don't allow more than one pending flush at a time. |
| 329 if (HasPendingFlush()) | 329 if (HasPendingFlush()) |
| 330 return PP_ERROR_INPROGRESS; | 330 return PP_ERROR_INPROGRESS; |
| 331 | 331 |
| 332 // TODO(brettw) check that the current thread is not the main one and | 332 // TODO(brettw) check that the current thread is not the main one and |
| 333 // implement blocking flushes in this case. | 333 // implement blocking flushes in this case. |
| 334 if (!callback.func) | 334 if (!callback.func) |
| 335 return PP_ERROR_BADARGUMENT; | 335 return PP_ERROR_BADARGUMENT; |
| 336 | 336 |
| 337 gfx::Rect changed_rect; | 337 bool nothing_visible = true; |
| 338 for (size_t i = 0; i < queued_operations_.size(); i++) { | 338 for (size_t i = 0; i < queued_operations_.size(); i++) { |
| 339 QueuedOperation& operation = queued_operations_[i]; | 339 QueuedOperation& operation = queued_operations_[i]; |
| 340 gfx::Rect op_rect; | 340 gfx::Rect op_rect; |
| 341 switch (operation.type) { | 341 switch (operation.type) { |
| 342 case QueuedOperation::PAINT: | 342 case QueuedOperation::PAINT: |
| 343 ExecutePaintImageData(operation.paint_image, | 343 ExecutePaintImageData(operation.paint_image, |
| 344 operation.paint_x, operation.paint_y, | 344 operation.paint_x, operation.paint_y, |
| 345 operation.paint_src_rect, | 345 operation.paint_src_rect, |
| 346 &op_rect); | 346 &op_rect); |
| 347 break; | 347 break; |
| 348 case QueuedOperation::SCROLL: | 348 case QueuedOperation::SCROLL: |
| 349 ExecuteScroll(operation.scroll_clip_rect, | 349 ExecuteScroll(operation.scroll_clip_rect, |
| 350 operation.scroll_dx, operation.scroll_dy, | 350 operation.scroll_dx, operation.scroll_dy, |
| 351 &op_rect); | 351 &op_rect); |
| 352 break; | 352 break; |
| 353 case QueuedOperation::REPLACE: | 353 case QueuedOperation::REPLACE: |
| 354 ExecuteReplaceContents(operation.replace_image, &op_rect); | 354 ExecuteReplaceContents(operation.replace_image, &op_rect); |
| 355 break; | 355 break; |
| 356 } | 356 } |
| 357 changed_rect = changed_rect.Union(op_rect); | 357 |
| 358 // We need the rect to be in terms of the current clip rect of the plugin |
| 359 // since that's what will actually be painted. If we issue an invalidate |
| 360 // for a clipped-out region, WebKit will do nothing and we won't get any |
| 361 // ViewInitiatedPaint/ViewFlushedPaint calls, leaving our callback stranded. |
| 362 gfx::Rect visible_changed_rect; |
| 363 if (bound_instance_ && !op_rect.IsEmpty()) |
| 364 visible_changed_rect = bound_instance_->clip().Intersect(op_rect); |
| 365 |
| 366 if (bound_instance_ && !visible_changed_rect.IsEmpty()) { |
| 367 if (operation.type == QueuedOperation::SCROLL) { |
| 368 bound_instance_->ScrollRect(operation.scroll_dx, operation.scroll_dy, |
| 369 visible_changed_rect); |
| 370 } else { |
| 371 bound_instance_->InvalidateRect(visible_changed_rect); |
| 372 } |
| 373 nothing_visible = false; |
| 374 } |
| 358 } | 375 } |
| 359 queued_operations_.clear(); | 376 queued_operations_.clear(); |
| 360 flushed_any_data_ = true; | 377 flushed_any_data_ = true; |
| 361 | 378 |
| 362 // We need the rect to be in terms of the current clip rect of the plugin | 379 if (nothing_visible) { |
| 363 // since that's what will actually be painted. If we issue an invalidate | |
| 364 // for a clipped-out region, WebKit will do nothing and we won't get any | |
| 365 // ViewInitiatedPaint/ViewFlushedPaint calls, leaving our callback stranded. | |
| 366 gfx::Rect visible_changed_rect; | |
| 367 if (bound_instance_ && !changed_rect.IsEmpty()) | |
| 368 visible_changed_rect = bound_instance_->clip().Intersect(changed_rect); | |
| 369 | |
| 370 if (bound_instance_ && !visible_changed_rect.IsEmpty()) { | |
| 371 unpainted_flush_callback_.Set(callback); | |
| 372 bound_instance_->InvalidateRect(visible_changed_rect); | |
| 373 } else { | |
| 374 // There's nothing visible to invalidate so just schedule the callback to | 380 // There's nothing visible to invalidate so just schedule the callback to |
| 375 // execute in the next round of the message loop. | 381 // execute in the next round of the message loop. |
| 376 ScheduleOffscreenCallback(FlushCallbackData(callback)); | 382 ScheduleOffscreenCallback(FlushCallbackData(callback)); |
| 383 } else { |
| 384 unpainted_flush_callback_.Set(callback); |
| 377 } | 385 } |
| 378 return PP_ERROR_WOULDBLOCK; | 386 return PP_ERROR_WOULDBLOCK; |
| 379 } | 387 } |
| 380 | 388 |
| 381 bool Graphics2D::ReadImageData(PP_Resource image, | 389 bool Graphics2D::ReadImageData(PP_Resource image, |
| 382 const PP_Point* top_left) { | 390 const PP_Point* top_left) { |
| 383 // Get and validate the image object to paint into. | 391 // Get and validate the image object to paint into. |
| 384 scoped_refptr<ImageData> image_resource(Resource::GetAs<ImageData>(image)); | 392 scoped_refptr<ImageData> image_resource(Resource::GetAs<ImageData>(image)); |
| 385 if (!image_resource) | 393 if (!image_resource) |
| 386 return false; | 394 return false; |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 data.Execute(PP_OK); | 627 data.Execute(PP_OK); |
| 620 } | 628 } |
| 621 | 629 |
| 622 bool Graphics2D::HasPendingFlush() const { | 630 bool Graphics2D::HasPendingFlush() const { |
| 623 return !unpainted_flush_callback_.is_null() || | 631 return !unpainted_flush_callback_.is_null() || |
| 624 !painted_flush_callback_.is_null() || | 632 !painted_flush_callback_.is_null() || |
| 625 offscreen_flush_pending_; | 633 offscreen_flush_pending_; |
| 626 } | 634 } |
| 627 | 635 |
| 628 } // namespace pepper | 636 } // namespace pepper |
| OLD | NEW |