diff options
author | Armin Le Grand <alg@apache.org> | 2013-01-10 16:28:40 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-06-13 14:50:46 +0100 |
commit | e0cce521f1ad0cc384d30ce2f1077ea229fffe62 (patch) | |
tree | ae40b74bceb4b036d87b79e861f5eef76ec41102 /dtrans | |
parent | 6ed3ef87d2472bad71b719e9ec927e72acfd2850 (diff) |
Resolves: #i121504# Support for alpha channel in clipboard for all systems
(cherry picked from commit ef3931ff410117e1237b3bef7bc090e8b83b9519)
Conflicts:
automation/source/server/statemnt.cxx
basic/source/runtime/methods.cxx
canvas/source/vcl/devicehelper.cxx
canvas/source/vcl/spritedevicehelper.cxx
drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
drawinglayer/source/tools/converters.cxx
dtrans/source/win32/dtobj/FmtFilter.cxx
editeng/source/items/bulitem.cxx
extensions/source/scanner/sanedlg.cxx
external/gcc3_specific/makefile.mk
filter/source/graphicfilter/eos2met/eos2met.cxx
filter/source/graphicfilter/ios2met/ios2met.cxx
filter/source/msfilter/msdffimp.cxx
fpicker/source/office/iodlg.cxx
framework/source/fwe/classes/addonsoptions.cxx
framework/source/fwe/helper/actiontriggerhelper.cxx
sc/source/filter/excel/xiescher.cxx
sc/source/ui/docshell/docsh.cxx
sc/source/ui/inc/viewfunc.hxx
sd/source/ui/app/sdxfer.cxx
sd/source/ui/unoidl/unopage.cxx
sd/source/ui/view/sdview3.cxx
sfx2/source/appl/fileobj.cxx
sfx2/source/appl/linkmgr2.cxx
sfx2/source/dialog/filedlghelper.cxx
sfx2/source/dialog/intro.cxx
sfx2/source/doc/docinf.cxx
sot/inc/sot/formats.hxx
sot/source/base/formats.cxx
svtools/bmpmaker/bmpcore.cxx
svtools/bmpmaker/bmpsum.cxx
svtools/inc/svtools/transfer.hxx
svtools/source/filter/filter.cxx
svtools/source/filter/wmf/emfwr.cxx
svtools/source/filter/wmf/enhwmf.cxx
svtools/source/filter/wmf/winwmf.cxx
svtools/source/filter/wmf/wmfwr.cxx
svtools/source/graphic/graphic.cxx
svtools/source/graphic/provider.cxx
svtools/source/misc/transfer.cxx
svx/inc/svx/xoutbmp.hxx
svx/source/sdr/overlay/overlaymanagerbuffered.cxx
svx/source/xoutdev/_xoutbmp.cxx
sw/source/core/view/viewsh.cxx
sw/source/filter/ww1/w1filter.cxx
sw/source/filter/ww8/ww8par.hxx
sw/source/ui/dochdl/swdtflvr.cxx
toolkit/source/awt/vclxbitmap.cxx
toolkit/source/helper/vclunohelper.cxx
vcl/Library_vcl.mk
vcl/Package_inc.mk
vcl/aqua/source/dtrans/DataFlavorMapping.cxx
vcl/aqua/source/dtrans/OSXTransferable.cxx
vcl/aqua/source/dtrans/PictToBmpFlt.cxx
vcl/aqua/source/dtrans/PictToBmpFlt.hxx
vcl/inc/vcl/alpha.hxx
vcl/inc/vcl/bitmap.hxx
vcl/inc/vcl/bitmapex.hxx
vcl/inc/vcl/pngwrite.hxx
vcl/inc/vcl/salbtype.hxx
vcl/inc/vcl/wall.hxx
vcl/source/gdi/animate.cxx
vcl/source/gdi/bitmap2.cxx
vcl/source/gdi/bitmapex.cxx
vcl/source/gdi/bmpconv.cxx
vcl/source/gdi/cvtsvm.cxx
vcl/source/gdi/impgraph.cxx
vcl/source/gdi/impimagetree.cxx
vcl/source/gdi/metaact.cxx
vcl/source/gdi/wall.cxx
Change-Id: I79938bc412c048c3d4e64f430f216e73bec16167
Diffstat (limited to 'dtrans')
-rw-r--r-- | dtrans/source/win32/dtobj/DOTransferable.cxx | 12 | ||||
-rw-r--r-- | dtrans/source/win32/dtobj/FmtFilter.cxx | 34 | ||||
-rw-r--r-- | dtrans/source/win32/dtobj/FmtFilter.hxx | 2 | ||||
-rw-r--r-- | dtrans/source/win32/dtobj/XTDataObject.cxx | 16 | ||||
-rw-r--r-- | dtrans/source/win32/ftransl/ftransl.cxx | 3 |
5 files changed, 45 insertions, 22 deletions
diff --git a/dtrans/source/win32/dtobj/DOTransferable.cxx b/dtrans/source/win32/dtobj/DOTransferable.cxx index 30d887d8a165..7e35ac24b0f3 100644 --- a/dtrans/source/win32/dtobj/DOTransferable.cxx +++ b/dtrans/source/win32/dtobj/DOTransferable.cxx @@ -338,10 +338,14 @@ CDOTransferable::ByteSequence_t SAL_CALL CDOTransferable::getClipboardData( CFor clipDataToByteStream( aFormatEtc.getClipformat( ), stgmedium, byteStream ); // format conversion if necessary - if ( CF_DIB == aFormatEtc.getClipformat() ) - byteStream = WinDIBToOOBMP( byteStream ); - else if ( CF_METAFILEPICT == aFormatEtc.getClipformat() ) - byteStream = WinMFPictToOOMFPict( byteStream ); + if(CF_DIBV5 == aFormatEtc.getClipformat() || CF_DIB == aFormatEtc.getClipformat()) + { + byteStream = WinDIBToOOBMP(byteStream); + } + else if(CF_METAFILEPICT == aFormatEtc.getClipformat()) + { + byteStream = WinMFPictToOOMFPict(byteStream); + } } ReleaseStgMedium( &stgmedium ); diff --git a/dtrans/source/win32/dtobj/FmtFilter.cxx b/dtrans/source/win32/dtobj/FmtFilter.cxx index f9327d8e82df..199d30163d06 100644 --- a/dtrans/source/win32/dtobj/FmtFilter.cxx +++ b/dtrans/source/win32/dtobj/FmtFilter.cxx @@ -190,28 +190,31 @@ HENHMETAFILE SAL_CALL OOMFPictToWinENHMFPict( Sequence< sal_Int8 >& aOOMetaFileP Sequence< sal_Int8 > SAL_CALL WinDIBToOOBMP( const Sequence< sal_Int8 >& aWinDIB ) { - OSL_ASSERT( aWinDIB.getLength( ) > sizeof( BITMAPINFOHEADER ) ); - + OSL_ENSURE(aWinDIB.getLength() > sizeof(BITMAPINFOHEADER), "CF_DIBV5/CF_DIB too small (!)"); Sequence< sal_Int8 > ooBmpStream; - ooBmpStream.realloc( aWinDIB.getLength( ) + sizeof(BITMAPFILEHEADER) ); - - const BITMAPINFOHEADER *pBmpInfoHdr = (const BITMAPINFOHEADER*)aWinDIB.getConstArray(); - BITMAPFILEHEADER *pBmpFileHdr = reinterpret_cast< BITMAPFILEHEADER* >( ooBmpStream.getArray() ); - DWORD nOffset = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ); + ooBmpStream.realloc(aWinDIB.getLength( ) + sizeof(BITMAPFILEHEADER)); + const BITMAPINFOHEADER* pBmpInfoHdr = reinterpret_cast< const BITMAPINFOHEADER* >(aWinDIB.getConstArray()); + BITMAPFILEHEADER* pBmpFileHdr = reinterpret_cast< BITMAPFILEHEADER* >(ooBmpStream.getArray()); + const DWORD nSizeInfoOrV5(pBmpInfoHdr->biSize > sizeof(BITMAPINFOHEADER) ? sizeof(BITMAPV5HEADER) : sizeof(BITMAPINFOHEADER)); + DWORD nOffset(sizeof(BITMAPFILEHEADER) + nSizeInfoOrV5); - memcpy( pBmpFileHdr + 1, pBmpInfoHdr, aWinDIB.getLength( ) ); + memcpy(pBmpFileHdr + 1, pBmpInfoHdr, aWinDIB.getLength()); - if( pBmpInfoHdr->biBitCount <= 8 ) - nOffset += ( pBmpInfoHdr->biClrUsed ? pBmpInfoHdr->biClrUsed : ( 1 << pBmpInfoHdr->biBitCount ) ) << 2; - else if( ( BI_BITFIELDS == pBmpInfoHdr->biCompression ) && ( ( 16 == pBmpInfoHdr->biBitCount ) || ( 32 == pBmpInfoHdr->biBitCount ) ) ) + if(pBmpInfoHdr->biBitCount <= 8) + { + nOffset += (pBmpInfoHdr->biClrUsed ? pBmpInfoHdr->biClrUsed : (1 << pBmpInfoHdr->biBitCount)) << 2; + } + else if((BI_BITFIELDS == pBmpInfoHdr->biCompression ) && ((16 == pBmpInfoHdr->biBitCount ) || (32 == pBmpInfoHdr->biBitCount ))) + { nOffset += 12; + } - pBmpFileHdr->bfType = ('M' << 8) | 'B'; - pBmpFileHdr->bfSize = 0; // maybe: nMemSize + sizeof(BITMAPFILEHEADER) + pBmpFileHdr->bfType = ('M' << 8) | 'B'; + pBmpFileHdr->bfSize = 0; // maybe: nMemSize + sizeof(BITMAPFILEHEADER) pBmpFileHdr->bfReserved1 = 0; pBmpFileHdr->bfReserved2 = 0; - pBmpFileHdr->bfOffBits = nOffset; + pBmpFileHdr->bfOffBits = nOffset; return ooBmpStream; } @@ -222,9 +225,6 @@ Sequence< sal_Int8 > SAL_CALL WinDIBToOOBMP( const Sequence< sal_Int8 >& aWinDIB Sequence< sal_Int8 > SAL_CALL OOBmpToWinDIB( Sequence< sal_Int8 >& aOOBmp ) { - OSL_ASSERT( aOOBmp.getLength( ) > - ( sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) ) ); - Sequence< sal_Int8 > winDIBStream( aOOBmp.getLength( ) - sizeof( BITMAPFILEHEADER ) ); memcpy( winDIBStream.getArray( ), diff --git a/dtrans/source/win32/dtobj/FmtFilter.hxx b/dtrans/source/win32/dtobj/FmtFilter.hxx index a77d0a5fd5dc..b9f06b599af7 100644 --- a/dtrans/source/win32/dtobj/FmtFilter.hxx +++ b/dtrans/source/win32/dtobj/FmtFilter.hxx @@ -64,6 +64,8 @@ com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL WinBITMAPToOOBMP( HBITMAP ); /*------------------------------------------------------------------------ input: aOOBmp - sequence of bytes containing a openoffice bitmap + May contain CF_DIBV5 or CF_DIB, but removing the BITMAPFILEHEADER + is always the same size ------------------------------------------------------------------------*/ com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL OOBmpToWinDIB( com::sun::star::uno::Sequence< sal_Int8 >& aOOBmp ); diff --git a/dtrans/source/win32/dtobj/XTDataObject.cxx b/dtrans/source/win32/dtobj/XTDataObject.cxx index c213517cdd19..90805fbb8213 100644 --- a/dtrans/source/win32/dtobj/XTDataObject.cxx +++ b/dtrans/source/win32/dtobj/XTDataObject.cxx @@ -298,8 +298,22 @@ void SAL_CALL CXTDataObject::renderAnyDataAndSetupStgMedium( nRequiredMemSize = sizeof( sal_Int8 ) * clipDataStream.getLength( ) + 1; // prepare data for transmision - if ( CF_DIB == fetc.cfFormat ) + if ( CF_DIBV5 == fetc.cfFormat || CF_DIB == fetc.cfFormat ) + { +#ifdef DBG_UTIL + if(CF_DIBV5 == fetc.cfFormat) + { + OSL_ENSURE(clipDataStream.getLength( ) > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPV5HEADER)), "Wrong size on CF_DIBV5 data (!)"); + } + else // CF_DIB == fetc.cfFormat + { + OSL_ENSURE(clipDataStream.getLength( ) > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)), "Wrong size on CF_DIB data (!)"); + } +#endif + + // remove BITMAPFILEHEADER clipDataStream = OOBmpToWinDIB( clipDataStream ); + } if ( CF_METAFILEPICT == fetc.cfFormat ) { diff --git a/dtrans/source/win32/ftransl/ftransl.cxx b/dtrans/source/win32/ftransl/ftransl.cxx index 70724c1600a8..b808fe89c9b0 100644 --- a/dtrans/source/win32/ftransl/ftransl.cxx +++ b/dtrans/source/win32/ftransl/ftransl.cxx @@ -254,6 +254,7 @@ void SAL_CALL CDataFormatTranslator::initTranslationTable() //SOT_FORMATSTR_ID_DIF m_TranslTable.push_back(FormatEntry("application/x-openoffice-dif;windows_formatname=\"DIF\"", "DIF", "DIF", CF_DIF, CPPUTYPE_DEFAULT)); // SOT_FORMAT_BITMAP + m_TranslTable.push_back(FormatEntry("application/x-openoffice-bitmap;windows_formatname=\"Bitmap\"", "Bitmap", "Bitmap", CF_DIBV5, CPPUTYPE_DEFAULT)); m_TranslTable.push_back(FormatEntry("application/x-openoffice-bitmap;windows_formatname=\"Bitmap\"", "Bitmap", "Bitmap", CF_DIB, CPPUTYPE_DEFAULT)); m_TranslTable.push_back(FormatEntry("application/x-openoffice-bitmap;windows_formatname=\"Bitmap\"", "Bitmap", "Bitmap", CF_BITMAP, CPPUTYPE_DEFAULT)); // SOT_FORMAT_STRING @@ -485,6 +486,8 @@ void SAL_CALL CDataFormatTranslator::initTranslationTable() m_TranslTable.push_back(FormatEntry("application/vnd.sun.xml.dialog", "Dialog 6.0", NULL, CF_INVALID, CPPUTYPE_DEFAULT)); //SOT_FORMATSTR_ID_BMP m_TranslTable.push_back(FormatEntry("image/bmp", "Windows Bitmap", NULL, CF_INVALID, CPPUTYPE_DEFAULT)); + //SOT_FORMATSTR_ID_PNG + m_TranslTable.push_back(FormatEntry("image/png", "PNG", NULL, CF_INVALID, CPPUTYPE_DEFAULT)); //SOT_FORMATSTR_ID_DUMMY3 m_TranslTable.push_back(FormatEntry("application/x-openoffice-dummy3;windows_formatname=\"SO_DUMMYFORMAT_3\"", "SO_DUMMYFORMAT_3", NULL, CF_INVALID, CPPUTYPE_DEFAULT)); //SOT_FORMATSTR_ID_DUMMY4 |