From 783db9da6962c331b126f0d2262a0c0600cf46ff Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Wed, 20 Apr 2016 16:57:29 +0200 Subject: Fix copying images to clipboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SkBitmap to QImage conversion in ClipboardQt::WriteBitmap was hardcoding the image format to ARGB32. This failed whenever the format of the SkBitmap provided by Chromium was different. This change backports 1cf9175e from 5.7. Task-number: QTBUG-52715 Change-Id: Icf27b97bc421a2201c307a4514928dcf384d9ba6 Reviewed-by: Michael BrĂ¼ning --- src/core/clipboard_qt.cpp | 3 +- src/core/core_gyp_generator.pro | 1 + src/core/type_conversion.cpp | 116 ++++++++++++++++++++++++++++++++++++++++ src/core/type_conversion.h | 2 + 4 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 src/core/type_conversion.cpp (limited to 'src') diff --git a/src/core/clipboard_qt.cpp b/src/core/clipboard_qt.cpp index 206392840..9ac5c7a17 100644 --- a/src/core/clipboard_qt.cpp +++ b/src/core/clipboard_qt.cpp @@ -240,8 +240,7 @@ void ClipboardQt::WriteWebSmartPaste() void ClipboardQt::WriteBitmap(const SkBitmap& bitmap) { - QImage image(reinterpret_cast(bitmap.getPixels()), bitmap.width(), bitmap.height(), QImage::Format_ARGB32); - getUncommittedData()->setImageData(image.copy()); + getUncommittedData()->setImageData(toQImage(bitmap).copy()); } void ClipboardQt::WriteBookmark(const char* title_data, size_t title_len, const char* url_data, size_t url_len) diff --git a/src/core/core_gyp_generator.pro b/src/core/core_gyp_generator.pro index 58e83f954..ab2a1c48e 100644 --- a/src/core/core_gyp_generator.pro +++ b/src/core/core_gyp_generator.pro @@ -83,6 +83,7 @@ SOURCES = \ ssl_host_state_delegate_qt.cpp \ stream_video_node.cpp \ surface_factory_qt.cpp \ + type_conversion.cpp \ url_request_context_getter_qt.cpp \ url_request_custom_job.cpp \ url_request_custom_job_delegate.cpp \ diff --git a/src/core/type_conversion.cpp b/src/core/type_conversion.cpp new file mode 100644 index 000000000..705d22aed --- /dev/null +++ b/src/core/type_conversion.cpp @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "type_conversion.h" + +namespace QtWebEngineCore { + +QImage toQImage(const SkBitmap &bitmap) +{ + QImage image; + switch (bitmap.colorType()) { + case kUnknown_SkColorType: + break; + case kAlpha_8_SkColorType: + image = toQImage(bitmap, QImage::Format_Alpha8); + break; + case kRGB_565_SkColorType: + image = toQImage(bitmap, QImage::Format_RGB16); + break; + case kARGB_4444_SkColorType: + switch (bitmap.alphaType()) { + case kUnknown_SkAlphaType: + break; + case kUnpremul_SkAlphaType: + // not supported - treat as opaque + case kOpaque_SkAlphaType: + image = toQImage(bitmap, QImage::Format_RGB444); + break; + case kPremul_SkAlphaType: + image = toQImage(bitmap, QImage::Format_ARGB4444_Premultiplied); + break; + } + break; + case kRGBA_8888_SkColorType: + switch (bitmap.alphaType()) { + case kUnknown_SkAlphaType: + break; + case kOpaque_SkAlphaType: + image = toQImage(bitmap, QImage::Format_RGBX8888); + break; + case kPremul_SkAlphaType: + image = toQImage(bitmap, QImage::Format_RGBA8888_Premultiplied); + break; + case kUnpremul_SkAlphaType: + image = toQImage(bitmap, QImage::Format_RGBA8888); + break; + } + break; + case kBGRA_8888_SkColorType: + // we are assuming little-endian arch here. + switch (bitmap.alphaType()) { + case kUnknown_SkAlphaType: + break; + case kOpaque_SkAlphaType: + image = toQImage(bitmap, QImage::Format_RGB32); + break; + case kPremul_SkAlphaType: + image = toQImage(bitmap, QImage::Format_ARGB32_Premultiplied); + break; + case kUnpremul_SkAlphaType: + image = toQImage(bitmap, QImage::Format_ARGB32); + break; + } + break; + case kIndex_8_SkColorType: { + image = toQImage(bitmap, QImage::Format_Indexed8); + SkColorTable *skTable = bitmap.getColorTable(); + if (skTable) { + QVector qTable(skTable->count()); + for (int i = 0; i < skTable->count(); ++i) + qTable[i] = (*skTable)[i]; + image.setColorTable(qTable); + } + break; + } + case kGray_8_SkColorType: + image = toQImage(bitmap, QImage::Format_Grayscale8); + break; + } + return image; +} + +} // namespace QtWebEngineCore diff --git a/src/core/type_conversion.h b/src/core/type_conversion.h index e97ebed6f..a08c4c26f 100644 --- a/src/core/type_conversion.h +++ b/src/core/type_conversion.h @@ -148,6 +148,8 @@ inline QImage toQImage(const SkBitmap &bitmap, QImage::Format format) return QImage((uchar *)pixelRef->pixels(), bitmap.width(), bitmap.height(), format); } +QImage toQImage(const SkBitmap &bitmap); + inline QMatrix4x4 toQt(const SkMatrix44 &m) { QMatrix4x4 qtMatrix( -- cgit v1.2.3