summaryrefslogtreecommitdiffstats
path: root/ui/base/clipboard/clipboard_linux.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ui/base/clipboard/clipboard_linux.cc')
-rw-r--r--ui/base/clipboard/clipboard_linux.cc19
1 files changed, 16 insertions, 3 deletions
diff --git a/ui/base/clipboard/clipboard_linux.cc b/ui/base/clipboard/clipboard_linux.cc
index 3cbe7d8..883dcf5 100644
--- a/ui/base/clipboard/clipboard_linux.cc
+++ b/ui/base/clipboard/clipboard_linux.cc
@@ -15,6 +15,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/utf_string_conversions.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/canvas_skia.h"
#include "ui/gfx/gtk_util.h"
#include "ui/gfx/size.h"
@@ -304,6 +305,8 @@ void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer,
types->push_back(UTF8ToUTF16(kMimeTypeText));
if (IsFormatAvailable(GetHtmlFormatType(), buffer))
types->push_back(UTF8ToUTF16(kMimeTypeHTML));
+ if (IsFormatAvailable(GetBitmapFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(kMimeTypePNG));
*contains_filenames = false;
}
@@ -377,9 +380,19 @@ void Clipboard::ReadHTML(Clipboard::Buffer buffer, string16* markup,
}
SkBitmap Clipboard::ReadImage(Buffer buffer) const {
- // TODO(dcheng): implement this.
- NOTIMPLEMENTED();
- return SkBitmap();
+ ScopedGObject<GdkPixbuf>::Type pixbuf(
+ gtk_clipboard_wait_for_image(clipboard_));
+ if (!pixbuf.get())
+ return SkBitmap();
+
+ gfx::CanvasSkia canvas(gdk_pixbuf_get_width(pixbuf.get()),
+ gdk_pixbuf_get_height(pixbuf.get()),
+ false);
+ cairo_t* context = canvas.beginPlatformPaint();
+ gdk_cairo_set_source_pixbuf(context, pixbuf.get(), 0.0, 0.0);
+ cairo_paint(context);
+ canvas.endPlatformPaint();
+ return canvas.ExtractBitmap();
}
void Clipboard::ReadBookmark(string16* title, std::string* url) const {