| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/webplugin_delegate_impl.h" | 5 #include "webkit/glue/plugins/webplugin_delegate_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include <gtk/gtk.h> | 10 #include <gtk/gtk.h> |
| 11 #include <gdk/gdkx.h> | 11 #include <gdk/gdkx.h> |
| 12 | 12 |
| 13 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
| 14 #include "base/file_util.h" | 14 #include "base/file_util.h" |
| 15 #include "base/gfx/blit.h" |
| 15 #include "base/message_loop.h" | 16 #include "base/message_loop.h" |
| 16 #include "base/process_util.h" | 17 #include "base/process_util.h" |
| 17 #include "base/stats_counters.h" | 18 #include "base/stats_counters.h" |
| 18 #include "base/string_util.h" | 19 #include "base/string_util.h" |
| 19 #include "webkit/api/public/WebCursorInfo.h" | 20 #include "webkit/api/public/WebCursorInfo.h" |
| 20 #include "webkit/api/public/WebInputEvent.h" | 21 #include "webkit/api/public/WebInputEvent.h" |
| 21 // #include "webkit/default_plugin/plugin_impl.h" | 22 // #include "webkit/default_plugin/plugin_impl.h" |
| 22 #include "webkit/glue/glue_util.h" | 23 #include "webkit/glue/glue_util.h" |
| 23 #include "webkit/glue/webplugin.h" | 24 #include "webkit/glue/webplugin.h" |
| 24 #include "webkit/glue/plugins/gtk_plugin_container.h" | 25 #include "webkit/glue/plugins/gtk_plugin_container.h" |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 window_.height = window_rect_.height(); | 510 window_.height = window_rect_.height(); |
| 510 window_.width = window_rect_.width(); | 511 window_.width = window_rect_.width(); |
| 511 window_.x = window_rect_.x() - draw_rect.x(); | 512 window_.x = window_rect_.x() - draw_rect.x(); |
| 512 window_.y = window_rect_.y() - draw_rect.y(); | 513 window_.y = window_rect_.y() - draw_rect.y(); |
| 513 window_.type = NPWindowTypeDrawable; | 514 window_.type = NPWindowTypeDrawable; |
| 514 DCHECK(window_.ws_info); | 515 DCHECK(window_.ws_info); |
| 515 NPError err = instance()->NPP_SetWindow(&window_); | 516 NPError err = instance()->NPP_SetWindow(&window_); |
| 516 DCHECK_EQ(err, NPERR_NO_ERROR); | 517 DCHECK_EQ(err, NPERR_NO_ERROR); |
| 517 } | 518 } |
| 518 | 519 |
| 520 gfx::Rect pixmap_draw_rect = draw_rect; |
| 521 pixmap_draw_rect.Offset(offset_x, offset_y); |
| 522 |
| 519 gfx::Rect pixmap_rect(0, 0, | 523 gfx::Rect pixmap_rect(0, 0, |
| 520 draw_rect.x() + offset_x + draw_rect.width(), | 524 pixmap_draw_rect.right(), |
| 521 draw_rect.y() + offset_y + draw_rect.height()); | 525 pixmap_draw_rect.bottom()); |
| 522 | 526 |
| 523 EnsurePixmapAtLeastSize(pixmap_rect.width(), pixmap_rect.height()); | 527 EnsurePixmapAtLeastSize(pixmap_rect.width(), pixmap_rect.height()); |
| 524 | 528 |
| 525 // Copy the current image into the pixmap, so the plugin can draw over | 529 // Copy the current image into the pixmap, so the plugin can draw over |
| 526 // this background. | 530 // this background. |
| 527 cairo_t* cairo = gdk_cairo_create(pixmap_); | 531 cairo_t* cairo = gdk_cairo_create(pixmap_); |
| 528 double surface_x = -offset_x; | 532 BlitContextToContext(cairo, pixmap_draw_rect, context, draw_rect.origin()); |
| 529 double surface_y = -offset_y; | |
| 530 cairo_user_to_device(context, &surface_x, &surface_y); | |
| 531 cairo_set_source_surface(cairo, cairo_get_target(context), | |
| 532 -surface_x, -surface_y); | |
| 533 cairo_rectangle(cairo, draw_rect.x() + offset_x, draw_rect.y() + offset_y, | |
| 534 draw_rect.width(), draw_rect.height()); | |
| 535 cairo_clip(cairo); | |
| 536 cairo_paint(cairo); | |
| 537 cairo_destroy(cairo); | 533 cairo_destroy(cairo); |
| 538 | 534 |
| 539 // Construct the paint message, targeting the pixmap. | 535 // Construct the paint message, targeting the pixmap. |
| 540 NPEvent np_event = {0}; | 536 NPEvent np_event = {0}; |
| 541 XGraphicsExposeEvent &event = np_event.xgraphicsexpose; | 537 XGraphicsExposeEvent &event = np_event.xgraphicsexpose; |
| 542 event.type = GraphicsExpose; | 538 event.type = GraphicsExpose; |
| 543 event.display = GDK_DISPLAY(); | 539 event.display = GDK_DISPLAY(); |
| 544 event.drawable = GDK_PIXMAP_XID(pixmap_); | 540 event.drawable = GDK_PIXMAP_XID(pixmap_); |
| 545 event.x = draw_rect.x() + offset_x; | 541 event.x = pixmap_draw_rect.x(); |
| 546 event.y = draw_rect.y() + offset_y; | 542 event.y = pixmap_draw_rect.y(); |
| 547 event.width = draw_rect.width(); | 543 event.width = pixmap_draw_rect.width(); |
| 548 event.height = draw_rect.height(); | 544 event.height = pixmap_draw_rect.height(); |
| 549 | 545 |
| 550 // Tell the plugin to paint into the pixmap. | 546 // Tell the plugin to paint into the pixmap. |
| 551 static StatsRate plugin_paint("Plugin.Paint"); | 547 static StatsRate plugin_paint("Plugin.Paint"); |
| 552 StatsScope<StatsRate> scope(plugin_paint); | 548 StatsScope<StatsRate> scope(plugin_paint); |
| 553 NPError err = instance()->NPP_HandleEvent(&np_event); | 549 NPError err = instance()->NPP_HandleEvent(&np_event); |
| 554 DCHECK_EQ(err, NPERR_NO_ERROR); | 550 DCHECK_EQ(err, NPERR_NO_ERROR); |
| 555 | 551 |
| 556 cairo_save(context); | 552 cairo_save(context); |
| 557 // Now copy the rendered image pixmap back into the drawing buffer. | 553 // Now copy the rendered image pixmap back into the drawing buffer. |
| 558 gdk_cairo_set_source_pixmap(context, pixmap_, -offset_x, -offset_y); | 554 gdk_cairo_set_source_pixmap(context, pixmap_, -offset_x, -offset_y); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 return stream; | 844 return stream; |
| 849 } | 845 } |
| 850 | 846 |
| 851 void WebPluginDelegateImpl::URLRequestRouted(const std::string&url, | 847 void WebPluginDelegateImpl::URLRequestRouted(const std::string&url, |
| 852 bool notify_needed, | 848 bool notify_needed, |
| 853 intptr_t notify_data) { | 849 intptr_t notify_data) { |
| 854 if (notify_needed) { | 850 if (notify_needed) { |
| 855 instance()->SetURLLoadData(GURL(url.c_str()), notify_data); | 851 instance()->SetURLLoadData(GURL(url.c_str()), notify_data); |
| 856 } | 852 } |
| 857 } | 853 } |
| OLD | NEW |