[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.0' - 3 commits - svtools/source sw/source vcl/ios
Tor Lillqvist (via logerrit)
logerrit at kemper.freedesktop.org
Tue May 28 19:26:04 UTC 2019
svtools/source/misc/transfer.cxx | 18 ++++
sw/source/uibase/dochdl/swdtflvr.cxx | 24 +++++-
vcl/ios/DataFlavorMapping.cxx | 127 -----------------------------------
3 files changed, 39 insertions(+), 130 deletions(-)
New commits:
commit 313984a59af43b00cc58c9e13ef9bf3aeccca30f
Author: Tor Lillqvist <tml at collabora.com>
AuthorDate: Tue May 28 22:10:06 2019 +0300
Commit: Tor Lillqvist <tml at collabora.com>
CommitDate: Tue May 28 22:15:58 2019 +0300
tdf#124752: Simplify the iOS DataFlavorMapping thing a lot
Now it works to copy and paste images (PNG ones at least) between the
iOS Collabora Office app and other apps.
We don't seem to need the PNGDataProvider after all, as we use it only
for data that is already in PNG format. Possibly I am missing
somethin, though.
Change-Id: Ia6bcc8aefbe1a6687f13e28454b96658fc66c856
diff --git a/vcl/ios/DataFlavorMapping.cxx b/vcl/ios/DataFlavorMapping.cxx
index c42677f70b6b..e90a8f9b245c 100644
--- a/vcl/ios/DataFlavorMapping.cxx
+++ b/vcl/ios/DataFlavorMapping.cxx
@@ -46,65 +46,6 @@ using namespace cppu;
namespace
{
-bool ImageToPNG(css::uno::Sequence<sal_Int8> const& rImgData,
- css::uno::Sequence<sal_Int8>& rPngData)
-{
-#if 1
- // Skip this complexity for now. Work in progress.
- (void)rImgData;
- (void)rPngData;
- return false;
-#else
- NSData* pData = [NSData dataWithBytesNoCopy:const_cast<sal_Int8*>(rImgData.getConstArray())
- length:rImgData.getLength()
- freeWhenDone:0];
- if (!pData)
- return false;
-
- NSBitmapImageRep* pRep = [NSBitmapImageRep imageRepWithData:pData];
- if (!pRep)
- return false;
-
- NSData* pOut = [pRep representationUsingType:NSPNGFileType properties:@{}];
- if (!pOut)
- return false;
-
- const size_t nPngSize = [pOut length];
- rPngData.realloc(nPngSize);
- [pOut getBytes:rPngData.getArray() length:nPngSize];
- return (nPngSize > 0);
-#endif
-}
-
-bool PNGToImage(css::uno::Sequence<sal_Int8> const& rPngData,
- css::uno::Sequence<sal_Int8>& rImgData)
-{
-#if 1
- (void)rPngData;
- (void)rImgData;
- return false;
-#else
- NSData* pData = [NSData dataWithBytesNoCopy:const_cast<sal_Int8*>(rPngData.getConstArray())
- length:rPngData.getLength()
- freeWhenDone:0];
- if (!pData)
- return false;
-
- NSBitmapImageRep* pRep = [NSBitmapImageRep imageRepWithData:pData];
- if (!pRep)
- return false;
-
- NSData* pOut = [pRep representationUsingType:eOutFormat properties:@{}];
- if (!pOut)
- return false;
-
- const size_t nImgSize = [pOut length];
- rImgData.realloc(nImgSize);
- [pOut getBytes:rImgData.getArray() length:nImgSize];
- return (nImgSize > 0);
-#endif
-}
-
/* Determine whether or not a DataFlavor is valid.
*/
bool isValidFlavor(const DataFlavor& aFlavor)
@@ -396,61 +337,6 @@ Any HTMLFormatDataProvider::getOOoData()
return oOOData;
}
-class PNGDataProvider : public DataProviderBaseImpl
-{
-public:
- PNGDataProvider(const Any&);
- PNGDataProvider(NSData*);
-
- NSData* getSystemData() override;
- Any getOOoData() override;
-};
-
-PNGDataProvider::PNGDataProvider(const Any& data)
- : DataProviderBaseImpl(data)
-{
-}
-
-PNGDataProvider::PNGDataProvider(NSData* data)
- : DataProviderBaseImpl(data)
-{
-}
-
-NSData* PNGDataProvider::getSystemData()
-{
- Sequence<sal_Int8> pngData;
- mData >>= pngData;
-
- Sequence<sal_Int8> imgData;
- NSData* sysData = nullptr;
- if (PNGToImage(pngData, imgData))
- sysData = [NSData dataWithBytes:imgData.getArray() length:imgData.getLength()];
-
- return sysData;
-}
-
-Any PNGDataProvider::getOOoData()
-{
- Any oOOData;
-
- if (mSystemData)
- {
- const unsigned int flavorDataLength = [mSystemData length];
- Sequence<sal_Int8> imgData(flavorDataLength);
- memcpy(imgData.getArray(), [mSystemData bytes], flavorDataLength);
-
- Sequence<sal_Int8> pngData;
- if (ImageToPNG(imgData, pngData))
- oOOData <<= pngData;
- }
- else
- {
- oOOData = mData;
- }
-
- return oOOData;
-}
-
DataFlavorMapper::DataFlavorMapper()
{
Reference<XComponentContext> xContext = comphelper::getProcessComponentContext();
@@ -564,14 +450,7 @@ DataFlavorMapper::getDataProvider(const NSString* systemFlavor,
if (isByteSequenceType(data.getValueType()))
{
- if ([systemFlavor caseInsensitiveCompare:PBTYPE_PNG] == NSOrderedSame)
- {
- dp = DataProviderPtr_t(new PNGDataProvider(data));
- }
- else
- {
- dp = DataProviderPtr_t(new ByteSequenceDataProvider(data));
- }
+ dp = DataProviderPtr_t(new ByteSequenceDataProvider(data));
}
else // Must be OUString type
{
@@ -601,10 +480,6 @@ DataProviderPtr_t DataFlavorMapper::getDataProvider(const NSString* systemFlavor
{
dp = DataProviderPtr_t(new HTMLFormatDataProvider(systemData));
}
- else if ([systemFlavor caseInsensitiveCompare:PBTYPE_PNG] == NSOrderedSame)
- {
- dp = DataProviderPtr_t(new PNGDataProvider(systemData));
- }
else
{
dp = DataProviderPtr_t(new ByteSequenceDataProvider(systemData));
commit d19b69b3a9011af129dfe1f0c73c3a84416d78df
Author: Tor Lillqvist <tml at collabora.com>
AuthorDate: Tue May 28 22:03:58 2019 +0300
Commit: Tor Lillqvist <tml at collabora.com>
CommitDate: Tue May 28 22:15:58 2019 +0300
tdf#124752: Reduce number of formats offered on clipboard on mobile devices
It seems a bit pointless to offer formats that no other app will use.
Change-Id: I54474a4ba40d91c184592cede4224cbfbb78d518
diff --git a/sw/source/uibase/dochdl/swdtflvr.cxx b/sw/source/uibase/dochdl/swdtflvr.cxx
index 1a2de3a86a9c..d9f35769d070 100644
--- a/sw/source/uibase/dochdl/swdtflvr.cxx
+++ b/sw/source/uibase/dochdl/swdtflvr.cxx
@@ -797,8 +797,10 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
SwDoc *const pDoc = lcl_GetDoc(*m_pClpDocFac);
m_pWrtShell->Copy( pDoc );
+#if HAVE_FEATURE_DESKTOP
if (m_pOrigGraphic && !m_pOrigGraphic->GetBitmap().IsEmpty())
AddFormat( SotClipboardFormatId::SVXB );
+#endif
PrepareOLE( m_aObjDesc );
AddFormat( SotClipboardFormatId::OBJECTDESCRIPTOR );
@@ -806,9 +808,11 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
const Graphic* pGrf = m_pWrtShell->GetGraphic();
if( pGrf && pGrf->IsSupportedGraphic() )
{
- AddFormat( SotClipboardFormatId::GDIMETAFILE );
AddFormat( SotClipboardFormatId::PNG );
+#if HAVE_FEATURE_DESKTOP
+ AddFormat( SotClipboardFormatId::GDIMETAFILE );
AddFormat( SotClipboardFormatId::BITMAP );
+#endif
}
m_eBufferType = TransferBufferType::Graphic;
m_pWrtShell->GetGrfNms( &sGrfNm, nullptr );
@@ -828,8 +832,9 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
m_aObjDesc.maSize = OutputDevice::LogicToLogic(m_pWrtShell->GetObjSize(), MapMode(MapUnit::MapTwip), MapMode(MapUnit::Map100thMM));
// <--
PrepareOLE( m_aObjDesc );
- AddFormat( SotClipboardFormatId::OBJECTDESCRIPTOR );
+#if HAVE_FEATURE_DESKTOP
+ AddFormat( SotClipboardFormatId::OBJECTDESCRIPTOR );
AddFormat( SotClipboardFormatId::GDIMETAFILE );
// Fetch the formats supported via embedtransferhelper as well
@@ -848,6 +853,7 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
AddFormat( *aIter++ );
}
}
+#endif
m_eBufferType = TransferBufferType::Ole;
}
// Is there anything to provide anyway?
@@ -912,15 +918,19 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
bDDELink = m_pWrtShell->HasWholeTabSelection();
}
+#if HAVE_FEATURE_DESKTOP
//When someone needs it, we 'OLE' him something
AddFormat( SotClipboardFormatId::EMBED_SOURCE );
+#endif
//put RTF ahead of the OLE's Metafile to have less loss
if( !m_pWrtShell->IsObjSelected() )
{
AddFormat( SotClipboardFormatId::RTF );
+#if HAVE_FEATURE_DESKTOP
AddFormat( SotClipboardFormatId::RICHTEXT );
AddFormat( SotClipboardFormatId::HTML );
+#endif
}
if( m_pWrtShell->IsSelection() )
AddFormat( SotClipboardFormatId::STRING );
@@ -930,9 +940,11 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
AddFormat( SotClipboardFormatId::DRAWING );
if ( nSelection & SelectionType::DrawObject )
{
+#if HAVE_FEATURE_DESKTOP
AddFormat( SotClipboardFormatId::GDIMETAFILE );
- AddFormat( SotClipboardFormatId::PNG );
AddFormat( SotClipboardFormatId::BITMAP );
+#endif
+ AddFormat( SotClipboardFormatId::PNG );
}
m_eBufferType = (TransferBufferType)( TransferBufferType::Graphic | m_eBufferType );
@@ -949,10 +961,12 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
if( m_pWrtShell->GetURLFromButton( sURL, sDesc ) )
{
AddFormat( SotClipboardFormatId::STRING );
+#if HAVE_FEATURE_DESKTOP
AddFormat( SotClipboardFormatId::SOLK );
AddFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK );
AddFormat( SotClipboardFormatId::FILECONTENT );
AddFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR );
+#endif
AddFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR );
m_eBufferType = TransferBufferType::InetField | m_eBufferType;
nRet = 1;
@@ -965,7 +979,9 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
nullptr != ( pDShell = m_pWrtShell->GetDoc()->GetDocShell()) &&
SfxObjectCreateMode::STANDARD == pDShell->GetCreateMode() )
{
+#if HAVE_FEATURE_DESKTOP
AddFormat( SotClipboardFormatId::LINK );
+#endif
m_xDdeLink = new SwTrnsfrDdeLink( *this, *m_pWrtShell );
}
@@ -976,7 +992,9 @@ int SwTransferable::PrepareForCopy( bool bIsCut )
m_aObjDesc.maSize = OutputDevice::LogicToLogic(aSz, MapMode(MapUnit::MapTwip), MapMode(MapUnit::Map100thMM));
PrepareOLE( m_aObjDesc );
+#if HAVE_FEATURE_DESKTOP
AddFormat( SotClipboardFormatId::OBJECTDESCRIPTOR );
+#endif
}
else
nRet = 0;
commit 5a3fa45eeaa4e3b001bb5e6a0015aaccf2798762
Author: Tor Lillqvist <tml at collabora.com>
AuthorDate: Tue May 28 21:51:53 2019 +0300
Commit: Tor Lillqvist <tml at collabora.com>
CommitDate: Tue May 28 22:14:49 2019 +0300
tdf#124752: Use best speed for PNG encofing on iOS
Still awfully slow for "realistic" images as taken by modern digital
cameras, though. It would be much better to not encode the PNG to put
on the clipboard from the internal bitmap representation, but use the
ooriginal PNG or JPEG data.
Change-Id: Ib72a573bd31d4ae7380dacccb4287e19afabb0d4
diff --git a/svtools/source/misc/transfer.cxx b/svtools/source/misc/transfer.cxx
index 03b306daed8b..888626d3ceb0 100644
--- a/svtools/source/misc/transfer.cxx
+++ b/svtools/source/misc/transfer.cxx
@@ -674,7 +674,23 @@ bool TransferableHelper::SetBitmapEx( const BitmapEx& rBitmapEx, const DataFlavo
if(rFlavor.MimeType.equalsIgnoreAsciiCase("image/png"))
{
// write a PNG
- vcl::PNGWriter aPNGWriter(rBitmapEx);
+ css::uno::Sequence<css::beans::PropertyValue> aFilterData;
+
+#ifdef IOS
+ // Use faster compression on slow devices
+ aFilterData.realloc(aFilterData.getLength() + 1);
+ aFilterData[aFilterData.getLength() - 1].Name = "Compression";
+
+ // We "know" that this gets passed to zlib's deflateInit2_(). 1 means best speed. For a
+ // typical 15 megapixel image from a DSLR, we are talking about a difference of 17 s for
+ // the default compression level vs 4 s for best speed, on an iPad Pro from 2017.
+ //
+ // Sure, the best would be to not have to re-encode the image at all, but have access to
+ // the original JPEG or PNG when there is a such.
+
+ aFilterData[aFilterData.getLength() - 1].Value <<= 1;
+#endif
+ vcl::PNGWriter aPNGWriter(rBitmapEx, &aFilterData);
aPNGWriter.Write(aMemStm);
}
More information about the Libreoffice-commits
mailing list