From fbfba6fcfbb4f6cef439fc100d11d1a4099d6038 Mon Sep 17 00:00:00 2001 From: "nhotta%netscape.com" Date: Fri, 30 Aug 2002 01:29:07 +0000 Subject: [PATCH] Changed the native conversion to return script runs then use it to create 'styl', bug 163908, r=pink, sr=sfraser. git-svn-id: svn://10.0.0.236/trunk@128515 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/mac/nsClipboard.cpp | 34 ++++++++++++++++++- mozilla/widget/src/mac/nsDragService.cpp | 8 ++++- .../src/mac/nsMacNativeUnicodeConverter.cpp | 27 ++++++++++----- .../src/mac/nsMacNativeUnicodeConverter.h | 4 ++- 4 files changed, 62 insertions(+), 11 deletions(-) diff --git a/mozilla/widget/src/mac/nsClipboard.cpp b/mozilla/widget/src/mac/nsClipboard.cpp index 8b8a749caef..caabd2dc72d 100644 --- a/mozilla/widget/src/mac/nsClipboard.cpp +++ b/mozilla/widget/src/mac/nsClipboard.cpp @@ -63,6 +63,7 @@ #include "nsMacNativeUnicodeConverter.h" #include "nsICharsetConverterManager.h" #include "nsCRT.h" +#include "nsStylClipboardUtils.h" #include #include @@ -158,6 +159,9 @@ nsClipboard :: SetNativeClipboardData ( PRInt32 aWhichClipboard ) PRInt32 plainTextLen = 0; errCode = nsPrimitiveHelpers::ConvertUnicodeToPlatformPlainText ( castedUnicode, dataSize / 2, &plainTextData, &plainTextLen ); + ScriptCodeRun *scriptCodeRuns = nsnull; + PRInt32 scriptRunOutLen; + // if characters are not mapped from Unicode then try native API to convert to // available script if (errCode == NS_ERROR_UENC_NOMAPPING) { @@ -168,13 +172,41 @@ nsClipboard :: SetNativeClipboardData ( PRInt32 aWhichClipboard ) errCode = nsMacNativeUnicodeConverter::ConvertUnicodetoScript(castedUnicode, dataSize / 2, &plainTextData, - &plainTextLen); + &plainTextLen, + &scriptCodeRuns, + &scriptRunOutLen); + } + else if (NS_SUCCEEDED(errCode)) { + // create a single run with the default system script + scriptCodeRuns = NS_REINTERPRET_CAST(ScriptCodeRun*, + nsMemory::Alloc(sizeof(ScriptCodeRun))); + if (scriptCodeRuns) { + scriptCodeRuns[0].offset = 0; + scriptCodeRuns[0].script = (ScriptCode) ::GetScriptManagerVariable(smSysScript); + scriptRunOutLen = 1; + } } if ( NS_SUCCEEDED(errCode) && plainTextData ) { errCode = PutOnClipboard ( 'TEXT', plainTextData, plainTextLen ); nsMemory::Free ( plainTextData ); + + // create 'styl' from the script runs + if (NS_SUCCEEDED(errCode) && scriptCodeRuns) { + char *stylData; + PRInt32 stylLen; + errCode = CreateStylFromScriptRuns(scriptCodeRuns, + scriptRunOutLen, + &stylData, + &stylLen); + if (NS_SUCCEEDED(errCode)) { + errCode = PutOnClipboard ('styl', stylData, stylLen); + nsMemory::Free(stylData); + } + } } + if (scriptCodeRuns) + nsMemory::Free(scriptCodeRuns); } } // if unicode else if ( strcmp(flavorStr, kPNGImageMime) == 0 || strcmp(flavorStr, kJPEGImageMime) == 0 || diff --git a/mozilla/widget/src/mac/nsDragService.cpp b/mozilla/widget/src/mac/nsDragService.cpp index ec0793a4cba..98581792aa4 100644 --- a/mozilla/widget/src/mac/nsDragService.cpp +++ b/mozilla/widget/src/mac/nsDragService.cpp @@ -824,10 +824,16 @@ nsDragService :: GetDataForFlavor ( nsISupportsArray* inDragItems, DragReference nsMemory::Free(plainTextData); plainTextData = nsnull; } + ScriptCodeRun *scriptCodeRuns = nsnull; + PRInt32 scriptRunOutLen; rv = nsMacNativeUnicodeConverter::ConvertUnicodetoScript(castedUnicode, *outDataSize / sizeof(PRUnichar), &plainTextData, - &plainTextLen); + &plainTextLen, + &scriptCodeRuns, + &scriptRunOutLen); + if (scriptCodeRuns) + nsMemory::Free(scriptCodeRuns); } if ( plainTextData && *outData ) { diff --git a/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.cpp b/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.cpp index 6b4e2ec06b1..bc10f5f92ff 100644 --- a/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.cpp +++ b/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.cpp @@ -29,7 +29,6 @@ #include #include #include -#include //------------------------------------------------------------------------- // @@ -103,13 +102,20 @@ nsresult nsMacNativeUnicodeConverter::ConvertScripttoUnicode(ScriptCode aScriptC nsresult nsMacNativeUnicodeConverter::ConvertUnicodetoScript(const PRUnichar *aUnicodeStr, PRInt32 aUnicodeStrLen, char **aMultibyteStr, - PRInt32 *aMultibyteStrlen) + PRInt32 *aMultibyteStrlen, + ScriptCodeRun **aScriptCodeRuns, + PRInt32 *aScriptCodeRunLen) { NS_ENSURE_ARG(aUnicodeStr); NS_ENSURE_ARG(aMultibyteStr); + NS_ENSURE_ARG(aMultibyteStrlen); + NS_ENSURE_ARG(aScriptCodeRuns); + NS_ENSURE_ARG(aScriptCodeRunLen); *aMultibyteStr = nsnull; *aMultibyteStrlen = 0; + *aScriptCodeRuns = nsnull; + *aScriptCodeRunLen = 0; // Get a list of installed script. ItemCount numberOfScriptCodes = ::GetScriptManagerVariable(smEnabled); @@ -132,8 +138,10 @@ nsresult nsMacNativeUnicodeConverter::ConvertUnicodetoScript(const PRUnichar *aU ByteCount inputRead; ItemCount scriptRunOutLen; - std::auto_ptr scriptCodeRuns(new ScriptCodeRun[numberOfScriptCodes]); - if (!scriptCodeRuns.get()) { + ScriptCodeRun *scriptCodeRuns = NS_REINTERPRET_CAST(ScriptCodeRun*, + nsMemory::Alloc(sizeof(ScriptCodeRun) * + aUnicodeStrLen)); + if (!scriptCodeRuns) { ::DisposeUnicodeToTextRunInfo(&unicodeToTextInfo); return NS_ERROR_OUT_OF_MEMORY; } @@ -144,6 +152,7 @@ nsresult nsMacNativeUnicodeConverter::ConvertUnicodetoScript(const PRUnichar *aU if (!outputStr) { ::DisposeUnicodeToTextRunInfo(&unicodeToTextInfo); + nsMemory::Free(scriptCodeRuns); return NS_ERROR_OUT_OF_MEMORY; } ByteCount outputLen = 0; @@ -151,9 +160,9 @@ nsresult nsMacNativeUnicodeConverter::ConvertUnicodetoScript(const PRUnichar *aU err = ::ConvertFromUnicodeToScriptCodeRun(unicodeToTextInfo, aUnicodeStrLen * sizeof(UniChar), (UniChar *) aUnicodeStr, - kUnicodeUseFallbacksBit | + kUnicodeUseFallbacksMask | kUnicodeLooseMappingsMask | - kUnicodeKeepSameEncodingBit, + kUnicodeTextRunMask, 0, nsnull, nsnull, @@ -162,9 +171,9 @@ nsresult nsMacNativeUnicodeConverter::ConvertUnicodetoScript(const PRUnichar *aU &inputRead, &outputLen, outputStr, - numberOfScriptCodes, + aUnicodeStrLen, &scriptRunOutLen, - scriptCodeRuns.get()); + scriptCodeRuns); if (outputLen > 0 && (err == noErr || @@ -175,6 +184,8 @@ nsresult nsMacNativeUnicodeConverter::ConvertUnicodetoScript(const PRUnichar *aU // since this function is called as a fallback *aMultibyteStr = (char *) outputStr; *aMultibyteStrlen = outputLen; + *aScriptCodeRuns = scriptCodeRuns; + *aScriptCodeRunLen = scriptRunOutLen; err = noErr; } diff --git a/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.h b/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.h index 305b15d9c96..4d8136d1041 100644 --- a/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.h +++ b/mozilla/widget/src/mac/nsMacNativeUnicodeConverter.h @@ -48,7 +48,9 @@ public: static nsresult ConvertUnicodetoScript(const PRUnichar *aUnicodeStr, PRInt32 aUnicodeStrLen, char **aMultibyteStr, - PRInt32 *aMultibyteStrlen); + PRInt32 *aMultibyteStrlen, + ScriptCodeRun **aScriptCodeRuns, + PRInt32 *aScriptCodeRunLen); };