summaryrefslogtreecommitdiff
path: root/filter/source/graphicfilter/idxf/dxfgrprd.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'filter/source/graphicfilter/idxf/dxfgrprd.cxx')
-rw-r--r--filter/source/graphicfilter/idxf/dxfgrprd.cxx361
1 files changed, 361 insertions, 0 deletions
diff --git a/filter/source/graphicfilter/idxf/dxfgrprd.cxx b/filter/source/graphicfilter/idxf/dxfgrprd.cxx
new file mode 100644
index 000000000000..f09b17e80635
--- /dev/null
+++ b/filter/source/graphicfilter/idxf/dxfgrprd.cxx
@@ -0,0 +1,361 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_filter.hxx"
+
+#include <string.h>
+#include <stdlib.h>
+#include <tools/stream.hxx>
+#include "dxfgrprd.hxx"
+
+// ----------------------------------------------------------------------------
+
+// we use an own ReadLine function, because Stream::ReadLine stops if
+// a 0-sign occurs; this functions converts 0-signs to blanks and reads
+// a complete line until a cr/lf is found
+
+BOOL DXFReadLine( SvStream& rIStm, ByteString& rStr )
+{
+ char buf[256 + 1];
+ BOOL bEnd = FALSE;
+ ULONG nOldFilePos = rIStm.Tell();
+ char c = 0;
+
+ rStr.Erase();
+
+ while( !bEnd && !rIStm.GetError() ) // !!! nicht auf EOF testen,
+ // !!! weil wir blockweise
+ // !!! lesen
+ {
+ USHORT nLen = (USHORT)rIStm.Read( buf, sizeof(buf)-1 );
+ if( !nLen )
+ {
+ if( rStr.Len() == 0 )
+ return FALSE;
+ else
+ break;
+ }
+
+ for( USHORT n = 0; n < nLen ; n++ )
+ {
+ c = buf[n];
+ if( c != '\n' && c != '\r' )
+ {
+ if( !c )
+ c = ' ';
+ rStr += c;
+ }
+ else
+ {
+ bEnd = TRUE;
+ break;
+ }
+ }
+ }
+
+ if( !bEnd && !rIStm.GetError() && rStr.Len() )
+ bEnd = TRUE;
+
+ nOldFilePos += rStr.Len();
+ if( rIStm.Tell() > nOldFilePos )
+ nOldFilePos++;
+ rIStm.Seek( nOldFilePos ); // seeken wg. obigem BlockRead!
+
+ if( bEnd && (c=='\r' || c=='\n')) // Sonderbehandlung DOS-Dateien
+ {
+ char cTemp;
+ rIStm.Read((char*)&cTemp , sizeof(cTemp) );
+ if( cTemp == c || (cTemp != '\n' && cTemp != '\r') )
+ rIStm.Seek( nOldFilePos );
+ }
+
+ return bEnd;
+}
+
+// ------------------
+
+DXFGroupReader::DXFGroupReader(SvStream & rIStream, USHORT nminpercent, USHORT nmaxpercent ) :
+ rIS(rIStream)
+{
+ USHORT i;
+
+ nIBuffPos=0;
+ nIBuffSize=0;
+ bStatus=TRUE;
+ nLastG=0;
+ nGCount=0;
+
+ nMinPercent=(ULONG)nminpercent;
+ nMaxPercent=(ULONG)nmaxpercent;
+ nLastPercent=nMinPercent;
+
+ rIS.Seek(STREAM_SEEK_TO_END);
+ nFileSize=rIS.Tell();
+ rIS.Seek(0);
+
+ for (i=0; i<10; i++) S0_9[i][0]=0;
+ S100[ 0 ] = S102[ 0 ] = 0;
+ for (i=0; i<50; i++) F10_59[i]=0.0;
+ for (i=0; i<20; i++) I60_79[i]=0;
+ for (i=0; i<10; i++) I90_99[i]=0;
+ for (i=0; i< 8; i++) F140_147[i]=0.0;
+ for (i=0; i< 6; i++) I170_175[i]=0;
+ for (i=0; i<30; i++) F210_239[i]=0.0;
+ for (i=0; i<11; i++) S999_1009[i][0]=0;
+ for (i=0; i<50; i++) F1010_1059[i]=0.0;
+ for (i=0; i<20; i++) I1060_1079[i]=0;
+
+}
+
+
+USHORT DXFGroupReader::Read()
+{
+ sal_uInt16 nG = 0;
+ if ( bStatus )
+ {
+ nGCount++;
+ nG = (sal_uInt16)ReadI();
+ if ( bStatus )
+ {
+ char aTmp[ DXF_MAX_STRING_LEN + 1 ];
+
+ if (nG< 10) ReadS(S0_9[nG]);
+ else if (nG< 60) F10_59[nG-10]=ReadF();
+ else if (nG< 80) I60_79[nG-60]=ReadI();
+ else if (nG< 90) ReadS( aTmp );
+ else if (nG< 99) I90_99[nG-90]=ReadI();
+ else if (nG==100) ReadS(S100);
+ else if (nG==102) ReadS(S102);
+ else if (nG==105) ReadS( aTmp );
+ else if (nG< 140) ReadS( aTmp );
+ else if (nG< 148) F140_147[nG-140]=ReadF();
+ else if (nG< 170) ReadS( aTmp );
+ else if (nG< 176) I170_175[nG-175]=ReadI();
+ else if (nG< 180) ReadI();
+ else if (nG< 210) ReadS( aTmp );
+ else if (nG< 240) F210_239[nG-210]=ReadF();
+ else if (nG<=369) ReadS( aTmp );
+ else if (nG< 999) ReadS( aTmp );
+ else if (nG<1010) ReadS(S999_1009[nG-999]);
+ else if (nG<1060) F1010_1059[nG-1010]=ReadF();
+ else if (nG<1080) I1060_1079[nG-1060]=ReadI();
+ else bStatus = sal_False;
+ }
+ }
+ if ( bStatus )
+ nLastG = nG;
+ else
+ {
+ nG = 0;
+ SetS( 0, "EOF" );
+ if ( nGCount != 0xffffffff )
+ {
+ // InfoBox(NULL,String("Fehler ab Gruppe Nr ")+String(nGCount)).Execute();
+ nGCount=0xffffffff;
+ }
+ }
+ nLastG = nG;
+ return nG;
+}
+
+
+long DXFGroupReader::GetI(USHORT nG)
+{
+ sal_Int32 nRetValue = 0;
+ if ( ( nG >= 60 ) && ( nG <= 79 ) )
+ nRetValue = I60_79[ nG - 60 ];
+ else if ( ( nG >= 90 ) && ( nG <= 99 ) )
+ nRetValue = I90_99[ nG - 90 ];
+ else if ( ( nG >= 170 ) && ( nG <= 175 ) )
+ nRetValue = I170_175[ nG - 170 ];
+ else if ( ( nG >= 1060 ) && ( nG <= 1079 ) )
+ nRetValue = I1060_1079[ nG - 1060 ];
+ return nRetValue;
+}
+
+double DXFGroupReader::GetF(USHORT nG)
+{
+ nG-=10;
+ if (nG<50) return F10_59[nG];
+ else {
+ nG-=130;
+ if (nG<8) return F140_147[nG];
+ else {
+ nG-=70;
+ if (nG<30) return F210_239[nG];
+ else {
+ nG-=800;
+ if (nG<50) return F1010_1059[nG];
+ else return 0;
+ }
+ }
+ }
+}
+
+const char * DXFGroupReader::GetS(USHORT nG)
+{
+ if (nG<10) return S0_9[nG];
+ else if ( nG == 100 )
+ return S100;
+ else if ( nG == 102 )
+ return S102;
+ else
+ {
+ nG-=999;
+ if (nG<11) return S999_1009[nG];
+ else return NULL;
+ }
+}
+
+void DXFGroupReader::SetF(USHORT nG, double fF)
+{
+ nG-=10;
+ if (nG<50) F10_59[nG]=fF;
+ else {
+ nG-=130;
+ if (nG<8) F140_147[nG]=fF;
+ else {
+ nG-=70;
+ if (nG<30) F210_239[nG]=fF;
+ else {
+ nG-=800;
+ if (nG<50) F1010_1059[nG]=fF;
+ }
+ }
+ }
+}
+
+
+void DXFGroupReader::SetS(USHORT nG, const char * sS)
+{
+ char* pPtr = NULL;
+ if ( nG < 10 )
+ pPtr = S0_9[ nG ];
+ else if ( nG == 100 )
+ pPtr = S100;
+ else if ( nG == 102 )
+ pPtr = S102;
+ else
+ {
+ nG -= 999;
+ if ( nG < 11 )
+ pPtr = S999_1009[ nG ];
+ }
+ if ( pPtr )
+ strncpy( pPtr, sS, DXF_MAX_STRING_LEN + 1 );
+}
+
+
+void DXFGroupReader::ReadLine(char * ptgt)
+{
+ ByteString aStr;
+ ULONG nLen;
+
+ DXFReadLine( rIS, aStr );
+
+ nLen = aStr.Len();
+ if ( nLen > DXF_MAX_STRING_LEN )
+ nLen = DXF_MAX_STRING_LEN;
+
+ memcpy( ptgt, aStr.GetBuffer(), nLen );
+ ptgt[ nLen ] = 0x00;
+/*
+ if ( pCallback )
+ {
+ const ULONG nPercent= nMinPercent + (nMaxPercent-nMinPercent)*rIS.Tell() / nFileSize;
+
+ if ( nPercent >= nLastPercent + 4 )
+ {
+ nLastPercent=nPercent;
+ if (((*pCallback)(pCallerData,(USHORT)nPercent))==TRUE)
+ bStatus=FALSE;
+ }
+ }
+*/
+}
+
+
+long DXFGroupReader::ReadI()
+{
+ char sl[DXF_MAX_STRING_LEN+1],*p;
+ long res,nv;
+
+ ReadLine(sl);
+
+ p=sl;
+
+ while(*p==0x20) p++;
+
+ if ((*p<'0' || *p>'9') && *p!='-') {
+ bStatus=FALSE;
+ return 0;
+ }
+
+ if (*p=='-') {
+ nv=-1;
+ p++;
+ }
+ else nv=1;
+
+ res=0;
+ do {
+ res=res*10+(long)(*p-'0');
+ p++;
+ } while (*p>='0' && *p<='9');
+
+ while (*p==0x20) p++;
+ if (*p!=0) {
+ bStatus=FALSE;
+ return 0;
+ }
+
+ return res*nv;
+}
+
+
+double DXFGroupReader::ReadF()
+{
+ char sl[DXF_MAX_STRING_LEN+1],*p;
+
+ ReadLine(sl);
+ p=sl;
+ while(*p==0x20) p++;
+ if ((*p<'0' || *p>'9') && *p!='.' && *p!='-') {
+ bStatus=FALSE;
+ return 0.0;
+ }
+ return atof(p);
+}
+
+
+void DXFGroupReader::ReadS(char * ptgt)
+{
+ ReadLine(ptgt);
+}
+
+