summaryrefslogtreecommitdiff
path: root/lotuswordpro/source/filter/lwpgrfobj.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'lotuswordpro/source/filter/lwpgrfobj.cxx')
-rw-r--r--lotuswordpro/source/filter/lwpgrfobj.cxx841
1 files changed, 841 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpgrfobj.cxx b/lotuswordpro/source/filter/lwpgrfobj.cxx
new file mode 100644
index 000000000000..bfb6fa43b7d2
--- /dev/null
+++ b/lotuswordpro/source/filter/lwpgrfobj.cxx
@@ -0,0 +1,841 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (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.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: IBM Corporation
+ *
+ * Copyright: 2008 by IBM Corporation
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+/*****************************************************************************
+* Change History
+* 2005/2 draft code for chart
+****************************************************************************/
+
+/**
+ * @file
+ * For LWP filter architecture prototype
+*/
+#include <stdio.h>
+#include "lwp9reader.hxx"
+#include "lwpgrfobj.hxx"
+#include "lwpsdwfileloader.hxx"
+#include "bento.hxx"
+
+#include "lwpglobalmgr.hxx"
+#include "xfilter/xfframe.hxx"
+#include "xfilter/xfimage.hxx"
+#include "xfilter/xfimagestyle.hxx"
+#include "xfilter/xfstylemanager.hxx"
+#include "xfilter/xfparagraph.hxx"
+#include "xfilter/xfannotation.hxx"
+
+//For chart
+#include "string.h"
+
+#ifndef _OSL_THREAD_H_
+#include <osl/thread.h>
+#endif
+
+#define EF_NONE 0x0000
+#define EF_FTP 0x0001
+#define EF_ODMA 0x0002
+#define EF_NOS 0x0003
+
+LwpGraphicObject::LwpGraphicObject(LwpObjectHeader &objHdr, LwpSvStream* pStrm)
+ : LwpGraphicOleObject(objHdr, pStrm)
+ , m_nCachedBaseLine(0)
+ , m_bIsLinked(0)
+ , m_bCompressed(0)
+{
+}
+LwpGraphicObject::~LwpGraphicObject()
+{
+ m_vXFDrawObjects.clear();
+}
+void LwpGraphicObject::Read()
+{
+ LwpGraphicOleObject::Read();
+ m_pObjStrm->QuickReaduInt16(); //disksize
+ sal_uInt16 strsize = m_pObjStrm->QuickReaduInt16();
+ if (strsize<AFID_MAX_FILE_FORMAT_SIZE)
+ {
+ m_pObjStrm->QuickRead(m_sDataFormat,strsize);
+ m_sDataFormat[strsize] = '\0';
+ }
+/*
+ if (m_sDataFormat!=(unsigned char*)(".lch"))
+ {
+ return;
+ }
+*/
+ sal_uInt32 nServerContextSize = m_pObjStrm->QuickReaduInt32();
+ unsigned char *pServerContext = NULL;
+ if (nServerContextSize > 0)
+ {
+ pServerContext = new unsigned char[nServerContextSize];
+ m_pObjStrm->QuickRead(pServerContext, static_cast<sal_uInt16>(nServerContextSize));
+ // add by , 04/05/2005
+ if (nServerContextSize > 44)
+ {
+ m_aIPData.nBrightness = pServerContext[14];
+ m_aIPData.nContrast = pServerContext[19];
+ m_aIPData.nEdgeEnchancement = pServerContext[24];
+ m_aIPData.nSmoothing = pServerContext[29];
+ m_aIPData.bInvertImage = (sal_Bool)(pServerContext[34] == 0x01);
+ m_aIPData.bAutoContrast = (sal_Bool)(pServerContext[44] == 0x00);
+ }
+ // end add
+ }
+ m_pObjStrm->QuickReaduInt16(); //disksize
+ strsize = m_pObjStrm->QuickReaduInt16();
+ if (strsize<AFID_MAX_FILE_FORMAT_SIZE)
+ {
+ m_pObjStrm->QuickRead(m_sServerContextFormat,strsize);
+ m_sServerContextFormat[strsize] = '\0';
+ }
+ if (nServerContextSize == 0)
+ {
+ if (strcmp((char *)m_sServerContextFormat, ".cht") == 0 &&
+ strcmp((char *)m_sDataFormat, ".sdw") == 0)
+ {
+ strcpy((char *)m_sServerContextFormat, ".lch");
+ strcpy((char *)m_sDataFormat, ".lch");
+ }
+ }
+ m_nCachedBaseLine = m_pObjStrm->QuickReadInt32();
+ m_bIsLinked = m_pObjStrm->QuickReadInt16();
+ //OUString pLinkedFilePath;
+ unsigned char * pFilterContext = NULL;
+ sal_uInt32 nFilterContextSize = 0;
+
+ if (m_bIsLinked)
+ {
+ m_LinkedFilePath = m_pObjStrm->QuickReadStringPtr();
+
+ nFilterContextSize = m_pObjStrm->QuickReaduInt32();
+ if (nFilterContextSize > 0)
+ {
+ pFilterContext = new unsigned char[nFilterContextSize];
+ m_pObjStrm->QuickRead(pFilterContext, static_cast<sal_uInt16>(nFilterContextSize));
+ }
+ if (LwpFileHeader::m_nFileRevision >= 0x000b)
+ {
+
+ // read external file object stuff
+ sal_uInt16 type = m_pObjStrm->QuickReaduInt16();
+// if (EF_ODMA == type)
+// ;
+ if ((EF_ODMA != type) && (EF_NONE != type)) // don't know about this
+ {
+ sal_uInt32 size = m_pObjStrm->QuickReaduInt32();
+ m_pObjStrm->SeekRel(static_cast<sal_uInt16>(size));
+ }
+ // else no external file object
+ }
+ }
+
+ if (LwpFileHeader::m_nFileRevision >= 0x000b)
+ {
+ m_bCompressed = m_pObjStrm->QuickReadInt16();
+ m_Cache.LinkedFileSize = m_pObjStrm->QuickReaduInt32();
+ m_Cache.LinkedFileTime = m_pObjStrm->QuickReaduInt32();
+ m_Cache.Width = m_pObjStrm->QuickReadInt32();
+ m_Cache.Height = m_pObjStrm->QuickReadInt32();
+ }
+
+ if(LwpFileHeader::m_nFileRevision >= 0x000c)
+ {
+ m_WatermarkName = m_pObjStrm->QuickReadStringPtr();
+ }
+
+ if (pServerContext != NULL)
+ delete[] pServerContext;
+
+ if (pFilterContext != NULL)
+ delete[] pFilterContext;
+
+}
+
+void LwpGraphicObject::XFConvert (XFContentContainer* pCont)
+{
+ if ((m_sServerContextFormat[1]=='s'&&m_sServerContextFormat[2]=='d'&&m_sServerContextFormat[3]=='w'))
+ {
+/* LwpSvStream* pStream = m_pStrm;
+ //test code
+ OpenStormBento::LtcBenContainer* pBentoContainer;
+ ULONG ulRet = OpenStormBento::BenOpenContainer(pStream, &pBentoContainer);
+ std::vector<SvStream*> vStream;
+ std::vector<SvStream*>::iterator iter;
+ pBentoContainer->CreateGraphicStreams(&vStream);
+ for (iter=vStream.begin();iter!=vStream.end();iter++)
+ {
+ LwpSdwFileLoader fileLoader(*iter,pOutputStream);
+ fileLoader.LoadObjectList();
+ delete *iter;
+ }
+ vStream.clear();*/
+
+ //XFParagraph* pPara = new XFParagraph();
+ std::vector <XFFrame*>::iterator iter;
+ for (iter = m_vXFDrawObjects.begin(); iter != m_vXFDrawObjects.end(); ++iter)
+ {
+ //pPara->Add(*iter);
+ pCont->Add(*iter);
+ }
+
+ //pCont->Add(pPara);
+
+ }
+ else if (this->IsGrafFormatValid())
+ {
+ XFImage* pImage = static_cast<XFImage*>(m_vXFDrawObjects.front());
+
+ if (m_bIsLinked)
+ {
+ OUString fileURL = LwpTools::convertToFileUrl(OUStringToOString(m_LinkedFilePath, osl_getThreadTextEncoding()));
+ pImage->SetFileURL(fileURL);
+ }
+ else
+ {
+ sal_uInt8* pGrafData = NULL;
+ sal_uInt32 nDataLen = this->GetRawGrafData(pGrafData);
+
+ if (pGrafData)
+ {
+ pImage->SetImageData(pGrafData, nDataLen);
+
+ // delete used image data
+ delete [] pGrafData;
+ pGrafData = NULL;
+ }
+ }
+
+ pCont->Add(pImage);
+ }
+ else if((m_sServerContextFormat[1]=='t'&&m_sServerContextFormat[2]=='e'&&m_sServerContextFormat[3]=='x'))
+ {
+ XFConvertEquation(pCont);
+ }
+ if (m_sServerContextFormat[1]=='l'&&m_sServerContextFormat[2]=='c'&&m_sServerContextFormat[3]=='h')
+ {
+ //LwpSvStream* pDocStream = m_pStrm;
+ //LwpChartStreamTools::ParseChart(pDocStream, GetObjectID(),
+ // GetRectIn100thMM(), GetRectInCM(), pOutputStream);
+ //LwpChartStreamTools::ParseChart(pDocStream, GetObjectID(),
+ // GetRectIn100thMM(), GetRectInCM(), pCont, m_strStyleName);
+ }
+}
+
+/**
+* @short Get the rectangle of a chart in 100thMM
+* @descr
+* @return the rectangle of the chart
+*/
+Rectangle LwpGraphicObject::GetRectIn100thMM()
+{
+#define To100thMM(num) (long)(2540* (double(num)/(72 * 65536L)))
+ INT32 nLeft,nTop,nRight,nBottom;
+ GetRect(nLeft,nTop,nRight,nBottom);
+ return Rectangle( To100thMM(nLeft),To100thMM(nTop),To100thMM(nRight),To100thMM(nBottom) );
+}
+
+/**
+* @short Get the rectangle of a chart in CM
+* @descr
+* @return The rectangle of the chart
+*/
+XFRect LwpGraphicObject::GetRectInCM()
+{
+#define ToCM(num) (2.54*(double(num)/(72 * 65536L)))
+ INT32 nLeft,nTop,nRight,nBottom;
+ GetRect(nLeft,nTop,nRight,nBottom);
+ return XFRect( ToCM(nLeft),ToCM(nTop),ToCM(nRight-nLeft),ToCM(nBottom-nTop) );
+}
+
+/**
+* @short Get the rectangle of a chart
+* @descr
+* @param nLeft
+* @param nTop
+* @param nRight
+* @param nBottom
+*/
+#include "lwpframelayout.hxx"
+void LwpGraphicObject::GetRect(INT32& nLeft, INT32& nTop, INT32& nRight, INT32& nBottom)
+{
+ nLeft = nTop = nRight = nBottom = 0;
+
+ LwpObjectID* pObjID = GetLayoutsWithMe()->GetOnlyLayout();
+ if (pObjID)
+ {
+ LwpFrameLayout* pLayout = (LwpFrameLayout*)pObjID->obj();
+ if (pLayout)
+ {
+ LwpLayoutGeometry* pGeometry =(LwpLayoutGeometry*) pLayout->GetGeometry();
+
+ if (pGeometry)
+ {
+ double fWidth =0;
+ double fHeight = 0;
+ GetGrafScaledSize(fWidth, fHeight);
+
+ sal_Int32 nWidth = fWidth * UNITS_PER_INCH /CM_PER_INCH;
+ sal_Int32 nHeight = fHeight * UNITS_PER_INCH /CM_PER_INCH;
+
+ nLeft = pLayout->GetMarginsValue(MARGIN_LEFT) * UNITS_PER_INCH /CM_PER_INCH;
+ nTop = pLayout->GetMarginsValue(MARGIN_TOP)* UNITS_PER_INCH /CM_PER_INCH;
+ nRight = nLeft+nWidth;
+ nBottom = nTop+nHeight;
+ }
+ }
+ }
+}
+
+/**
+ * @descr judge if the graphic format is what we can support: bmp, jpg, wmf, gif, tgf(tif). other format will be filtered to
+ * these formats by Word Pro.
+ * @return sal_True if yes sal_False if not.
+ */
+sal_Bool LwpGraphicObject::IsGrafFormatValid()
+{
+ if ((m_sServerContextFormat[1]=='b'&& m_sServerContextFormat[2]=='m' && m_sServerContextFormat[3]=='p')
+ || (m_sServerContextFormat[1]=='j' && m_sServerContextFormat[2]=='p' && m_sServerContextFormat[3]=='g')
+ || (m_sServerContextFormat[1]=='w' && m_sServerContextFormat[2]=='m' && m_sServerContextFormat[3]=='f')
+ || (m_sServerContextFormat[1]=='g' && m_sServerContextFormat[2]=='i' && m_sServerContextFormat[3]=='f')
+ || (m_sServerContextFormat[1]=='t' && m_sServerContextFormat[2]=='g' && m_sServerContextFormat[3]=='f')
+ || (m_sServerContextFormat[1]=='p' && m_sServerContextFormat[2]=='n' && m_sServerContextFormat[3]=='g')
+ || (m_sServerContextFormat[1]=='e' && m_sServerContextFormat[2]=='p' && m_sServerContextFormat[3]=='s'))
+ {
+ return sal_True;
+ }
+ else
+ {
+ return sal_False;
+ }
+}
+
+/**
+ * @descr create drawing object and image object.
+ */
+void LwpGraphicObject::RegisterStyle()
+{
+ if (m_sServerContextFormat[1]=='s'&&m_sServerContextFormat[2]=='d'&&m_sServerContextFormat[3]=='w')
+ {
+ this->CreateDrawObjects();
+ }
+ // test codes for importing pictures
+ else if(this->IsGrafFormatValid())
+ {
+ this->CreateGrafObject();
+ }
+/* if (m_sServerContextFormat[1]=='s'&&m_sServerContextFormat[2]=='d'&&m_sServerContextFormat[3]=='w')
+ {
+ LwpSvStream* pStream = m_pStrm;
+ //test code
+ OpenStormBento::LtcBenContainer* pBentoContainer;
+ ULONG ulRet = OpenStormBento::BenOpenContainer(pStream, &pBentoContainer);
+ std::vector<SvStream*> vStream;
+ std::vector<SvStream*>::iterator iter;
+ pBentoContainer->CreateGraphicStreams(&vStream);
+ for (iter=vStream.begin();iter!=vStream.end();iter++)
+ {
+ LwpSdwFileLoader fileLoader(*iter);
+ fileLoader.RegisterStyle();
+ delete *iter;
+ }
+ vStream.clear();
+
+ }*/
+ if (m_sServerContextFormat[1]=='l'&&m_sServerContextFormat[2]=='c'&&m_sServerContextFormat[3]=='h')
+ {
+ LwpVirtualLayout* pMyLayout = GetLayout(NULL);
+ if(pMyLayout->IsFrame())
+ {
+ XFFrameStyle* pXFFrameStyle = new XFFrameStyle();
+ pXFFrameStyle->SetXPosType(enumXFFrameXPosFromLeft, enumXFFrameXRelFrame);
+ pXFFrameStyle->SetYPosType(enumXFFrameYPosFromTop, enumXFFrameYRelPara);
+ XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
+ m_strStyleName = pXFStyleManager->AddStyle(pXFFrameStyle)->GetStyleName();
+ }
+ }
+
+}
+
+// add by , 03/25/2005
+/**
+ * @descr create drawing object.
+ */
+void LwpGraphicObject::CreateDrawObjects()
+{
+ // if small file, use the compressed stream for BENTO
+ LwpSvStream* pStream = m_pStrm->GetCompressedStream() ? m_pStrm->GetCompressedStream(): m_pStrm;
+
+ OpenStormBento::LtcBenContainer* pBentoContainer;
+ /*ULONG ulRet =*/ OpenStormBento::BenOpenContainer(pStream, &pBentoContainer);
+ SvStream* pDrawObjStream = NULL;
+
+ // get graphic object's bento objet name
+ LwpObjectID* pMyID = this->GetObjectID();
+ std::string aGrfObjName;
+ this->GetBentoNamebyID(pMyID, aGrfObjName);
+
+ // get bento stream by the name
+ pBentoContainer->CreateGraphicStream(pDrawObjStream, aGrfObjName.c_str());
+ if (pDrawObjStream)
+ {
+ LwpSdwFileLoader fileLoader(pDrawObjStream, this);
+ fileLoader.CreateDrawObjects(&m_vXFDrawObjects);
+
+ delete pDrawObjStream;
+ pDrawObjStream = NULL;
+ }
+}
+
+/**
+ * @descr create drawing object.
+ */
+void LwpGraphicObject::GetBentoNamebyID(LwpObjectID* pMyID, std::string& rName)
+{
+ sal_uInt16 nHigh = pMyID->GetHigh();
+ sal_uInt16 nLow = pMyID->GetLow();
+ char pTempStr[32];
+ rName = std::string("Gr");
+ sprintf(pTempStr, "%X,%X", nHigh, nLow);
+ rName.append(pTempStr);
+}
+
+/**
+ * @descr get the image data read from bento stream according to the VO_GRAPHIC ID.
+ * @param pGrafData the array to store the image data. the pointer need to be deleted outside.
+ * @return the length of the image data.
+ */
+sal_uInt32 LwpGraphicObject::GetRawGrafData(sal_uInt8*& pGrafData)
+{
+ // create graphic object
+ // if small file, use the compressed stream for BENTO
+ LwpSvStream* pStream = m_pStrm->GetCompressedStream() ? m_pStrm->GetCompressedStream(): m_pStrm;
+
+ OpenStormBento::LtcBenContainer* pBentoContainer;
+ /*ULONG ulRet =*/ OpenStormBento::BenOpenContainer(pStream, &pBentoContainer);
+ SvStream* pGrafStream = NULL;
+
+ // get graphic object's bento objet name
+ LwpObjectID* pMyID = this->GetObjectID();
+ std::string aGrfObjName;
+ this->GetBentoNamebyID(pMyID, aGrfObjName);
+
+ // get bento stream by the name
+ pBentoContainer->CreateGraphicStream(pGrafStream, aGrfObjName.c_str());
+ SvMemoryStream* pMemGrafStream = static_cast<SvMemoryStream*>(pGrafStream);
+
+ if (pMemGrafStream)
+ {
+ // read image data
+ sal_uInt32 nDataLen = pMemGrafStream->GetEndOfData();
+ pGrafData = new sal_uInt8 [nDataLen];
+ pMemGrafStream->Read(pGrafData, nDataLen);
+
+ delete pMemGrafStream;
+ pMemGrafStream = NULL;
+
+ return nDataLen;
+ }
+
+ return 0;
+}
+
+/**
+ * @descr get the image data (only -D dara) read from bento stream according to the VO_GRAPHIC ID.
+ * @param pGrafData the array to store the image data. the pointer need to be deleted outside.
+ * @return the length of the image data.
+ */
+sal_uInt32 LwpGraphicObject::GetGrafData(sal_uInt8*& pGrafData)
+{
+ // create graphic object
+ // if small file, use the compressed stream for BENTO
+ LwpSvStream* pStream = m_pStrm->GetCompressedStream() ? m_pStrm->GetCompressedStream(): m_pStrm;
+
+ OpenStormBento::LtcBenContainer* pBentoContainer;
+ /*ULONG ulRet =*/ OpenStormBento::BenOpenContainer(pStream, &pBentoContainer);
+
+ SvStream* pGrafStream = NULL;
+
+ // get graphic object's bento objet name
+ LwpObjectID* pMyID = this->GetObjectID();
+ std::string aGrfObjName;
+ this->GetBentoNamebyID(pMyID, aGrfObjName);
+
+ char sDName[64]="";
+ sprintf(sDName, "%s-D", aGrfObjName.c_str());
+
+ // get bento stream by the name
+ pGrafStream = pBentoContainer->FindValueStreamWithPropertyName(sDName);
+
+ SvMemoryStream* pMemGrafStream = static_cast<SvMemoryStream*>(pGrafStream);
+
+ if (pMemGrafStream)
+ {
+ // read image data
+ UINT32 nPos = pGrafStream->Tell();
+ pGrafStream->Seek(STREAM_SEEK_TO_END);
+ sal_uInt32 nDataLen = pGrafStream->Tell();
+ pGrafStream->Seek(nPos);
+
+ pGrafData = new sal_uInt8 [nDataLen];
+ pMemGrafStream->Read(pGrafData, nDataLen);
+
+ delete pMemGrafStream;
+ pMemGrafStream = NULL;
+
+ return nDataLen;
+ }
+
+ return 0;
+}
+
+
+/**
+ * @descr create xf-image object and save it in the container: m_vXFDrawObjects.
+ */
+void LwpGraphicObject::CreateGrafObject()
+{
+
+ XFImage* pImage = new XFImage();
+
+ // set image processing styles
+ XFImageStyle* pImageStyle = new XFImageStyle();
+ if (m_sServerContextFormat[1]!='w' || m_sServerContextFormat[2]!='m' || m_sServerContextFormat[3]!='f')
+ {
+ if (m_aIPData.nBrightness != 50)
+ {
+ sal_Int32 nSODCBrightness = (sal_Int32)m_aIPData.nBrightness*2 - 100;
+ pImageStyle->SetBrightness(nSODCBrightness);
+ }
+ if (m_aIPData.nContrast != 50)
+ {
+ //sal_Int32 nSODCContrast = (sal_Int32)m_aIPData.nContrast*2 - 100;
+ //lwp [0, 100] map to sodc [80, -80]
+ sal_Int32 nSODCContrast = (sal_Int32)(80 - (double)m_aIPData.nContrast*1.6);
+ pImageStyle->SetContrast(nSODCContrast);
+ }
+ }
+
+ // set scale and crop styles
+ LwpAssociatedLayouts* pLayoutWithMe = GetLayoutsWithMe();
+ LwpFrameLayout* pMyFrameLayout =
+ static_cast<LwpFrameLayout*>(pLayoutWithMe->GetOnlyLayout()->obj(VO_FRAMELAYOUT));
+ if (pMyFrameLayout)
+ {
+ LwpLayoutScale* pMyScale = pMyFrameLayout->GetLayoutScale();
+ LwpLayoutGeometry* pFrameGeo = pMyFrameLayout->GetGeometry();
+
+ // original image size
+ double fOrgGrafWidth = (double)m_Cache.Width/TWIPS_PER_CM;
+ double fOrgGrafHeight = (double)m_Cache.Height/TWIPS_PER_CM;
+
+ // get margin values
+ double fLeftMargin = pMyFrameLayout->GetMarginsValue(MARGIN_LEFT);
+ double fRightMargin = pMyFrameLayout->GetMarginsValue(MARGIN_RIGHT);
+ double fTopMargin = pMyFrameLayout->GetMarginsValue(MARGIN_TOP);
+ double fBottomMargin = pMyFrameLayout->GetMarginsValue(MARGIN_BOTTOM);
+
+ if (pMyScale && pFrameGeo)
+ {
+ // frame size
+ double fFrameWidth = LwpTools::ConvertFromUnitsToMetric(pFrameGeo->GetWidth());
+ double fFrameHeight = LwpTools::ConvertFromUnitsToMetric(pFrameGeo->GetHeight());
+
+ // calculate the displayed size of the frame
+ double fDisFrameWidth = fFrameWidth - (fLeftMargin+fRightMargin);
+ double fDisFrameHeight = fFrameHeight - (fTopMargin+fBottomMargin);
+
+ // scaled image size
+ double fSclGrafWidth = fOrgGrafWidth;//LwpTools::ConvertFromUnitsToMetric(pMyScale->GetScaleWidth());
+ double fSclGrafHeight = fOrgGrafHeight;//LwpTools::ConvertFromUnitsToMetric(pMyScale->GetScaleHeight());
+
+ // get scale mode
+ sal_uInt16 nScalemode = pMyScale->GetScaleMode();
+ if (nScalemode & LwpLayoutScale::CUSTOM)
+ {
+ fSclGrafWidth = LwpTools::ConvertFromUnitsToMetric(pMyScale->GetScaleWidth());
+ fSclGrafHeight = LwpTools::ConvertFromUnitsToMetric(pMyScale->GetScaleHeight());
+ }
+ else if (nScalemode & LwpLayoutScale::PERCENTAGE)
+ {
+ double fScalePercentage = (double)pMyScale->GetScalePercentage() / 1000;
+ fSclGrafWidth = fScalePercentage * fOrgGrafWidth;
+ fSclGrafHeight = fScalePercentage * fOrgGrafHeight;
+ }
+ else if (nScalemode & LwpLayoutScale::FIT_IN_FRAME)
+ {
+ if (pMyFrameLayout->IsFitGraphic())
+ {
+ fSclGrafWidth = fOrgGrafWidth;
+ fSclGrafHeight = fOrgGrafHeight;
+ }
+ else if (nScalemode & LwpLayoutScale::MAINTAIN_ASPECT_RATIO)
+ {
+ if (fOrgGrafWidth/fOrgGrafHeight >= fDisFrameWidth/fDisFrameHeight)
+ {
+ fSclGrafWidth = fDisFrameWidth;
+ fSclGrafHeight = (fDisFrameWidth/fOrgGrafWidth) * fOrgGrafHeight;
+ }
+ else
+ {
+ fSclGrafHeight = fDisFrameHeight;
+ fSclGrafWidth = (fDisFrameHeight/fOrgGrafHeight) * fOrgGrafWidth;
+ }
+ }
+ else
+ {
+ fSclGrafWidth = fDisFrameWidth;
+ fSclGrafHeight = fDisFrameHeight;
+ }
+ }
+
+ // scaled ratio
+ double fXRatio = fSclGrafWidth / fOrgGrafWidth;
+ double fYRatio = fSclGrafHeight / fOrgGrafHeight;
+
+ // set image to scaled size.
+ pImage->SetWidth(fSclGrafWidth);
+ pImage->SetHeight(fSclGrafHeight);
+
+ // placement:centered or tiled. tiled style is not supported so it's processed together with centered.
+ if (pMyFrameLayout->GetScaleCenter() || pMyFrameLayout->GetScaleTile())
+ {
+ // set center alignment
+ pImageStyle->SetXPosType(enumXFFrameXPosCenter, enumXFFrameXRelFrame);
+ pImageStyle->SetYPosType(enumXFFrameYPosMiddle, enumXFFrameYRelFrame);
+
+ // need horizontal crop?
+ double fClipWidth = 0;
+ double fClipHeight = 0;
+ sal_Bool sal_bCropped = sal_False;
+ if (fSclGrafWidth > fDisFrameWidth)
+ {
+ fClipWidth = (fSclGrafWidth-fDisFrameWidth ) / 2 / fXRatio;
+ sal_bCropped = sal_True;
+ }
+
+ // need vertical crop?
+ if (fSclGrafHeight > fDisFrameHeight)
+ {
+ fClipHeight = (fSclGrafHeight-fDisFrameHeight ) / 2 / fYRatio;
+ sal_bCropped = sal_True;
+ }
+
+ if (sal_bCropped)
+ {
+ pImageStyle->SetClip(fClipWidth, fClipWidth, fClipHeight, fClipHeight);
+ pImage->SetWidth(fDisFrameWidth);
+ pImage->SetHeight(fDisFrameHeight);
+ }
+ }
+ // placement:automatic
+ else
+ {
+ // set left-top alignment
+// pImageStyle->SetXPosType(enumXFFrameXPosLeft, enumXFFrameXRelFrame);
+// pImageStyle->SetYPosType(enumXFFrameYPosTop, enumXFFrameYRelFrame);
+ pImageStyle->SetYPosType(enumXFFrameYPosFromTop, enumXFFrameYRelFrame);
+ pImageStyle->SetXPosType(enumXFFrameXPosFromLeft, enumXFFrameXRelFrame);
+
+ // get image position offset
+ LwpPoint* pOffset = pMyScale->GetOffset();
+ double fOffsetX = LwpTools::ConvertFromUnitsToMetric(pOffset->GetX());
+ double fOffsetY = LwpTools::ConvertFromUnitsToMetric(pOffset->GetY());
+
+ struct LwpRect
+ {
+ double fLeft;
+ double fRight;
+ double fTop;
+ double fBottom;
+
+ LwpRect()
+ {
+ fLeft = 0.00;
+ fRight = 0.00;
+ fTop = 0.00;
+ fBottom = 0.00;
+ }
+ LwpRect(double fL, double fR, double fT, double fB)
+ {
+ fLeft = fL;
+ fRight = fR;
+ fTop = fT;
+ fBottom = fB;
+ }
+ };
+ LwpRect aFrameRect(-fOffsetX, (fDisFrameWidth-fOffsetX), (-fOffsetY), ((fDisFrameHeight-fOffsetY)));
+ LwpRect aImageRect(0, fSclGrafWidth, 0, fSclGrafHeight);
+ LwpRect aCropRect;
+
+ if (aFrameRect.fRight <= aImageRect.fLeft || aFrameRect.fLeft >= aImageRect.fRight
+ ||aFrameRect.fBottom <= aImageRect.fTop|| aFrameRect.fTop >= aImageRect.fBottom)
+ {
+ // display blank
+ }
+ else// need cropped
+ {
+ // horizontal crop
+ if (aFrameRect.fLeft > aImageRect.fLeft)
+ {
+ aCropRect.fLeft = (aFrameRect.fLeft - aImageRect.fLeft) / fXRatio;
+ }
+
+ if (aFrameRect.fRight < aImageRect.fRight)
+ {
+ aCropRect.fRight = (aImageRect.fRight - aFrameRect.fRight) / fXRatio;
+ }
+
+ // vertical crop
+ if (aFrameRect.fTop > aImageRect.fTop)
+ {
+ aCropRect.fTop = (aFrameRect.fTop - aImageRect.fTop) / fYRatio;
+ }
+ if (aFrameRect.fBottom < aImageRect.fBottom)
+ {
+ aCropRect.fBottom = (aImageRect.fBottom - aFrameRect.fBottom) / fYRatio;
+ }
+
+ pImageStyle->SetClip(aCropRect.fLeft, aCropRect.fRight, aCropRect.fTop, aCropRect.fBottom);
+ double fPicWidth = fSclGrafWidth - (aCropRect.fLeft+aCropRect.fRight)*fXRatio;
+ double fPicHeight = fSclGrafHeight- (aCropRect.fTop+aCropRect.fBottom)*fYRatio;
+ double fX = fOffsetX > 0 ? fOffsetX : 0.00;
+ double fY = fOffsetY > 0 ? fOffsetY : 0.00;
+ pImage->SetPosition((fX+fLeftMargin), (fY+fTopMargin), fPicWidth, fPicHeight);
+ }
+ }
+ }
+ }
+
+ // set style for the image
+ XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
+ pImage->SetStyleName(pXFStyleManager->AddStyle(pImageStyle)->GetStyleName());
+
+ // set archor to frame
+ pImage->SetAnchorType(enumXFAnchorFrame);
+// pImage->SetAnchorType(enumXFAnchorPara);//enumXFAnchorFrame);
+
+ // set object name
+ LwpAtomHolder* pHolder = this->GetName();
+ if ( pHolder && pHolder->str().getLength() )
+ {
+ pImage->SetName(pHolder->str());
+ }
+
+ // insert image object into array
+ m_vXFDrawObjects.push_back(pImage);
+
+}
+// end add
+
+/**
+ * @descr Reserve the equation text in a note in the context.
+ */
+void LwpGraphicObject::XFConvertEquation(XFContentContainer * pCont)
+{
+ sal_uInt8* pGrafData = NULL;
+ sal_uInt32 nDataLen = this->GetGrafData(pGrafData);
+ if(pGrafData)
+ {
+ //convert equation
+ XFParagraph* pXFPara = new XFParagraph;
+ pXFPara->Add(A2OUSTR("Formula:"));
+ //add notes
+ XFAnnotation* pXFNote = new XFAnnotation;
+ //add equation to comment notes
+ XFParagraph* pXFNotePara = new XFParagraph;
+ //equation header text: Times New Roman,
+ // 18,12,0,0,0,0,0.
+ // .TCIformat{2}
+ //total head length = 45
+ sal_uInt32 nBegin = 45;
+ sal_uInt32 nEnd = nDataLen -1;
+ sal_uInt32 nIndex = 0;
+
+ if(pGrafData[nEnd] == '$' && pGrafData[nEnd-1]!= '\\')
+ {
+ //equation body is contained by '$';
+ nBegin++;
+ nEnd--;
+ }
+
+ if(nEnd >= nBegin)
+ {
+ sal_uInt8* pEquData = new sal_uInt8[nEnd - nBegin + 1];
+ for(nIndex = 0; nIndex < nEnd - nBegin +1 ; nIndex++)
+ {
+ pEquData[nIndex] = pGrafData[nBegin + nIndex];
+ }
+ pXFNotePara->Add(rtl::OUString((sal_Char*)pEquData, (nEnd - nBegin + 1), gsl_getSystemTextEncoding()));
+ delete [] pEquData;
+ }
+ pXFNote->Add(pXFNotePara);
+
+ pXFPara->Add(pXFNote);
+ pCont->Add(pXFPara);
+
+ delete [] pGrafData;
+ pGrafData = NULL;
+ }
+
+}
+
+void LwpGraphicObject::GetGrafOrgSize(double & rWidth, double & rHeight)
+{
+ // original image size
+ rWidth = (double)m_Cache.Width/TWIPS_PER_CM;
+ rHeight = (double)m_Cache.Height/TWIPS_PER_CM;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */