From 5f2dd2ef6c39cf96abdbd1d6f57d15d4662779c5 Mon Sep 17 00:00:00 2001 From: Vladimir Vainer Date: Thu, 29 Jun 2017 16:11:57 +0300 Subject: [PATCH 1/4] Fix #8017: Crash copying croped image to clipboard --- atom/common/api/atom_api_clipboard.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index 430d8629379a..f88df67cf0b5 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -7,6 +7,7 @@ #include "atom/common/native_mate_converters/image_converter.h" #include "atom/common/native_mate_converters/string16_converter.h" #include "base/strings/utf_string_conversions.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/clipboard/scoped_clipboard_writer.h" #include "atom/common/node_includes.h" @@ -166,7 +167,12 @@ gfx::Image Clipboard::ReadImage(mate::Arguments* args) { void Clipboard::WriteImage(const gfx::Image& image, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); - writer.WriteImage(image.AsBitmap()); + SkBitmap bmp; + if (image.AsBitmap().deepCopyTo(&bmp)) { + writer.WriteImage(bmp); + } else { + writer.WriteImage(image.AsBitmap()); + } } #if !defined(OS_MACOSX) From 517184b89b5bbcd3f241e9ad2faa89c837222892 Mon Sep 17 00:00:00 2001 From: Vladimir Vainer Date: Sun, 16 Jul 2017 06:33:37 +0300 Subject: [PATCH 2/4] Do not use deprecated deepCopyTo --- atom/common/api/atom_api_clipboard.cc | 45 ++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index f88df67cf0b5..5d45e7210f27 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -165,14 +165,49 @@ gfx::Image Clipboard::ReadImage(mate::Arguments* args) { return gfx::Image::CreateFrom1xBitmap(bitmap); } +// TODO(ferreus): Replace with sk_tools_utils::copy_to when it's available +bool copy_to(SkBitmap* dst, SkColorType dstColorType, const SkBitmap& src) { + SkPixmap srcPM; + if (!src.peekPixels(&srcPM)) { + return false; + } + SkBitmap tmpDst; + SkImageInfo dstInfo = srcPM.info().makeColorType(dstColorType); + if (!tmpDst.setInfo(dstInfo)) { + return false; + } + // allocate colortable if srcConfig == kIndex8_Config + sk_sp ctable = nullptr; + if (dstColorType == kIndex_8_SkColorType) { + if (src.colorType() != kIndex_8_SkColorType) { + return false; + } + ctable = sk_ref_sp(srcPM.ctable()); + } + if (!tmpDst.tryAllocPixels(ctable.get())) { + return false; + } + SkPixmap dstPM; + if (!tmpDst.peekPixels(&dstPM)) { + return false; + } + if (!srcPM.readPixels(dstPM)) { + return false; + } + dst->swap(tmpDst); + return true; +} + void Clipboard::WriteImage(const gfx::Image& image, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); - SkBitmap bmp; - if (image.AsBitmap().deepCopyTo(&bmp)) { - writer.WriteImage(bmp); - } else { - writer.WriteImage(image.AsBitmap()); + + SkBitmap dst; + SkBitmap src = image.AsBitmap(); + src.lockPixels(); + if (copy_to(&dst, src.colorType(), src)) { + writer.WriteImage(dst); } + src.unlockPixels(); } #if !defined(OS_MACOSX) From e6abfa959ac17379f358a4927d09109aab9a69a0 Mon Sep 17 00:00:00 2001 From: Vladimir Vainer Date: Tue, 8 Aug 2017 13:02:20 +0300 Subject: [PATCH 3/4] Revert "Do not use deprecated deepCopyTo" This reverts commit 517184b89b5bbcd3f241e9ad2faa89c837222892. --- atom/common/api/atom_api_clipboard.cc | 45 +++------------------------ 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index 5d45e7210f27..f88df67cf0b5 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -165,49 +165,14 @@ gfx::Image Clipboard::ReadImage(mate::Arguments* args) { return gfx::Image::CreateFrom1xBitmap(bitmap); } -// TODO(ferreus): Replace with sk_tools_utils::copy_to when it's available -bool copy_to(SkBitmap* dst, SkColorType dstColorType, const SkBitmap& src) { - SkPixmap srcPM; - if (!src.peekPixels(&srcPM)) { - return false; - } - SkBitmap tmpDst; - SkImageInfo dstInfo = srcPM.info().makeColorType(dstColorType); - if (!tmpDst.setInfo(dstInfo)) { - return false; - } - // allocate colortable if srcConfig == kIndex8_Config - sk_sp ctable = nullptr; - if (dstColorType == kIndex_8_SkColorType) { - if (src.colorType() != kIndex_8_SkColorType) { - return false; - } - ctable = sk_ref_sp(srcPM.ctable()); - } - if (!tmpDst.tryAllocPixels(ctable.get())) { - return false; - } - SkPixmap dstPM; - if (!tmpDst.peekPixels(&dstPM)) { - return false; - } - if (!srcPM.readPixels(dstPM)) { - return false; - } - dst->swap(tmpDst); - return true; -} - void Clipboard::WriteImage(const gfx::Image& image, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); - - SkBitmap dst; - SkBitmap src = image.AsBitmap(); - src.lockPixels(); - if (copy_to(&dst, src.colorType(), src)) { - writer.WriteImage(dst); + SkBitmap bmp; + if (image.AsBitmap().deepCopyTo(&bmp)) { + writer.WriteImage(bmp); + } else { + writer.WriteImage(image.AsBitmap()); } - src.unlockPixels(); } #if !defined(OS_MACOSX) From 39c46a9b7506abf89f980fced202cb07a14ffa47 Mon Sep 17 00:00:00 2001 From: Vladimir Vainer Date: Tue, 8 Aug 2017 13:06:39 +0300 Subject: [PATCH 4/4] added comment to mention sk_tools_utils::copy_to --- atom/common/api/atom_api_clipboard.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index f88df67cf0b5..3f923c9ddb8b 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -168,6 +168,7 @@ gfx::Image Clipboard::ReadImage(mate::Arguments* args) { void Clipboard::WriteImage(const gfx::Image& image, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); SkBitmap bmp; + // TODO(ferreus): Replace with sk_tools_utils::copy_to (chrome60) if (image.AsBitmap().deepCopyTo(&bmp)) { writer.WriteImage(bmp); } else {