Use existing image decoders to handle clipboard BMP data.

This gets rid of the old nsImageClipboard widget code in favor of using
the nsBMPDecoder in imglib.
This commit is contained in:
wolfbeast 2019-02-07 22:06:24 +01:00 committed by Roy Tam
commit c15f982d7a
11 changed files with 149 additions and 651 deletions

View file

@ -26,7 +26,6 @@
#include "nsReadableUtils.h"
#include "nsUnicharUtils.h"
#include "nsPrimitiveHelpers.h"
#include "nsImageClipboard.h"
#include "nsIWidget.h"
#include "nsIComponentManager.h"
#include "nsWidgetsCID.h"
@ -36,6 +35,8 @@
#include "nsIOutputStream.h"
#include "nsEscape.h"
#include "nsIObserverService.h"
#include "nsMimeTypes.h"
#include "imgITools.h"
using mozilla::LogLevel;
@ -474,17 +475,45 @@ nsresult nsClipboard::GetNativeDataOffClipboard(IDataObject * aDataObject, UINT
if (aMIMEImageFormat)
{
uint32_t allocLen = 0;
unsigned char * clipboardData;
const char * clipboardData;
if (NS_SUCCEEDED(GetGlobalData(stm.hGlobal, (void **)&clipboardData, &allocLen)))
{
nsImageFromClipboard converter;
nsIInputStream * inputStream;
converter.GetEncodedImageStream(clipboardData, aMIMEImageFormat, &inputStream); // addrefs for us, don't release
if ( inputStream ) {
*aData = inputStream;
*aLen = sizeof(nsIInputStream*);
result = NS_OK;
nsCOMPtr<imgIContainer> container;
nsCOMPtr<imgITools> imgTools = do_CreateInstance("@mozilla.org/image/tools;1");
nsCOMPtr<nsIInputStream> inputStream;
nsresult rv = NS_NewByteInputStream(getter_AddRefs(inputStream),
clipboardData,
allocLen,
NS_ASSIGNMENT_DEPEND);
NS_ENSURE_SUCCESS(rv, rv);
result = imgTools->DecodeImage(inputStream,
NS_LITERAL_CSTRING(IMAGE_BMP_MS_CLIPBOARD),
getter_AddRefs(container));
if (NS_FAILED(result)) {
break;
}
nsAutoCString mimeType;
if (strcmp(aMIMEImageFormat, kJPGImageMime) == 0) {
mimeType.Assign(IMAGE_JPEG);
} else {
mimeType.Assign(aMIMEImageFormat);
}
result = imgTools->EncodeImage(container, mimeType, EmptyString(),
getter_AddRefs(inputStream));
if (NS_FAILED(result)) {
break;
}
if (!inputStream) {
result = NS_ERROR_FAILURE;
break;
}
*aData = inputStream.forget().take();
*aLen = sizeof(nsIInputStream*);
}
} break;