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> |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 | 367 |
368 // Otherwise, we need to recreate ourselves. | 368 // Otherwise, we need to recreate ourselves. |
369 g_object_unref(gdk_drawable_get_colormap(pixmap_)); | 369 g_object_unref(gdk_drawable_get_colormap(pixmap_)); |
370 g_object_unref(pixmap_); | 370 g_object_unref(pixmap_); |
371 pixmap_ = NULL; | 371 pixmap_ = NULL; |
372 } | 372 } |
373 | 373 |
374 // |sys_visual| is owned by gdk; we shouldn't free it. | 374 // |sys_visual| is owned by gdk; we shouldn't free it. |
375 GdkVisual* sys_visual = gdk_visual_get_system(); | 375 GdkVisual* sys_visual = gdk_visual_get_system(); |
376 pixmap_ = gdk_pixmap_new(NULL, // use width/height/depth params | 376 pixmap_ = gdk_pixmap_new(NULL, // use width/height/depth params |
377 width, height, sys_visual->depth); | 377 std::max(1, width), std::max(1, height), |
| 378 sys_visual->depth); |
378 GdkColormap* colormap = gdk_colormap_new(gdk_visual_get_system(), | 379 GdkColormap* colormap = gdk_colormap_new(gdk_visual_get_system(), |
379 FALSE); | 380 FALSE); |
380 gdk_drawable_set_colormap(GDK_DRAWABLE(pixmap_), colormap); | 381 gdk_drawable_set_colormap(GDK_DRAWABLE(pixmap_), colormap); |
381 } | 382 } |
382 | 383 |
383 #ifdef DEBUG_RECTANGLES | 384 #ifdef DEBUG_RECTANGLES |
384 namespace { | 385 namespace { |
385 | 386 |
386 // Draw a rectangle on a Cairo surface. | 387 // Draw a rectangle on a Cairo context. |
387 // Useful for debugging various rectangles involved in drawing plugins. | 388 // Useful for debugging various rectangles involved in drawing plugins. |
388 void DrawDebugRectangle(cairo_surface_t* surface, | 389 void DrawDebugRectangle(cairo_t* cairo, |
389 const gfx::Rect& rect, | 390 const gfx::Rect& rect, |
390 float r, float g, float b) { | 391 float r, float g, float b) { |
391 cairo_t* cairo = cairo_create(surface); | |
392 cairo_set_source_rgba(cairo, r, g, b, 0.5); | 392 cairo_set_source_rgba(cairo, r, g, b, 0.5); |
393 cairo_rectangle(cairo, rect.x(), rect.y(), | 393 cairo_rectangle(cairo, rect.x(), rect.y(), |
394 rect.width(), rect.height()); | 394 rect.width(), rect.height()); |
395 cairo_stroke(cairo); | 395 cairo_stroke(cairo); |
396 cairo_destroy(cairo); | |
397 } | 396 } |
398 | 397 |
399 } // namespace | 398 } // namespace |
400 #endif | 399 #endif |
401 | 400 |
402 void WebPluginDelegateImpl::WindowlessPaint(cairo_t* context, | 401 void WebPluginDelegateImpl::WindowlessPaint(cairo_t* context, |
403 const gfx::Rect& damage_rect) { | 402 const gfx::Rect& damage_rect) { |
404 // Compare to: | 403 // Compare to: |
405 // http://mxr.mozilla.org/firefox/source/layout/generic/nsObjectFrame.cpp: | 404 // http://mxr.mozilla.org/firefox/source/layout/generic/nsObjectFrame.cpp: |
406 // nsPluginInstanceOwner::Renderer::NativeDraw(). | 405 // nsPluginInstanceOwner::Renderer::NativeDraw(). |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 | 518 |
520 gfx::Rect pixmap_rect(0, 0, | 519 gfx::Rect pixmap_rect(0, 0, |
521 draw_rect.x() + offset_x + draw_rect.width(), | 520 draw_rect.x() + offset_x + draw_rect.width(), |
522 draw_rect.y() + offset_y + draw_rect.height()); | 521 draw_rect.y() + offset_y + draw_rect.height()); |
523 | 522 |
524 EnsurePixmapAtLeastSize(pixmap_rect.width(), pixmap_rect.height()); | 523 EnsurePixmapAtLeastSize(pixmap_rect.width(), pixmap_rect.height()); |
525 | 524 |
526 // Copy the current image into the pixmap, so the plugin can draw over | 525 // Copy the current image into the pixmap, so the plugin can draw over |
527 // this background. | 526 // this background. |
528 cairo_t* cairo = gdk_cairo_create(pixmap_); | 527 cairo_t* cairo = gdk_cairo_create(pixmap_); |
| 528 double surface_x = -offset_x; |
| 529 double surface_y = -offset_y; |
| 530 cairo_user_to_device(context, &surface_x, &surface_y); |
529 cairo_set_source_surface(cairo, cairo_get_target(context), | 531 cairo_set_source_surface(cairo, cairo_get_target(context), |
530 offset_x, offset_y); | 532 -surface_x, -surface_y); |
531 cairo_rectangle(cairo, draw_rect.x() + offset_x, draw_rect.y() + offset_y, | 533 cairo_rectangle(cairo, draw_rect.x() + offset_x, draw_rect.y() + offset_y, |
532 draw_rect.width(), draw_rect.height()); | 534 draw_rect.width(), draw_rect.height()); |
533 cairo_clip(cairo); | 535 cairo_clip(cairo); |
534 cairo_paint(cairo); | 536 cairo_paint(cairo); |
535 cairo_destroy(cairo); | 537 cairo_destroy(cairo); |
536 | 538 |
537 // Construct the paint message, targeting the pixmap. | 539 // Construct the paint message, targeting the pixmap. |
538 NPEvent np_event = {0}; | 540 NPEvent np_event = {0}; |
539 XGraphicsExposeEvent &event = np_event.xgraphicsexpose; | 541 XGraphicsExposeEvent &event = np_event.xgraphicsexpose; |
540 event.type = GraphicsExpose; | 542 event.type = GraphicsExpose; |
541 event.display = GDK_DISPLAY(); | 543 event.display = GDK_DISPLAY(); |
542 event.drawable = GDK_PIXMAP_XID(pixmap_); | 544 event.drawable = GDK_PIXMAP_XID(pixmap_); |
543 event.x = draw_rect.x() + offset_x; | 545 event.x = draw_rect.x() + offset_x; |
544 event.y = draw_rect.y() + offset_y; | 546 event.y = draw_rect.y() + offset_y; |
545 event.width = draw_rect.width(); | 547 event.width = draw_rect.width(); |
546 event.height = draw_rect.height(); | 548 event.height = draw_rect.height(); |
547 | 549 |
548 // Tell the plugin to paint into the pixmap. | 550 // Tell the plugin to paint into the pixmap. |
549 static StatsRate plugin_paint("Plugin.Paint"); | 551 static StatsRate plugin_paint("Plugin.Paint"); |
550 StatsScope<StatsRate> scope(plugin_paint); | 552 StatsScope<StatsRate> scope(plugin_paint); |
551 NPError err = instance()->NPP_HandleEvent(&np_event); | 553 NPError err = instance()->NPP_HandleEvent(&np_event); |
552 DCHECK_EQ(err, NPERR_NO_ERROR); | 554 DCHECK_EQ(err, NPERR_NO_ERROR); |
553 | 555 |
| 556 cairo_save(context); |
554 // Now copy the rendered image pixmap back into the drawing buffer. | 557 // Now copy the rendered image pixmap back into the drawing buffer. |
555 gdk_cairo_set_source_pixmap(context, pixmap_, -offset_x, -offset_y); | 558 gdk_cairo_set_source_pixmap(context, pixmap_, -offset_x, -offset_y); |
556 cairo_rectangle(context, draw_rect.x(), draw_rect.y(), | 559 cairo_rectangle(context, draw_rect.x(), draw_rect.y(), |
557 draw_rect.width(), draw_rect.height()); | 560 draw_rect.width(), draw_rect.height()); |
558 cairo_clip(context); | 561 cairo_clip(context); |
559 cairo_paint(context); | 562 cairo_paint(context); |
560 | 563 |
561 #ifdef DEBUG_RECTANGLES | 564 #ifdef DEBUG_RECTANGLES |
562 // Draw some debugging rectangles. | 565 // Draw some debugging rectangles. |
563 // Pixmap rect = blue. | 566 // Pixmap rect = blue. |
564 DrawDebugRectangle(context, pixmap_rect, 0, 0, 1); | 567 DrawDebugRectangle(context, pixmap_rect, 0, 0, 1); |
565 // Drawing rect = red. | 568 // Drawing rect = red. |
566 DrawDebugRectangle(context, draw_rect, 1, 0, 0); | 569 DrawDebugRectangle(context, draw_rect, 1, 0, 0); |
567 #endif | 570 #endif |
| 571 cairo_restore(context); |
568 } | 572 } |
569 | 573 |
570 void WebPluginDelegateImpl::WindowlessSetWindow(bool force_set_window) { | 574 void WebPluginDelegateImpl::WindowlessSetWindow(bool force_set_window) { |
571 if (!instance()) | 575 if (!instance()) |
572 return; | 576 return; |
573 | 577 |
574 if (window_rect_.IsEmpty()) // wait for geometry to be set. | 578 if (window_rect_.IsEmpty()) // wait for geometry to be set. |
575 return; | 579 return; |
576 | 580 |
577 DCHECK(instance()->windowless()); | 581 DCHECK(instance()->windowless()); |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 return stream; | 848 return stream; |
845 } | 849 } |
846 | 850 |
847 void WebPluginDelegateImpl::URLRequestRouted(const std::string&url, | 851 void WebPluginDelegateImpl::URLRequestRouted(const std::string&url, |
848 bool notify_needed, | 852 bool notify_needed, |
849 intptr_t notify_data) { | 853 intptr_t notify_data) { |
850 if (notify_needed) { | 854 if (notify_needed) { |
851 instance()->SetURLLoadData(GURL(url.c_str()), notify_data); | 855 instance()->SetURLLoadData(GURL(url.c_str()), notify_data); |
852 } | 856 } |
853 } | 857 } |
OLD | NEW |