| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #include <string.h> |
| |
| #include <com/sun/star/awt/Size.hpp> |
| #include <com/sun/star/container/XNamed.hpp> |
| #include <com/sun/star/drawing/ColorMode.hpp> |
| #include <com/sun/star/drawing/PointSequenceSequence.hpp> |
| #include <com/sun/star/drawing/XShape.hpp> |
| #include <com/sun/star/graphic/XGraphic.hpp> |
| #include <com/sun/star/graphic/XGraphicProvider.hpp> |
| #include <com/sun/star/io/XInputStream.hpp> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <com/sun/star/table/BorderLine.hpp> |
| #include <com/sun/star/text/GraphicCrop.hpp> |
| #include <com/sun/star/text/HoriOrientation.hpp> |
| #include <com/sun/star/text/RelOrientation.hpp> |
| #include <com/sun/star/text/TextContentAnchorType.hpp> |
| #include <com/sun/star/text/VertOrientation.hpp> |
| #include <com/sun/star/text/WrapTextMode.hpp> |
| #include <com/sun/star/text/XTextContent.hpp> |
| #include <com/sun/star/uno/XComponentContext.hpp> |
| |
| #include <cppuhelper/implbase1.hxx> |
| #include <rtl/ustrbuf.hxx> |
| |
| #include <dmapper/DomainMapper.hxx> |
| #include <doctok/resourceids.hxx> |
| #include <ooxml/resourceids.hxx> |
| #include <resourcemodel/ResourceModelHelper.hxx> |
| |
| #include "ConversionHelper.hxx" |
| #include "GraphicHelpers.hxx" |
| #include "GraphicImport.hxx" |
| #include "PropertyMap.hxx" |
| #include "WrapPolygonHandler.hxx" |
| #include "dmapperLoggers.hxx" |
| |
| namespace writerfilter { |
| |
| using resourcemodel::resolveSprmProps; |
| |
| namespace dmapper |
| { |
| using namespace ::std; |
| using namespace ::com::sun::star; |
| |
| class XInputStreamHelper : public cppu::WeakImplHelper1 |
| < io::XInputStream > |
| { |
| const sal_uInt8* m_pBuffer; |
| const sal_Int32 m_nLength; |
| sal_Int32 m_nPosition; |
| bool m_bBmp; |
| |
| const sal_uInt8* m_pBMPHeader; //default BMP-header |
| sal_Int32 m_nHeaderLength; |
| public: |
| XInputStreamHelper(const sal_uInt8* buf, size_t len, bool bBmp); |
| ~XInputStreamHelper(); |
| |
| virtual ::sal_Int32 SAL_CALL readBytes( uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nBytesToRead ) throw (io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException); |
| virtual ::sal_Int32 SAL_CALL readSomeBytes( uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nMaxBytesToRead ) throw (io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException); |
| virtual void SAL_CALL skipBytes( ::sal_Int32 nBytesToSkip ) throw (io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException); |
| virtual ::sal_Int32 SAL_CALL available( ) throw (io::NotConnectedException, io::IOException, uno::RuntimeException); |
| virtual void SAL_CALL closeInput( ) throw (io::NotConnectedException, io::IOException, uno::RuntimeException); |
| }; |
| /*-- 01.11.2006 13:56:20--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| XInputStreamHelper::XInputStreamHelper(const sal_uInt8* buf, size_t len, bool bBmp) : |
| m_pBuffer( buf ), |
| m_nLength( len ), |
| m_nPosition( 0 ), |
| m_bBmp( bBmp ) |
| { |
| static const sal_uInt8 aHeader[] = |
| {0x42, 0x4d, 0xe6, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }; |
| m_pBMPHeader = aHeader; |
| m_nHeaderLength = m_bBmp ? sizeof( aHeader ) / sizeof(sal_uInt8) : 0; |
| |
| } |
| /*-- 01.11.2006 13:56:20--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| XInputStreamHelper::~XInputStreamHelper() |
| { |
| } |
| /*-- 01.11.2006 13:56:21--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| ::sal_Int32 XInputStreamHelper::readBytes( uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nBytesToRead ) |
| throw (io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException) |
| { |
| return readSomeBytes( aData, nBytesToRead ); |
| } |
| /*-- 01.11.2006 13:56:21--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| ::sal_Int32 XInputStreamHelper::readSomeBytes( uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nMaxBytesToRead ) |
| throw (io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException) |
| { |
| sal_Int32 nRet = 0; |
| if( nMaxBytesToRead > 0 ) |
| { |
| if( nMaxBytesToRead > (m_nLength + m_nHeaderLength) - m_nPosition ) |
| nRet = (m_nLength + m_nHeaderLength) - m_nPosition; |
| else |
| nRet = nMaxBytesToRead; |
| aData.realloc( nRet ); |
| sal_Int8* pData = aData.getArray(); |
| sal_Int32 nHeaderRead = 0; |
| if( m_nPosition < m_nHeaderLength) |
| { |
| //copy header content first |
| nHeaderRead = m_nHeaderLength - m_nPosition; |
| memcpy( pData, m_pBMPHeader + (m_nPosition ), nHeaderRead ); |
| nRet -= nHeaderRead; |
| m_nPosition += nHeaderRead; |
| } |
| if( nRet ) |
| { |
| memcpy( pData + nHeaderRead, m_pBuffer + (m_nPosition - m_nHeaderLength), nRet ); |
| m_nPosition += nRet; |
| } |
| } |
| return nRet; |
| } |
| /*-- 01.11.2006 13:56:21--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void XInputStreamHelper::skipBytes( ::sal_Int32 nBytesToSkip ) throw (io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException) |
| { |
| if( nBytesToSkip < 0 || m_nPosition + nBytesToSkip > (m_nLength + m_nHeaderLength)) |
| throw io::BufferSizeExceededException(); |
| m_nPosition += nBytesToSkip; |
| } |
| /*-- 01.11.2006 13:56:22--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| ::sal_Int32 XInputStreamHelper::available( ) throw (io::NotConnectedException, io::IOException, uno::RuntimeException) |
| { |
| return ( m_nLength + m_nHeaderLength ) - m_nPosition; |
| } |
| /*-- 01.11.2006 13:56:22--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void XInputStreamHelper::closeInput( ) throw (io::NotConnectedException, io::IOException, uno::RuntimeException) |
| { |
| } |
| /*-- 02.11.2006 09:34:29--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| struct GraphicBorderLine |
| { |
| sal_Int32 nLineWidth; |
| // sal_Int32 nLineType; |
| sal_Int32 nLineColor; |
| sal_Int32 nLineDistance; |
| bool bHasShadow; |
| |
| GraphicBorderLine() : |
| nLineWidth(0) |
| // ,nLineType(0) |
| ,nLineColor(0) |
| ,nLineDistance(0) |
| ,bHasShadow(false) |
| {} |
| |
| }; |
| |
| class GraphicImport_Impl |
| { |
| private: |
| sal_Int32 nXSize; |
| bool bXSizeValid; |
| sal_Int32 nYSize; |
| bool bYSizeValid; |
| |
| public: |
| GraphicImportType eGraphicImportType; |
| DomainMapper& rDomainMapper; |
| |
| sal_Int32 nHoriScaling; |
| sal_Int32 nVertScaling; |
| sal_Int32 nLeftPosition; |
| sal_Int32 nTopPosition; |
| sal_Int32 nRightPosition; |
| sal_Int32 nBottomPosition; |
| sal_Int32 nLeftCrop; |
| sal_Int32 nTopCrop; |
| sal_Int32 nRightCrop; |
| sal_Int32 nBottomCrop; |
| |
| bool bUseSimplePos; |
| |
| sal_Int16 nHoriOrient; |
| sal_Int16 nHoriRelation; |
| bool bPageToggle; |
| sal_Int16 nVertOrient; |
| sal_Int16 nVertRelation; |
| sal_Int32 nWrap; |
| bool bOpaque; |
| bool bContour; |
| bool bContourOutside; |
| WrapPolygon::Pointer_t mpWrapPolygon; |
| bool bIgnoreWRK; |
| |
| sal_Int32 nLeftMargin; |
| sal_Int32 nRightMargin; |
| sal_Int32 nTopMargin; |
| sal_Int32 nBottomMargin; |
| |
| sal_Int32 nContrast; |
| sal_Int32 nBrightness; |
| double fGamma; |
| |
| sal_Int32 nFillColor; |
| |
| drawing::ColorMode eColorMode; |
| |
| GraphicBorderLine aBorders[4]; |
| sal_Int32 nCurrentBorderLine; |
| |
| sal_Int32 nDffType; |
| bool bIsGraphic; |
| bool bIsBitmap; |
| bool bIsTiff; |
| sal_Int32 nBitsPerPixel; |
| |
| bool bHoriFlip; |
| bool bVertFlip; |
| |
| bool bSizeProtected; |
| bool bPositionProtected; |
| |
| bool bInShapeOptionMode; |
| sal_Int32 nShapeOptionType; |
| |
| ::rtl::OUString sName; |
| ::rtl::OUString sAlternativeText; |
| |
| GraphicImport_Impl(GraphicImportType eImportType, DomainMapper& rDMapper) : |
| nXSize(0) |
| ,bXSizeValid(false) |
| ,nYSize(0) |
| ,bYSizeValid(false) |
| ,eGraphicImportType( eImportType ) |
| ,rDomainMapper( rDMapper ) |
| ,nHoriScaling(0) |
| ,nVertScaling(0) |
| ,nLeftPosition(0) |
| ,nTopPosition(0) |
| ,nRightPosition(0) |
| ,nBottomPosition(0) |
| ,nLeftCrop(0) |
| ,nTopCrop (0) |
| ,nRightCrop (0) |
| ,nBottomCrop(0) |
| ,bUseSimplePos(false) |
| ,nHoriOrient( text::HoriOrientation::NONE ) |
| ,nHoriRelation( text::RelOrientation::FRAME ) |
| ,bPageToggle( false ) |
| ,nVertOrient( text::VertOrientation::NONE ) |
| ,nVertRelation( text::RelOrientation::FRAME ) |
| ,nWrap(0) |
| ,bOpaque( true ) |
| ,bContour(false) |
| ,bContourOutside(true) |
| ,bIgnoreWRK(true) |
| ,nLeftMargin(319) |
| ,nRightMargin(319) |
| ,nTopMargin(0) |
| ,nBottomMargin(0) |
| ,nContrast(0) |
| ,nBrightness(0) |
| ,fGamma( -1.0 ) |
| ,nFillColor( 0xffffffff ) |
| ,eColorMode( drawing::ColorMode_STANDARD ) |
| ,nCurrentBorderLine(BORDER_TOP) |
| ,nDffType( 0 ) |
| ,bIsGraphic(false) |
| ,bIsBitmap(false) |
| ,bIsTiff(false) |
| ,nBitsPerPixel(0) |
| ,bHoriFlip(false) |
| ,bVertFlip(false) |
| ,bSizeProtected(false) |
| ,bPositionProtected(false) |
| ,bInShapeOptionMode(false) |
| {} |
| |
| void setXSize(sal_Int32 _nXSize) |
| { |
| nXSize = _nXSize; |
| bXSizeValid = true; |
| } |
| |
| sal_uInt32 getXSize() const |
| { |
| return nXSize; |
| } |
| |
| bool isXSizeValid() const |
| { |
| return bXSizeValid; |
| } |
| |
| void setYSize(sal_Int32 _nYSize) |
| { |
| nYSize = _nYSize; |
| bYSizeValid = true; |
| } |
| |
| sal_uInt32 getYSize() const |
| { |
| return nYSize; |
| } |
| |
| bool isYSizeValis () const |
| { |
| return bYSizeValid; |
| } |
| }; |
| /*-- 01.11.2006 09:42:42--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| GraphicImport::GraphicImport(uno::Reference < uno::XComponentContext > xComponentContext, |
| uno::Reference< lang::XMultiServiceFactory > xTextFactory, |
| DomainMapper& rDMapper, |
| GraphicImportType eImportType ) |
| : LoggedProperties(dmapper_logger, "GraphicImport") |
| , LoggedTable(dmapper_logger, "GraphicImport") |
| , LoggedStream(dmapper_logger, "GraphicImport") |
| , m_pImpl( new GraphicImport_Impl( eImportType, rDMapper )) |
| , m_xComponentContext( xComponentContext ) |
| , m_xTextFactory( xTextFactory) |
| { |
| } |
| /*-- 01.11.2006 09:42:42--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| GraphicImport::~GraphicImport() |
| { |
| delete m_pImpl; |
| } |
| |
| void GraphicImport::handleWrapTextValue(sal_uInt32 nVal) |
| { |
| switch (nVal) |
| { |
| case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_bothSides: // 90920; |
| m_pImpl->nWrap = text::WrapTextMode_PARALLEL; |
| break; |
| case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_left: // 90921; |
| m_pImpl->nWrap = text::WrapTextMode_LEFT; |
| break; |
| case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_right: // 90922; |
| m_pImpl->nWrap = text::WrapTextMode_RIGHT; |
| break; |
| case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_largest: // 90923; |
| m_pImpl->nWrap = text::WrapTextMode_DYNAMIC; |
| break; |
| default:; |
| } |
| } |
| |
| /*-- 01.11.2006 09:45:01--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_attribute(Id nName, Value & val) |
| { |
| sal_Int32 nIntValue = val.getInt(); |
| /* WRITERFILTERSTATUS: table: PICFattribute */ |
| switch( nName ) |
| { |
| case NS_rtf::LN_LCB: break;//byte count |
| case NS_rtf::LN_CBHEADER: break;//ignored |
| case NS_rtf::LN_MFP: //MetafilePict |
| case NS_rtf::LN_DffRecord: //dff record - expands to an sprm which expands to ... |
| case NS_rtf::LN_shpopt: //shape options |
| case NS_rtf::LN_shpfbse: //BLIP store entry |
| case NS_rtf::LN_BRCTOP: //top border |
| case NS_rtf::LN_BRCLEFT: //left border |
| case NS_rtf::LN_BRCBOTTOM: //bottom border |
| case NS_rtf::LN_BRCRIGHT: //right border |
| case NS_rtf::LN_shape: //shape |
| case NS_rtf::LN_blip: //the binary graphic data in a shape |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| { |
| switch(nName) |
| { |
| case NS_rtf::LN_BRCTOP: //top border |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nCurrentBorderLine = BORDER_TOP; |
| break; |
| case NS_rtf::LN_BRCLEFT: //left border |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nCurrentBorderLine = BORDER_LEFT; |
| break; |
| case NS_rtf::LN_BRCBOTTOM: //bottom border |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nCurrentBorderLine = BORDER_BOTTOM; |
| break; |
| case NS_rtf::LN_BRCRIGHT: //right border |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nCurrentBorderLine = BORDER_RIGHT; |
| break; |
| case NS_rtf::LN_shpopt: |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->bInShapeOptionMode = true; |
| break; |
| default:; |
| } |
| writerfilter::Reference<Properties>::Pointer_t pProperties = val.getProperties(); |
| if( pProperties.get()) |
| { |
| pProperties->resolve(*this); |
| } |
| switch(nName) |
| { |
| case NS_rtf::LN_shpopt: |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->bInShapeOptionMode = false; |
| break; |
| default:; |
| } |
| } |
| break; |
| case NS_rtf::LN_payload : |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| { |
| writerfilter::Reference<BinaryObj>::Pointer_t pPictureData = val.getBinary(); |
| if( pPictureData.get()) |
| pPictureData->resolve(*this); |
| } |
| break; |
| case NS_rtf::LN_BM_RCWINMF: //windows bitmap structure - if it's a bitmap |
| /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ |
| break; |
| case NS_rtf::LN_DXAGOAL: //x-size in twip |
| case NS_rtf::LN_DYAGOAL: //y-size in twip |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_MX: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nHoriScaling = nIntValue; |
| break;// hori scaling in 0.001% |
| case NS_rtf::LN_MY: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nVertScaling = nIntValue; |
| break;// vert scaling in 0.001% |
| case NS_rtf::LN_DXACROPLEFT: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nLeftCrop = ConversionHelper::convertTwipToMM100(nIntValue); |
| break;// left crop in twips |
| case NS_rtf::LN_DYACROPTOP: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nTopCrop = ConversionHelper::convertTwipToMM100(nIntValue); |
| break;// top crop in twips |
| case NS_rtf::LN_DXACROPRIGHT: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nRightCrop = ConversionHelper::convertTwipToMM100(nIntValue); |
| break;// right crop in twips |
| case NS_rtf::LN_DYACROPBOTTOM: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nBottomCrop = ConversionHelper::convertTwipToMM100(nIntValue); |
| break;// bottom crop in twips |
| case NS_rtf::LN_BRCL: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;//border type - legacy - |
| case NS_rtf::LN_FFRAMEEMPTY: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// picture consists of a single frame |
| case NS_rtf::LN_FBITMAP: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| m_pImpl->bIsBitmap = nIntValue > 0 ? true : false; |
| break;//1 if it's a bitmap ??? |
| case NS_rtf::LN_FDRAWHATCH: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;//1 if it's an active OLE object |
| case NS_rtf::LN_FERROR: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// 1 if picture is an error message |
| case NS_rtf::LN_BPP: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nBitsPerPixel = nIntValue; |
| break;//bits per pixel 0 - unknown, 1- mono, 4 - VGA |
| |
| case NS_rtf::LN_DXAORIGIN: //horizontal offset of hand annotation origin |
| case NS_rtf::LN_DYAORIGIN: //vertical offset of hand annotation origin |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_CPROPS:break;// unknown - ignored |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| //metafilepict |
| case NS_rtf::LN_MM: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| // according to the documentation 99 or 98 are provided - but they are not! |
| // m_pImpl->bIsBitmap = 99 == nIntValue ? true : false; |
| // m_pImpl->bIsTiff = 98 == nIntValue ? true : false; |
| |
| break; //mapmode |
| case NS_rtf::LN_XEXT: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->setXSize(nIntValue); |
| break; // x-size |
| case NS_rtf::LN_YEXT: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->setYSize(nIntValue); |
| break; // y-size |
| case NS_rtf::LN_HMF: break; //identifier - ignored |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| |
| //sprm 0xf004 and 0xf008, 0xf00b |
| case NS_rtf::LN_dfftype:// |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| m_pImpl->nDffType = nIntValue; |
| break; |
| case NS_rtf::LN_dffinstance: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //todo: does this still work for PICF? |
| //in case of LN_dfftype == 0xf01f the instance contains the bitmap type: |
| if(m_pImpl->nDffType == 0xf01f) |
| switch( nIntValue ) |
| { |
| case 0x216 : // Metafile header then compressed WMF |
| |
| case 0x3D4 : // Metafile header then compressed EMF |
| |
| case 0x542 : // Metafile hd. then compressed PICT |
| |
| { |
| |
| // rBLIPStream.SeekRel( nSkip + 20 ); |
| // // read in size of metafile in EMUS |
| // rBLIPStream >> aMtfSize100.Width() >> aMtfSize100.Height(); |
| // // scale to 1/100mm |
| // aMtfSize100.Width() /= 360, aMtfSize100.Height() /= 360; |
| // if ( pVisArea ) // seem that we currently are skipping the visarea position |
| // *pVisArea = Rectangle( Point(), aMtfSize100 ); |
| // // skip rest of header |
| // nSkip = 6; |
| // bMtfBLIP = bZCodecCompression = TRUE; |
| } |
| |
| break; |
| |
| case 0x46A : break;// One byte tag then JPEG (= JFIF) data |
| |
| case 0x6E0 : break;// One byte tag then PNG data |
| |
| case 0x7A8 : m_pImpl->bIsBitmap = true; |
| // nSkip += 1; // One byte tag then DIB data |
| break; |
| |
| } |
| break; |
| case NS_rtf::LN_dffversion:// ignored |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| |
| //sprm 0xf008 |
| case NS_rtf::LN_shptype: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpid: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpfGroup: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// This shape is a group shape |
| case NS_rtf::LN_shpfChild: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// Not a top-level shape |
| case NS_rtf::LN_shpfPatriarch: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// This is the topmost group shape. Exactly one of these per drawing. |
| case NS_rtf::LN_shpfDeleted: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// The shape has been deleted |
| case NS_rtf::LN_shpfOleShape: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// The shape is an OLE object |
| case NS_rtf::LN_shpfHaveMaster: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// Shape has a hspMaster property |
| case NS_rtf::LN_shpfFlipH: // Shape is flipped horizontally |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->bHoriFlip = nIntValue ? true : false; |
| break; |
| case NS_rtf::LN_shpfFlipV: // Shape is flipped vertically |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->bVertFlip = nIntValue ? true : false; |
| break; |
| case NS_rtf::LN_shpfConnector: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// Connector type of shape |
| case NS_rtf::LN_shpfHaveAnchor: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// Shape has an anchor of some kind |
| case NS_rtf::LN_shpfBackground: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// Background shape |
| case NS_rtf::LN_shpfHaveSpt: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// Shape has a shape type property |
| case NS_rtf::LN_shptypename: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break;// shape type name |
| case NS_rtf::LN_shppid: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nShapeOptionType = nIntValue; |
| break; //type of shape option |
| case NS_rtf::LN_shpfBid: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| break; //ignored |
| case NS_rtf::LN_shpfComplex: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpop: |
| /* WRITERFILTERSTATUS: done: 50, planned: 10, spent: 5 */ |
| { |
| if(NS_dff::LN_shpwzDescription != sal::static_int_cast<Id>(m_pImpl->nShapeOptionType) ) |
| ProcessShapeOptions( val ); |
| } |
| break; |
| case NS_rtf::LN_shpname: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpvalue: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| { |
| if( NS_dff::LN_shpwzDescription == sal::static_int_cast<Id>(m_pImpl->nShapeOptionType) ) |
| ProcessShapeOptions( val ); |
| } |
| break; |
| |
| //BLIP store entry |
| case NS_rtf::LN_shpbtWin32: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpbtMacOS: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shprgbUid: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shptag: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpsize: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpcRef: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpfoDelay: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpusage: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpcbName: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpunused2: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_shpunused3: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| |
| //border properties |
| case NS_rtf::LN_shpblipbname : |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| |
| case NS_rtf::LN_DPTLINEWIDTH: // 0x1759 |
| /* WRITERFILTERSTATUS: done: 100, planned: 1, spent: 1 */ |
| m_pImpl->aBorders[m_pImpl->nCurrentBorderLine].nLineWidth = nIntValue; |
| break; |
| case NS_rtf::LN_BRCTYPE: // 0x175a |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //graphic borders don't support different line types |
| //m_pImpl->aBorders[m_pImpl->nCurrentBorderLine].nLineType = nIntValue; |
| break; |
| case NS_rtf::LN_ICO: // 0x175b |
| /* WRITERFILTERSTATUS: done: 100, planned: 1, spent: 1 */ |
| m_pImpl->aBorders[m_pImpl->nCurrentBorderLine].nLineColor = ConversionHelper::ConvertColor( nIntValue ); |
| break; |
| case NS_rtf::LN_DPTSPACE: // 0x175c |
| /* WRITERFILTERSTATUS: done: 100, planned: 1, spent: 1 */ |
| m_pImpl->aBorders[m_pImpl->nCurrentBorderLine].nLineDistance = nIntValue; |
| break; |
| case NS_rtf::LN_FSHADOW: // 0x175d |
| /* WRITERFILTERSTATUS: done: 0, planned: 1, spent: 0 */ |
| m_pImpl->aBorders[m_pImpl->nCurrentBorderLine].bHasShadow = nIntValue ? true : false; |
| break; |
| case NS_rtf::LN_FFRAME: // ignored |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| case NS_rtf::LN_UNUSED2_15: // ignored |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| break; |
| |
| case NS_rtf::LN_SPID: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_rtf::LN_XALEFT: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nLeftPosition = ConversionHelper::convertTwipToMM100(nIntValue); |
| break; //left position |
| case NS_rtf::LN_YATOP: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nTopPosition = ConversionHelper::convertTwipToMM100(nIntValue); |
| break; //top position |
| case NS_rtf::LN_XARIGHT: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nRightPosition = ConversionHelper::convertTwipToMM100(nIntValue); |
| break; //right position |
| case NS_rtf::LN_YABOTTOM: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nBottomPosition = ConversionHelper::convertTwipToMM100(nIntValue); |
| break;//bottom position |
| case NS_rtf::LN_FHDR: |
| case NS_rtf::LN_XAlign: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| /* |
| static const SwHoriOrient aHoriOriTab[ nCntXAlign ] = |
| { |
| HORI_NONE, // From left position |
| HORI_LEFT, // left |
| HORI_CENTER, // centered |
| HORI_RIGHT, // right |
| // --> OD 2004-12-06 #i36649# |
| // - inside -> HORI_LEFT and outside -> HORI_RIGHT |
| HORI_LEFT, // inside |
| HORI_RIGHT // outside |
| */ |
| if( nIntValue < 6 && nIntValue > 0 ) |
| { |
| static const sal_Int16 aHoriOrientTab[ 6 ] = |
| { |
| text::HoriOrientation::NONE, |
| text::HoriOrientation::LEFT, |
| text::HoriOrientation::CENTER, |
| text::HoriOrientation::RIGHT, |
| text::HoriOrientation::INSIDE, |
| text::HoriOrientation::OUTSIDE |
| }; |
| m_pImpl->nHoriOrient = aHoriOrientTab[nIntValue]; |
| m_pImpl->bPageToggle = nIntValue > 3; |
| } |
| break; |
| case NS_rtf::LN_YAlign: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| /* |
| static const SwVertOrient aVertOriTab[ nCntYAlign ] = |
| { |
| VERT_NONE, // From Top position |
| VERT_TOP, // top |
| VERT_CENTER, // centered |
| VERT_BOTTOM, // bottom |
| VERT_LINE_TOP, // inside (obscure) |
| VERT_LINE_BOTTOM // outside (obscure) |
| }; |
| // CMC,OD 24.11.2003 #i22673# - to-line vertical alignment |
| static const SwVertOrient aToLineVertOriTab[ nCntYAlign ] = |
| { |
| VERT_NONE, // below |
| VERT_LINE_BOTTOM, // top |
| VERT_LINE_CENTER, // centered |
| VERT_LINE_TOP, // bottom |
| VERT_LINE_BOTTOM, // inside (obscure) |
| VERT_LINE_TOP // outside (obscure) |
| }; |
| if ( eVertRel == REL_VERT_LINE ) //m_pImpl->nVertRelation == text::RelOrientation::TEXT_LINE |
| { |
| eVertOri = aToLineVertOriTab[ nYAlign ]; |
| } |
| else |
| { |
| eVertOri = aVertOriTab[ nYAlign ]; |
| } |
| |
| */ |
| if( nIntValue < 6 && nIntValue > 0) |
| { |
| static const sal_Int16 aVertOrientTab[ 6 ] = |
| { |
| text::VertOrientation::NONE, // From Top position |
| text::VertOrientation::TOP, // top |
| text::VertOrientation::CENTER, // centered |
| text::VertOrientation::BOTTOM, // bottom |
| text::VertOrientation::LINE_TOP, // inside (obscure) |
| text::VertOrientation::LINE_BOTTOM // outside (obscure) |
| }; |
| static const sal_Int16 aToLineVertOrientTab[ 6 ] = |
| { |
| text::VertOrientation::NONE, // below |
| text::VertOrientation::LINE_BOTTOM, // top |
| text::VertOrientation::LINE_CENTER, // centered |
| text::VertOrientation::LINE_TOP, // bottom |
| text::VertOrientation::LINE_BOTTOM, // inside (obscure) |
| text::VertOrientation::LINE_TOP // outside (obscure) |
| }; |
| m_pImpl->nVertOrient = m_pImpl->nVertRelation == text::RelOrientation::TEXT_LINE ? |
| aToLineVertOrientTab[nIntValue] : aVertOrientTab[nIntValue]; |
| } |
| break; |
| case NS_rtf::LN_LayoutInTableCell: break; //currently unknown |
| case NS_rtf::LN_XRelTo: |
| case NS_rtf::LN_BX: //hori orient relation |
| switch( nIntValue ) |
| { |
| case 0: m_pImpl->nHoriRelation = text::RelOrientation::PAGE_PRINT_AREA; break; |
| case 1: m_pImpl->nHoriRelation = text::RelOrientation::PAGE_FRAME; break; |
| case 2: m_pImpl->nHoriRelation = text::RelOrientation::FRAME; break; |
| //case : |
| default:m_pImpl->nHoriRelation = text::RelOrientation::CHAR; |
| } |
| break; |
| case NS_rtf::LN_YRelTo: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| case NS_rtf::LN_BY: //vert orient relation |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| switch( nIntValue ) |
| { |
| case 0: m_pImpl->nVertRelation = text::RelOrientation::PAGE_PRINT_AREA; break; |
| case 1: m_pImpl->nVertRelation = text::RelOrientation::PAGE_FRAME; break; |
| case 2: m_pImpl->nVertRelation = text::RelOrientation::FRAME; break; |
| //case : |
| default:m_pImpl->nVertRelation = text::RelOrientation::TEXT_LINE; |
| } |
| |
| break; |
| case NS_rtf::LN_WR: //wrapping |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| switch( nIntValue ) |
| { |
| case 0: //0 like 2, but doesn't require absolute object |
| m_pImpl->bIgnoreWRK = false; |
| case 2: //2 wrap around absolute object |
| m_pImpl->nWrap = text::WrapTextMode_PARALLEL; |
| break; |
| case 1: //1 no text next to shape |
| m_pImpl->nWrap = text::WrapTextMode_NONE; |
| break; |
| case 3: //3 wrap as if no object present |
| m_pImpl->nWrap = text::WrapTextMode_THROUGHT; |
| break; |
| case 4: //4 wrap tightly around object |
| m_pImpl->bIgnoreWRK = false; |
| case 5: //5 wrap tightly, but allow holes |
| m_pImpl->nWrap = text::WrapTextMode_PARALLEL; |
| m_pImpl->bContour = true; |
| break; |
| default:; |
| } |
| break; |
| case NS_rtf::LN_WRK: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| if( !m_pImpl->bIgnoreWRK ) |
| switch( nIntValue ) |
| { |
| case 0: //0 like 2, but doesn't require absolute object |
| case 2: //2 wrap around absolute object |
| m_pImpl->nWrap = text::WrapTextMode_PARALLEL; |
| break; |
| case 1: //1 no text next to shape |
| m_pImpl->nWrap = text::WrapTextMode_NONE; |
| break; |
| case 3: //3 wrap as if no object present |
| m_pImpl->nWrap = text::WrapTextMode_THROUGHT; |
| break; |
| case 4: //4 wrap tightly around object |
| case 5: //5 wrap tightly, but allow holes |
| m_pImpl->nWrap = text::WrapTextMode_PARALLEL; |
| m_pImpl->bContour = true; |
| break; |
| default:; |
| } |
| break; |
| case NS_rtf::LN_FRCASIMPLE: |
| case NS_rtf::LN_FBELOWTEXT: |
| case NS_rtf::LN_FANCHORLOCK: |
| case NS_rtf::LN_CTXBX: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| // { |
| // sal_Int32 nValue1 = val.getInt(); |
| // nValue1++; |
| // } |
| break; |
| case NS_rtf::LN_shptxt: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //todo: text content |
| break; |
| /* case NS_rtf::LN_CH = 10421; |
| case NS_rtf::LN_UNUSED0_5 = 10422; |
| case NS_rtf::LN_FLT = 10423; |
| case NS_rtf::LN_shpLeft = 10424; |
| case NS_rtf::LN_shpTop = 10425; |
| break;*/ |
| case NS_rtf::LN_dffheader: break; |
| case NS_ooxml::LN_CT_PositiveSize2D_cx:// 90407; |
| case NS_ooxml::LN_CT_PositiveSize2D_cy:// 90408; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| { |
| sal_Int32 nDim = ConversionHelper::convertEMUToMM100( nIntValue ); |
| if( nName == NS_ooxml::LN_CT_PositiveSize2D_cx ) |
| m_pImpl->setXSize(nDim); |
| else |
| m_pImpl->setYSize(nDim); |
| } |
| break; |
| case NS_ooxml::LN_CT_EffectExtent_l:// 90907; |
| case NS_ooxml::LN_CT_EffectExtent_t:// 90908; |
| case NS_ooxml::LN_CT_EffectExtent_r:// 90909; |
| case NS_ooxml::LN_CT_EffectExtent_b:// 90910; |
| /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ |
| //todo: extends the wrapping size of the object, e.g. if shadow is added |
| break; |
| case NS_ooxml::LN_CT_NonVisualDrawingProps_id:// 90650; |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //id of the object - ignored |
| break; |
| case NS_ooxml::LN_CT_NonVisualDrawingProps_name:// 90651; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| //name of the object |
| m_pImpl->sName = val.getString(); |
| break; |
| case NS_ooxml::LN_CT_NonVisualDrawingProps_descr:// 90652; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| //alternative text |
| m_pImpl->sAlternativeText = val.getString(); |
| break; |
| case NS_ooxml::LN_CT_GraphicalObjectFrameLocking_noChangeAspect://90644; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| //disallow aspect ratio change - ignored |
| break; |
| case NS_ooxml::LN_CT_GraphicalObjectFrameLocking_noMove:// 90645; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| m_pImpl->bPositionProtected = true; |
| break; |
| case NS_ooxml::LN_CT_GraphicalObjectFrameLocking_noResize: // 90646; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| m_pImpl->bSizeProtected = true; |
| break; |
| case NS_ooxml::LN_CT_Anchor_distT: // 90983; |
| case NS_ooxml::LN_CT_Anchor_distB: // 90984; |
| case NS_ooxml::LN_CT_Anchor_distL: // 90985; |
| case NS_ooxml::LN_CT_Anchor_distR: // 90986; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| { |
| //redirect to shape option processing |
| switch( nName ) |
| { |
| case NS_ooxml::LN_CT_Anchor_distT: // 90983; |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nShapeOptionType = NS_dff::LN_shpdyWrapDistTop; |
| break; |
| case NS_ooxml::LN_CT_Anchor_distB: // 90984; |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nShapeOptionType = NS_dff::LN_shpdyWrapDistBottom; |
| break; |
| case NS_ooxml::LN_CT_Anchor_distL: // 90985; |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nShapeOptionType = NS_dff::LN_shpdxWrapDistLeft; |
| break; |
| case NS_ooxml::LN_CT_Anchor_distR: // 90986; |
| /* WRITERFILTERSTATUS: */ |
| m_pImpl->nShapeOptionType = NS_dff::LN_shpdxWrapDistRight; |
| break; |
| //m_pImpl->nShapeOptionType = NS_dff::LN_shpcropFromTop |
| default: ; |
| } |
| ProcessShapeOptions(val); |
| } |
| break; |
| case NS_ooxml::LN_CT_Anchor_simplePos_attr: // 90987; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| m_pImpl->bUseSimplePos = nIntValue > 0; |
| break; |
| case NS_ooxml::LN_CT_Anchor_relativeHeight: // 90988; |
| /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ |
| //z-order |
| break; |
| case NS_ooxml::LN_CT_Anchor_behindDoc: // 90989; - in background |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| if( nIntValue > 0 ) |
| m_pImpl->bOpaque = false; |
| break; |
| case NS_ooxml::LN_CT_Anchor_locked: // 90990; - ignored |
| case NS_ooxml::LN_CT_Anchor_layoutInCell: // 90991; - ignored |
| case NS_ooxml::LN_CT_Anchor_hidden: // 90992; - ignored |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; |
| case NS_ooxml::LN_CT_Anchor_allowOverlap: // 90993; |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //enable overlapping - ignored |
| break; |
| case NS_ooxml::LN_CT_Point2D_x: // 90405; |
| case NS_ooxml::LN_CT_Point2D_y: // 90406; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| if( m_pImpl->bUseSimplePos ) |
| { |
| //todo: absolute positioning |
| NS_ooxml::LN_CT_Point2D_x == nName ? m_pImpl->nLeftPosition = ConversionHelper::convertTwipToMM100(nIntValue) : |
| m_pImpl->nTopPosition = ConversionHelper::convertTwipToMM100(nIntValue); |
| |
| } |
| break; |
| case NS_ooxml::LN_CT_WrapTight_wrapText: // 90934; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| m_pImpl->bContour = true; |
| m_pImpl->bContourOutside = true; |
| |
| handleWrapTextValue(val.getInt()); |
| |
| break; |
| case NS_ooxml::LN_CT_WrapThrough_wrapText: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| m_pImpl->bContour = true; |
| m_pImpl->bContourOutside = false; |
| |
| handleWrapTextValue(val.getInt()); |
| |
| break; |
| case NS_ooxml::LN_CT_WrapSquare_wrapText: //90928; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| |
| handleWrapTextValue(val.getInt()); |
| break; |
| case NS_ooxml::LN_shape: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| { |
| uno::Reference< drawing::XShape> xShape; |
| val.getAny( ) >>= xShape; |
| |
| if ( xShape.is( ) ) |
| { |
| // Is it a graphic image |
| bool bUseShape = true; |
| try |
| { |
| uno::Reference< beans::XPropertySet > xShapeProps |
| ( xShape, uno::UNO_QUERY_THROW ); |
| |
| rtl::OUString sUrl; |
| xShapeProps->getPropertyValue( rtl::OUString::createFromAscii( "GraphicURL" ) ) >>= sUrl; |
| |
| ::com::sun::star::beans::PropertyValues aMediaProperties( 1 ); |
| aMediaProperties[0].Name = rtl::OUString::createFromAscii( "URL" ); |
| aMediaProperties[0].Value <<= sUrl; |
| |
| m_xGraphicObject = createGraphicObject( aMediaProperties ); |
| |
| bUseShape = !m_xGraphicObject.is( ); |
| |
| if ( !bUseShape ) |
| { |
| // Define the object size |
| uno::Reference< beans::XPropertySet > xGraphProps( m_xGraphicObject, |
| uno::UNO_QUERY ); |
| awt::Size aSize = xShape->getSize( ); |
| xGraphProps->setPropertyValue( rtl::OUString::createFromAscii( "Height" ), |
| uno::makeAny( aSize.Height ) ); |
| xGraphProps->setPropertyValue( rtl::OUString::createFromAscii( "Width" ), |
| uno::makeAny( aSize.Width ) ); |
| |
| { |
| text::GraphicCrop aGraphicCrop( 0, 0, 0, 0 ); |
| uno::Reference< beans::XPropertySet > xSourceGraphProps( xShape, uno::UNO_QUERY ); |
| uno::Any aAny = xSourceGraphProps->getPropertyValue( rtl::OUString::createFromAscii("GraphicCrop")); |
| if ( aAny >>= aGraphicCrop ) |
| { |
| xGraphProps->setPropertyValue( |
| rtl::OUString::createFromAscii("GraphicCrop"), |
| uno::makeAny( aGraphicCrop ) ); |
| } |
| } |
| } |
| } |
| catch( const beans::UnknownPropertyException e ) |
| { |
| // It isn't a graphic image |
| } |
| |
| if ( bUseShape ) |
| m_xShape = xShape; |
| |
| |
| if ( m_xShape.is( ) ) |
| { |
| uno::Reference< beans::XPropertySet > xShapeProps |
| (m_xShape, uno::UNO_QUERY_THROW); |
| |
| |
| PropertyNameSupplier& rPropNameSupplier = |
| PropertyNameSupplier::GetPropertyNameSupplier(); |
| xShapeProps->setPropertyValue |
| (rPropNameSupplier.GetName(PROP_ANCHOR_TYPE), |
| uno::makeAny |
| (text::TextContentAnchorType_AS_CHARACTER)); |
| xShapeProps->setPropertyValue |
| (rPropNameSupplier.GetName(PROP_TEXT_RANGE), |
| uno::makeAny |
| (m_pImpl->rDomainMapper.GetCurrentTextRange())); |
| |
| awt::Point aPoint(m_xShape->getPosition()); |
| awt::Size aSize(m_xShape->getSize()); |
| |
| if (m_pImpl->isXSizeValid()) |
| aSize.Width = m_pImpl->getXSize(); |
| if (m_pImpl->isYSizeValis()) |
| aSize.Height = m_pImpl->getYSize(); |
| |
| m_xShape->setSize(aSize); |
| |
| m_pImpl->bIsGraphic = true; |
| } |
| } |
| } |
| break; |
| case NS_ooxml::LN_CT_Inline_distT: |
| case NS_ooxml::LN_CT_Inline_distB: |
| case NS_ooxml::LN_CT_Inline_distL: |
| case NS_ooxml::LN_CT_Inline_distR: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ |
| //TODO: need to be handled |
| break; |
| case NS_ooxml::LN_CT_GraphicalObjectData_uri: |
| /* WRITERFILTERSTATUS: done: 50, planned: 0.5, spent: 0 */ |
| val.getString(); |
| //TODO: does it need to be handled? |
| break; |
| default: |
| #ifdef DEBUG_DMAPPER_GRAPHIC_IMPORT |
| dmapper_logger->element("unhandled"); |
| #endif |
| ; |
| } |
| } |
| |
| uno::Reference<text::XTextContent> GraphicImport::GetGraphicObject() |
| { |
| uno::Reference<text::XTextContent> xResult; |
| |
| if (m_xGraphicObject.is()) |
| xResult = m_xGraphicObject; |
| else if (m_xShape.is()) |
| { |
| xResult.set(m_xShape, uno::UNO_QUERY_THROW); |
| } |
| |
| return xResult; |
| } |
| |
| /*-- 22.11.2006 09:46:48--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::ProcessShapeOptions(Value& val) |
| { |
| sal_Int32 nIntValue = val.getInt(); |
| sal_Int32 nTwipValue = ConversionHelper::convertTwipToMM100(nIntValue); |
| /* WRITERFILTERSTATUS: table: ShapeOptionsAttribute */ |
| switch( m_pImpl->nShapeOptionType ) |
| { |
| case NS_dff::LN_shpcropFromTop /*256*/ : |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nTopCrop = nTwipValue; |
| break;// rtf:shpcropFromTop |
| case NS_dff::LN_shpcropFromBottom /*257*/ : |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nBottomCrop= nTwipValue; |
| break;// rtf:shpcropFromBottom |
| case NS_dff::LN_shpcropFromLeft /*258*/ : |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nLeftCrop = nTwipValue; |
| break;// rtf:shpcropFromLeft |
| case NS_dff::LN_shpcropFromRight/*259*/ : |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nRightCrop = nTwipValue; |
| break;// rtf:shpcropFromRight |
| case NS_dff::LN_shppib/*260*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shppib |
| case NS_dff::LN_shppibName/*261*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shppibName |
| case NS_dff::LN_shppibFlags/*262*/: // rtf:shppibFlags |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| /* |
| * // MSOBLIPFLAGS ñ flags for pictures |
| typedef enum |
| { |
| msoblipflagDefault = 0, |
| msoblipflagComment = 0, // Blip name is a comment |
| msoblipflagFile, // Blip name is a file name |
| msoblipflagURL, // Blip name is a full URL |
| msoblipflagType = 3, // Mask to extract type |
| // Or the following flags with any of the above. |
| msoblipflagDontSave = 4, // A "dont" is the depression in the metal |
| // body work of an automobile caused when a |
| // cyclist violently thrusts his or her nose |
| // at it, thus a DontSave is another name for |
| // a cycle lane. |
| msoblipflagDoNotSave = 4, // For those who prefer English |
| msoblipflagLinkToFile = 8, |
| }; |
| * |
| * */ |
| break; |
| case NS_dff::LN_shppictureContrast/*264*/: // rtf:shppictureContrast docu: "1<<16" |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| /* |
| 0x10000 is msoffice 50% |
| < 0x10000 is in units of 1/50th of 0x10000 per 1% |
| > 0x10000 is in units where |
| a msoffice x% is stored as 50/(100-x) * 0x10000 |
| |
| plus, a (ui) microsoft % ranges from 0 to 100, OOO |
| from -100 to 100, so also normalize into that range |
| */ |
| if ( nIntValue > 0x10000 ) |
| { |
| double fX = nIntValue; |
| fX /= 0x10000; |
| fX /= 51; // 50 + 1 to round |
| fX = 1/fX; |
| m_pImpl->nContrast = static_cast<sal_Int32>(fX); |
| m_pImpl->nContrast -= 100; |
| m_pImpl->nContrast = -m_pImpl->nContrast; |
| m_pImpl->nContrast = (m_pImpl->nContrast-50)*2; |
| } |
| else if ( nIntValue == 0x10000 ) |
| m_pImpl->nContrast = 0; |
| else |
| { |
| m_pImpl->nContrast = nIntValue * 101; //100 + 1 to round |
| m_pImpl->nContrast /= 0x10000; |
| m_pImpl->nContrast -= 100; |
| } |
| break; |
| case NS_dff::LN_shppictureBrightness/*265*/: // rtf:shppictureBrightness |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->nBrightness = ( (sal_Int32) nIntValue / 327 ); |
| break; |
| case NS_dff::LN_shppictureGamma/*266*/: // rtf:shppictureGamma |
| /* WRITERFILTERSTATUS: done: 50, planned: 0, spent: 0 */ |
| //todo check gamma value with _real_ document |
| m_pImpl->fGamma = double(nIntValue/655); |
| break; |
| case NS_dff::LN_shppictureId /*267*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shppictureId |
| case NS_dff::LN_shppictureDblCrMod /*268*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shppictureDblCrMod |
| case NS_dff::LN_shppictureFillCrMod /*269*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shppictureFillCrMod |
| case NS_dff::LN_shppictureLineCrMod /*270*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shppictureLineCrMod |
| |
| case NS_dff::LN_shppictureActive/*319*/: // rtf:shppictureActive |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| switch( nIntValue & 0x06 ) |
| { |
| case 0 : m_pImpl->eColorMode = drawing::ColorMode_STANDARD; break; |
| case 4 : m_pImpl->eColorMode = drawing::ColorMode_GREYS; break; |
| case 6 : m_pImpl->eColorMode = drawing::ColorMode_MONO; break; |
| default:; |
| } |
| break; |
| case NS_dff::LN_shpfillColor /*385*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| m_pImpl->nFillColor = (m_pImpl->nFillColor & 0xff000000) + ConversionHelper::ConvertColor( nIntValue ); |
| break; |
| case NS_dff::LN_shpfillOpacity /*386*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| { |
| sal_Int32 nTrans = 0xff - ( nIntValue * 0xff ) / 0xffff; |
| m_pImpl->nFillColor = (nTrans << 0x18 ) + (m_pImpl->nFillColor & 0xffffff); |
| } |
| break; |
| case NS_dff::LN_shpfNoFillHitTest /*447*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shpfNoFillHitTest |
| case NS_dff::LN_shplineColor /*448*/: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| m_pImpl->aBorders[m_pImpl->nCurrentBorderLine].nLineColor = ConversionHelper::ConvertColor( nIntValue ); |
| break; |
| case NS_dff::LN_shplineWidth /*459*/: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ |
| //1pt == 12700 units |
| m_pImpl->aBorders[m_pImpl->nCurrentBorderLine].nLineWidth = ConversionHelper::convertTwipToMM100(nIntValue / 635); |
| break; |
| case NS_dff::LN_shplineDashing /*462*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //graphic borders don't support different dashing |
| /*MSOLINEDASHING |
| msolineSolid, // Solid (continuous) pen |
| msolineDashSys, // PS_DASH system dash style |
| msolineDotSys, // PS_DOT system dash style |
| msolineDashDotSys, // PS_DASHDOT system dash style |
| msolineDashDotDotSys, // PS_DASHDOTDOT system dash style |
| msolineDotGEL, // square dot style |
| msolineDashGEL, // dash style |
| msolineLongDashGEL, // long dash style |
| msolineDashDotGEL, // dash short dash |
| msolineLongDashDotGEL, // long dash short dash |
| msolineLongDashDotDotGEL // long dash short dash short dash*/ |
| //m_pImpl->aBorders[nCurrentBorderLine].nLineType = nIntValue; |
| break; |
| case NS_dff::LN_shpfNoLineDrawDash /*511*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shpfNoLineDrawDash |
| case NS_dff::LN_shpwzDescription /*897*/: //alternative text |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| m_pImpl->sAlternativeText = val.getString(); |
| break; |
| // case NS_dff::LN_shppihlShape /*898*/: |
| case NS_dff::LN_shppWrapPolygonVertices/*899*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shppWrapPolygonVertices |
| case NS_dff::LN_shpdxWrapDistLeft /*900*/: // contains a twip/635 value |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //todo: changes have to be applied depending on the orientation, see SwWW8ImplReader::AdjustLRWrapForWordMargins() |
| m_pImpl->nLeftMargin = nIntValue / 360; |
| break; |
| case NS_dff::LN_shpdyWrapDistTop /*901*/: // contains a twip/635 value |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //todo: changes have to be applied depending on the orientation, see SwWW8ImplReader::AdjustULWrapForWordMargins() |
| m_pImpl->nTopMargin = nIntValue / 360; |
| break; |
| case NS_dff::LN_shpdxWrapDistRight /*902*/:// contains a twip/635 value |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //todo: changes have to be applied depending on the orientation, see SwWW8ImplReader::AdjustLRWrapForWordMargins() |
| m_pImpl->nRightMargin = nIntValue / 360; |
| break; |
| case NS_dff::LN_shpdyWrapDistBottom /*903*/:// contains a twip/635 value |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| //todo: changes have to be applied depending on the orientation, see SwWW8ImplReader::AdjustULWrapForWordMargins() |
| m_pImpl->nBottomMargin = nIntValue / 360; |
| break; |
| case NS_dff::LN_shpfPrint /*959*/: |
| /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ |
| break; // rtf:shpfPrint |
| default: |
| OSL_ENSURE( false, "shape option unsupported?"); |
| } |
| } |
| /*-- 01.11.2006 09:45:02--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_sprm(Sprm & rSprm) |
| { |
| sal_uInt32 nSprmId = rSprm.getId(); |
| Value::Pointer_t pValue = rSprm.getValue(); |
| |
| /* WRITERFILTERSTATUS: table: PICFsprmdata */ |
| switch(nSprmId) |
| { |
| case 0xf004: //dff record |
| case 0xf00a: //part of 0xf004 - shape properties |
| case 0xf00b: //part of 0xf004 |
| case 0xf007: |
| case 0xf122: //udefprop |
| case NS_ooxml::LN_CT_Inline_extent: // 90911; |
| case NS_ooxml::LN_CT_Inline_effectExtent: // 90912; |
| case NS_ooxml::LN_CT_Inline_docPr: // 90913; |
| case NS_ooxml::LN_CT_Inline_cNvGraphicFramePr: // 90914; |
| case NS_ooxml::LN_CT_NonVisualGraphicFrameProperties_graphicFrameLocks:// 90657 |
| case NS_ooxml::LN_CT_Inline_a_graphic:// 90915 |
| case NS_ooxml::LN_CT_Anchor_simplePos_elem: // 90975; |
| case NS_ooxml::LN_CT_Anchor_extent: // 90978; |
| case NS_ooxml::LN_CT_Anchor_effectExtent: // 90979; |
| case NS_ooxml::LN_EG_WrapType_wrapSquare: // 90945; |
| case NS_ooxml::LN_EG_WrapType_wrapTight: // 90946; |
| case NS_ooxml::LN_EG_WrapType_wrapThrough: |
| case NS_ooxml::LN_CT_Anchor_docPr: // 90980; |
| case NS_ooxml::LN_CT_Anchor_cNvGraphicFramePr: // 90981; |
| case NS_ooxml::LN_CT_Anchor_a_graphic: // 90982; |
| case NS_ooxml::LN_CT_WrapPath_start: // 90924; |
| case NS_ooxml::LN_CT_WrapPath_lineTo: // 90925; |
| case NS_ooxml::LN_graphic_graphic: |
| case NS_ooxml::LN_pic_pic: |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| { |
| writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); |
| if( pProperties.get()) |
| { |
| pProperties->resolve(*this); |
| } |
| } |
| break; |
| case NS_ooxml::LN_CT_WrapTight_wrapPolygon: |
| case NS_ooxml::LN_CT_WrapThrough_wrapPolygon: |
| /* WRITERFILTERSTATUS: done: 100, planned: 4, spent: 2 */ |
| { |
| WrapPolygonHandler aHandler; |
| |
| resolveSprmProps(aHandler, rSprm); |
| |
| m_pImpl->mpWrapPolygon = aHandler.getPolygon(); |
| } |
| break; |
| case NS_ooxml::LN_CT_Anchor_positionH: // 90976; |
| { |
| // Use a special handler for the positionning |
| PositionHandlerPtr pHandler( new PositionHandler ); |
| writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); |
| if( pProperties.get( ) ) |
| { |
| pProperties->resolve( *pHandler ); |
| |
| m_pImpl->nHoriRelation = pHandler->m_nRelation; |
| m_pImpl->nHoriOrient = pHandler->m_nOrient; |
| m_pImpl->nLeftPosition = pHandler->m_nPosition; |
| } |
| } |
| break; |
| case NS_ooxml::LN_CT_Anchor_positionV: // 90977; |
| { |
| // Use a special handler for the positionning |
| PositionHandlerPtr pHandler( new PositionHandler ); |
| writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); |
| if( pProperties.get( ) ) |
| { |
| pProperties->resolve( *pHandler ); |
| |
| m_pImpl->nVertRelation = pHandler->m_nRelation; |
| m_pImpl->nVertOrient = pHandler->m_nOrient; |
| m_pImpl->nTopPosition = pHandler->m_nPosition; |
| } |
| } |
| break; |
| case 0x271b: |
| case 0x271c: |
| { |
| if( nSprmId != 0x271c || m_pImpl->nDffType == 0xf01f || m_pImpl->nDffType == 0xf01e ) |
| { |
| writerfilter::Reference<BinaryObj>::Pointer_t pPictureData = rSprm.getBinary(); |
| if( pPictureData.get()) |
| pPictureData->resolve(*this); |
| } |
| } |
| break; |
| case NS_ooxml::LN_EG_WrapType_wrapNone: // 90944; - doesn't contain attributes |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| //depending on the behindDoc attribute text wraps through behind or in fron of the object |
| m_pImpl->nWrap = text::WrapTextMode_THROUGHT; |
| break; |
| case NS_ooxml::LN_EG_WrapType_wrapTopAndBottom: // 90948; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| m_pImpl->nWrap = text::WrapTextMode_NONE; |
| break; |
| case 0xf010: |
| case 0xf011: |
| //ignore - doesn't contain useful members |
| break; |
| case NS_ooxml::LN_CT_GraphicalObject_graphicData:// 90660; |
| /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ |
| { |
| m_pImpl->bIsGraphic = true; |
| |
| writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); |
| if( pProperties.get()) |
| pProperties->resolve(*this); |
| } |
| break; |
| default: |
| #if OSL_DEBUG_LEVEL > 0 |
| ::rtl::OString sMessage( "GraphicImport::sprm() - Id: "); |
| sMessage += ::rtl::OString::valueOf( sal_Int32( nSprmId ), 10 ); |
| sMessage += ::rtl::OString(" / 0x"); |
| sMessage += ::rtl::OString::valueOf( sal_Int32( nSprmId ), 16 ); |
| OSL_ENSURE( false, sMessage.getStr()) |
| #endif |
| ; |
| } |
| } |
| /*-- 01.11.2006 09:45:02--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_entry(int /*pos*/, writerfilter::Reference<Properties>::Pointer_t /*ref*/) |
| { |
| } |
| /*-- 16.11.2006 16:14:32--------------------------------------------------- |
| crop is stored as "fixed float" as 16.16 fraction value |
| related to width/or height |
| -----------------------------------------------------------------------*/ |
| void lcl_CalcCrop( sal_Int32& nCrop, sal_Int32 nRef ) |
| { |
| nCrop = ((nCrop >> 16 ) * nRef ) |
| + (((nCrop & 0xffff) * nRef ) >> 16); |
| } |
| |
| uno::Reference< text::XTextContent > GraphicImport::createGraphicObject( const beans::PropertyValues& aMediaProperties ) |
| { |
| uno::Reference< text::XTextContent > xGraphicObject; |
| try |
| { |
| uno::Reference< graphic::XGraphicProvider > xGraphicProvider( |
| m_xComponentContext->getServiceManager()->createInstanceWithContext( |
| ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.graphic.GraphicProvider")), |
| m_xComponentContext), |
| uno::UNO_QUERY_THROW ); |
| |
| uno::Reference< graphic::XGraphic > xGraphic = xGraphicProvider->queryGraphic( aMediaProperties ); |
| |
| if(xGraphic.is()) |
| { |
| PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); |
| |
| uno::Reference< beans::XPropertySet > xGraphicObjectProperties( |
| m_xTextFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextGraphicObject"))), |
| uno::UNO_QUERY_THROW); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_GRAPHIC), uno::makeAny( xGraphic )); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_ANCHOR_TYPE), |
| uno::makeAny( m_pImpl->eGraphicImportType == IMPORT_AS_SHAPE || m_pImpl->eGraphicImportType == IMPORT_AS_DETECTED_ANCHOR ? |
| text::TextContentAnchorType_AT_CHARACTER : |
| text::TextContentAnchorType_AS_CHARACTER )); |
| xGraphicObject = uno::Reference< text::XTextContent >( xGraphicObjectProperties, uno::UNO_QUERY_THROW ); |
| |
| //shapes have only one border, PICF might have four |
| table::BorderLine aBorderLine; |
| for( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder ) |
| { |
| if( m_pImpl->eGraphicImportType == IMPORT_AS_GRAPHIC || !nBorder ) |
| { |
| aBorderLine.Color = m_pImpl->aBorders[m_pImpl->eGraphicImportType == IMPORT_AS_SHAPE ? BORDER_TOP : static_cast<BorderPosition>(nBorder) ].nLineColor; |
| aBorderLine.InnerLineWidth = 0; |
| aBorderLine.OuterLineWidth = (sal_Int16)m_pImpl->aBorders[m_pImpl->eGraphicImportType == IMPORT_AS_SHAPE ? BORDER_TOP : static_cast<BorderPosition>(nBorder) ].nLineWidth; |
| aBorderLine.LineDistance = 0; |
| } |
| PropertyIds aBorderProps[4] = |
| { |
| PROP_LEFT_BORDER, |
| PROP_RIGHT_BORDER, |
| PROP_TOP_BORDER, |
| PROP_BOTTOM_BORDER |
| }; |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( aBorderProps[nBorder]), uno::makeAny(aBorderLine)); |
| } |
| |
| // setting properties for all types |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_TITLE ), |
| uno::makeAny( m_pImpl->sAlternativeText )); |
| if( m_pImpl->bPositionProtected ) |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_POSITION_PROTECTED ), |
| uno::makeAny(true)); |
| if( m_pImpl->bSizeProtected ) |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_SIZE_PROTECTED ), |
| uno::makeAny(true)); |
| |
| if( m_pImpl->eGraphicImportType == IMPORT_AS_SHAPE || m_pImpl->eGraphicImportType == IMPORT_AS_DETECTED_ANCHOR ) |
| { |
| sal_Int32 nWidth = m_pImpl->nRightPosition - m_pImpl->nLeftPosition; |
| if( m_pImpl->eGraphicImportType == IMPORT_AS_SHAPE ) |
| { |
| sal_Int32 nHeight = m_pImpl->nBottomPosition - m_pImpl->nTopPosition; |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_SIZE), |
| uno::makeAny( awt::Size( nWidth, nHeight ))); |
| } |
| //adjust margins |
| if( (m_pImpl->nHoriOrient == text::HoriOrientation::LEFT && |
| (m_pImpl->nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA || |
| m_pImpl->nHoriRelation == text::RelOrientation::FRAME) ) || |
| (m_pImpl->nHoriOrient == text::HoriOrientation::INSIDE && |
| m_pImpl->nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA )) |
| m_pImpl->nLeftMargin = 0; |
| if((m_pImpl->nHoriOrient == text::HoriOrientation::RIGHT && |
| (m_pImpl->nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA || |
| m_pImpl->nHoriRelation == text::RelOrientation::FRAME) ) || |
| (m_pImpl->nHoriOrient == text::HoriOrientation::INSIDE && |
| m_pImpl->nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA )) |
| m_pImpl->nRightMargin = 0; |
| // adjust top/bottom margins |
| if( m_pImpl->nVertOrient == text::VertOrientation::TOP && |
| ( m_pImpl->nVertRelation == text::RelOrientation::PAGE_PRINT_AREA || |
| m_pImpl->nVertRelation == text::RelOrientation::PAGE_FRAME)) |
| m_pImpl->nTopMargin = 0; |
| if( m_pImpl->nVertOrient == text::VertOrientation::BOTTOM && |
| ( m_pImpl->nVertRelation == text::RelOrientation::PAGE_PRINT_AREA || |
| m_pImpl->nVertRelation == text::RelOrientation::PAGE_FRAME)) |
| m_pImpl->nBottomMargin = 0; |
| if( m_pImpl->nVertOrient == text::VertOrientation::BOTTOM && |
| m_pImpl->nVertRelation == text::RelOrientation::PAGE_PRINT_AREA ) |
| m_pImpl->nBottomMargin = 0; |
| |
| //adjust alignment |
| if( m_pImpl->nHoriOrient == text::HoriOrientation::INSIDE && |
| m_pImpl->nHoriRelation == text::RelOrientation::PAGE_FRAME ) |
| { |
| // convert 'left to page' to 'from left -<width> to page text area' |
| m_pImpl->nHoriOrient = text::HoriOrientation::NONE; |
| m_pImpl->nHoriRelation = text::RelOrientation::PAGE_PRINT_AREA; |
| m_pImpl->nLeftPosition = - nWidth; |
| } |
| else if( m_pImpl->nHoriOrient == text::HoriOrientation::OUTSIDE && |
| m_pImpl->nHoriRelation == text::RelOrientation::PAGE_FRAME ) |
| { |
| // convert 'right to page' to 'from left 0 to right page border' |
| m_pImpl->nHoriOrient = text::HoriOrientation::NONE; |
| m_pImpl->nHoriRelation = text::RelOrientation::PAGE_RIGHT; |
| m_pImpl->nLeftPosition = 0; |
| } |
| |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_HORI_ORIENT ), |
| uno::makeAny(m_pImpl->nHoriOrient)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_HORI_ORIENT_POSITION), |
| uno::makeAny(m_pImpl->nLeftPosition)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_HORI_ORIENT_RELATION ), |
| uno::makeAny(m_pImpl->nHoriRelation)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_PAGE_TOGGLE ), |
| uno::makeAny(m_pImpl->bPageToggle)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_VERT_ORIENT ), |
| uno::makeAny(m_pImpl->nVertOrient)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_VERT_ORIENT_POSITION), |
| uno::makeAny(m_pImpl->nTopPosition)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_VERT_ORIENT_RELATION ), |
| uno::makeAny(m_pImpl->nVertRelation)); |
| if( !m_pImpl->bOpaque ) |
| { |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_OPAQUE ), |
| uno::makeAny(m_pImpl->bOpaque)); |
| } |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_SURROUND ), |
| uno::makeAny(m_pImpl->nWrap)); |
| |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_SURROUND_CONTOUR ), |
| uno::makeAny(m_pImpl->bContour)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_CONTOUR_OUTSIDE ), |
| uno::makeAny(m_pImpl->bContourOutside)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_LEFT_MARGIN ), |
| uno::makeAny(m_pImpl->nLeftMargin)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_RIGHT_MARGIN ), |
| uno::makeAny(m_pImpl->nRightMargin)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_TOP_MARGIN ), |
| uno::makeAny(m_pImpl->nTopMargin)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_BOTTOM_MARGIN ), |
| uno::makeAny(m_pImpl->nBottomMargin)); |
| |
| if( m_pImpl->eColorMode == drawing::ColorMode_STANDARD && |
| m_pImpl->nContrast == -70 && |
| m_pImpl->nBrightness == 70 ) |
| { |
| // strange definition of WATERMARK! |
| m_pImpl->nContrast = 0; |
| m_pImpl->nBrightness = 0; |
| m_pImpl->eColorMode = drawing::ColorMode_WATERMARK; |
| } |
| |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_ADJUST_CONTRAST ), |
| uno::makeAny((sal_Int16)m_pImpl->nContrast)); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_ADJUST_LUMINANCE ), |
| uno::makeAny((sal_Int16)m_pImpl->nBrightness)); |
| if(m_pImpl->eColorMode != drawing::ColorMode_STANDARD) |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_GRAPHIC_COLOR_MODE ), |
| uno::makeAny(m_pImpl->eColorMode)); |
| if(m_pImpl->fGamma > 0. ) |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_GAMMA ), |
| uno::makeAny(m_pImpl->fGamma )); |
| if(m_pImpl->bHoriFlip) |
| { |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_HORI_MIRRORED_ON_EVEN_PAGES ), |
| uno::makeAny( m_pImpl->bHoriFlip )); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_HORI_MIRRORED_ON_ODD_PAGES ), |
| uno::makeAny( m_pImpl->bHoriFlip )); |
| } |
| |
| if( m_pImpl->bVertFlip ) |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_VERT_MIRRORED ), |
| uno::makeAny( m_pImpl->bVertFlip )); |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_BACK_COLOR ), |
| uno::makeAny( m_pImpl->nFillColor )); |
| |
| //there seems to be no way to detect the original size via _real_ API |
| uno::Reference< beans::XPropertySet > xGraphicProperties( xGraphic, uno::UNO_QUERY_THROW ); |
| awt::Size aGraphicSize, aGraphicSizePixel; |
| xGraphicProperties->getPropertyValue(rPropNameSupplier.GetName( PROP_SIZE100th_M_M )) >>= aGraphicSize; |
| xGraphicProperties->getPropertyValue(rPropNameSupplier.GetName( PROP_SIZE_PIXEL )) >>= aGraphicSizePixel; |
| |
| uno::Any aContourPolyPolygon; |
| if( aGraphicSize.Width && aGraphicSize.Height && |
| m_pImpl->mpWrapPolygon.get() != NULL) |
| { |
| awt::Size aDstSize(m_pImpl->getXSize(), m_pImpl->getYSize()); |
| WrapPolygon::Pointer_t pCorrected = m_pImpl->mpWrapPolygon->correctWordWrapPolygon(aGraphicSize, aDstSize); |
| aContourPolyPolygon <<= pCorrected->getPointSequenceSequence(); |
| } |
| |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_CONTOUR_POLY_POLYGON), |
| aContourPolyPolygon); |
| |
| if( aGraphicSize.Width && aGraphicSize.Height ) |
| { |
| //todo: i71651 graphic size is not provided by the GraphicDescriptor |
| lcl_CalcCrop( m_pImpl->nTopCrop, aGraphicSize.Height ); |
| lcl_CalcCrop( m_pImpl->nBottomCrop, aGraphicSize.Height ); |
| lcl_CalcCrop( m_pImpl->nLeftCrop, aGraphicSize.Width ); |
| lcl_CalcCrop( m_pImpl->nRightCrop, aGraphicSize.Width ); |
| |
| |
| xGraphicProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_GRAPHIC_CROP ), |
| uno::makeAny(text::GraphicCrop(m_pImpl->nTopCrop, m_pImpl->nBottomCrop, m_pImpl->nLeftCrop, m_pImpl->nRightCrop))); |
| } |
| |
| } |
| |
| if(m_pImpl->eGraphicImportType == IMPORT_AS_DETECTED_INLINE || m_pImpl->eGraphicImportType == IMPORT_AS_DETECTED_ANCHOR) |
| { |
| if( m_pImpl->getXSize() && m_pImpl->getYSize() ) |
| xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_SIZE), |
| uno::makeAny( awt::Size( m_pImpl->getXSize(), m_pImpl->getYSize() ))); |
| try |
| { |
| if( m_pImpl->sName.getLength() ) |
| { |
| uno::Reference< container::XNamed > xNamed( xGraphicObjectProperties, uno::UNO_QUERY_THROW ); |
| xNamed->setName( m_pImpl->sName ); |
| } |
| } |
| catch( const uno::Exception& ) |
| { |
| } |
| } |
| } |
| } |
| catch( const uno::Exception& e ) |
| { |
| clog << __FILE__ << ":" << __LINE__ << " failed. Message :" ; |
| clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl; |
| } |
| return xGraphicObject; |
| } |
| |
| /*-- 01.11.2006 09:45:02--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::data(const sal_uInt8* buf, size_t len, writerfilter::Reference<Properties>::Pointer_t /*ref*/) |
| { |
| PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); |
| |
| ::com::sun::star::beans::PropertyValues aMediaProperties( 1 ); |
| aMediaProperties[0].Name = rPropNameSupplier.GetName(PROP_INPUT_STREAM); |
| |
| uno::Reference< io::XInputStream > xIStream = new XInputStreamHelper( buf, len, m_pImpl->bIsBitmap ); |
| aMediaProperties[0].Value <<= xIStream; |
| |
| m_xGraphicObject = createGraphicObject( aMediaProperties ); |
| } |
| /*-- 01.11.2006 09:45:03--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_startSectionGroup() |
| { |
| } |
| /*-- 01.11.2006 09:45:03--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_endSectionGroup() |
| { |
| } |
| /*-- 01.11.2006 09:45:03--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_startParagraphGroup() |
| { |
| } |
| /*-- 01.11.2006 09:45:03--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_endParagraphGroup() |
| { |
| } |
| /*-- 01.11.2006 09:45:03--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_startCharacterGroup() |
| { |
| } |
| /*-- 01.11.2006 09:45:04--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_endCharacterGroup() |
| { |
| } |
| /*-- 01.11.2006 09:45:04--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_text(const sal_uInt8 * /*_data*/, size_t /*len*/) |
| { |
| } |
| /*-- 01.11.2006 09:45:05--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_utext(const sal_uInt8 * /*_data*/, size_t /*len*/) |
| { |
| } |
| /*-- 01.11.2006 09:45:05--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_props(writerfilter::Reference<Properties>::Pointer_t /*ref*/) |
| { |
| } |
| /*-- 01.11.2006 09:45:06--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_table(Id /*name*/, writerfilter::Reference<Table>::Pointer_t /*ref*/) |
| { |
| } |
| /*-- 01.11.2006 09:45:07--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_substream(Id /*name*/, ::writerfilter::Reference<Stream>::Pointer_t /*ref*/) |
| { |
| } |
| /*-- 01.11.2006 09:45:07--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void GraphicImport::lcl_info(const string & /*info*/) |
| { |
| } |
| |
| void GraphicImport::lcl_startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > /*xShape*/ ) |
| { |
| } |
| |
| void GraphicImport::lcl_endShape( ) |
| { |
| } |
| |
| /*-- 09.08.2007 10:17:00--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| bool GraphicImport::IsGraphic() const |
| { |
| return m_pImpl->bIsGraphic; |
| } |
| |
| } |
| } |