blob: 8307c80c423b33100eaca6ab1d52302e10de475d [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_filter.hxx"
#include <string.h>
#include <dxfreprd.hxx>
//------------------DXFBoundingBox--------------------------------------------
void DXFBoundingBox::Union(const DXFVector & rVector)
{
if (bEmpty==sal_True) {
fMinX=rVector.fx;
fMinY=rVector.fy;
fMinZ=rVector.fz;
fMaxX=rVector.fx;
fMaxY=rVector.fy;
fMaxZ=rVector.fz;
bEmpty=sal_False;
}
else {
if (fMinX>rVector.fx) fMinX=rVector.fx;
if (fMinY>rVector.fy) fMinY=rVector.fy;
if (fMinZ>rVector.fz) fMinZ=rVector.fz;
if (fMaxX<rVector.fx) fMaxX=rVector.fx;
if (fMaxY<rVector.fy) fMaxY=rVector.fy;
if (fMaxZ<rVector.fz) fMaxZ=rVector.fz;
}
}
//------------------DXFPalette------------------------------------------------
DXFPalette::DXFPalette()
{
short i,j,nHue,nNSat,nVal,nC[3],nmax,nmed,nmin;
sal_uInt8 nV;
pRed =new sal_uInt8[256];
pGreen=new sal_uInt8[256];
pBlue =new sal_uInt8[256];
// Farben 0 - 9 (normale Farben)
SetColor(0, 0x00, 0x00, 0x00); // eigentlich nie benutzt
SetColor(1, 0xff, 0x00, 0x00);
SetColor(2, 0xff, 0xff, 0x00);
SetColor(3, 0x00, 0xff, 0x00);
SetColor(4, 0x00, 0xff, 0xff);
SetColor(5, 0x00, 0x00, 0xff);
SetColor(6, 0xff, 0x00, 0xff);
SetColor(7, 0x0f, 0x0f, 0x0f); // eigentlich weiss ???
SetColor(8, 0x80, 0x80, 0x80);
SetColor(9, 0xc0, 0xc0, 0xc0);
// Farben 10 - 249
// (Universal-Palette: 24 Farbtoene * 5 Helligkeiten * 2 Saettigungen )
i=10;
for (nHue=0; nHue<24; nHue++) {
for (nVal=5; nVal>=1; nVal--) {
for (nNSat=0; nNSat<2; nNSat++) {
nmax=((nHue+3)>>3)%3;
j=nHue-(nmax<<3); if (j>4) j=j-24;
if (j>=0) {
nmed=(nmax+1)%3;
nmin=(nmax+2)%3;
}
else {
nmed=(nmax+2)%3;
nmin=(nmax+1)%3;
j=-j;
}
nC[nmin]=0;
nC[nmed]=255*j/4;
nC[nmax]=255;
if (nNSat!=0) {
for (j=0; j<3; j++) nC[j]=(nC[j]>>1)+128;
}
for (j=0; j<3; j++) nC[j]=nC[j]*nVal/5;
SetColor((sal_uInt8)(i++),(sal_uInt8)nC[0],(sal_uInt8)nC[1],(sal_uInt8)nC[2]);
}
}
}
// Farben 250 - 255 (Grautoenne)
for (i=0; i<6; i++) {
nV=(sal_uInt8)(i*38+65);
SetColor((sal_uInt8)(250+i),nV,nV,nV);
}
}
DXFPalette::~DXFPalette()
{
delete[] pBlue;
delete[] pGreen;
delete[] pRed;
}
void DXFPalette::SetColor(sal_uInt8 nIndex, sal_uInt8 nRed, sal_uInt8 nGreen, sal_uInt8 nBlue)
{
pRed[nIndex]=nRed;
pGreen[nIndex]=nGreen;
pBlue[nIndex]=nBlue;
}
//------------------DXFRepresentation-----------------------------------------
DXFRepresentation::DXFRepresentation()
{
setTextEncoding(RTL_TEXTENCODING_IBM_437);
setGlobalLineTypeScale(1.0);
}
DXFRepresentation::~DXFRepresentation()
{
}
sal_Bool DXFRepresentation::Read( SvStream & rIStream, sal_uInt16 nMinPercent, sal_uInt16 nMaxPercent)
{
DXFGroupReader * pDGR;
sal_Bool bRes;
aTables.Clear();
aBlocks.Clear();
aEntities.Clear();
pDGR = new DXFGroupReader( rIStream, nMinPercent, nMaxPercent );
pDGR->Read();
while (pDGR->GetG()!=0 || strcmp(pDGR->GetS(),"EOF")!=0) {
if (pDGR->GetG()==0 && strcmp(pDGR->GetS(),"SECTION")==0) {
if (pDGR->Read()!=2) {
pDGR->SetError();
break;
}
if (strcmp(pDGR->GetS(),"HEADER" )==0) ReadHeader(*pDGR);
else if (strcmp(pDGR->GetS(),"TABLES" )==0) aTables.Read(*pDGR);
else if (strcmp(pDGR->GetS(),"BLOCKS" )==0) aBlocks.Read(*pDGR);
else if (strcmp(pDGR->GetS(),"ENTITIES")==0) aEntities.Read(*pDGR);
else pDGR->Read();
}
else pDGR->Read();
}
bRes=pDGR->GetStatus();
delete pDGR;
if (bRes==sal_True && aBoundingBox.bEmpty==sal_True)
CalcBoundingBox(aEntities,aBoundingBox);
return bRes;
}
void DXFRepresentation::ReadHeader(DXFGroupReader & rDGR)
{
while (rDGR.GetG()!=0 || (strcmp(rDGR.GetS(),"EOF")!=0 && strcmp(rDGR.GetS(),"ENDSEC")!=0) )
{
if (rDGR.GetG()==9) {
if (strcmp(rDGR.GetS(),"$EXTMIN")==0 ||
strcmp(rDGR.GetS(),"$EXTMAX")==0)
{
DXFVector aVector;
rDGR.SetF(10,0.0);
rDGR.SetF(20,0.0);
rDGR.SetF(30,0.0);
do {
rDGR.Read();
} while (rDGR.GetG()!=9 && rDGR.GetG()!=0);
aVector.fx=rDGR.GetF(10);
aVector.fy=rDGR.GetF(20);
aVector.fz=rDGR.GetF(30);
aBoundingBox.Union(aVector);
} else {
if (strcmp(rDGR.GetS(),"$DWGCODEPAGE")==0)
{
rDGR.Read();
// FIXME: we really need a whole table of
// $DWGCODEPAGE to encodings mappings
if ( (strcmp(rDGR.GetS(),"ANSI_932")==0) ||
(strcmp(rDGR.GetS(),"ansi_932")==0) ||
(strcmp(rDGR.GetS(),"DOS932")==0) ||
(strcmp(rDGR.GetS(),"dos932")==0) )
{
setTextEncoding(RTL_TEXTENCODING_MS_932);
}
}
else if (strcmp(rDGR.GetS(),"$LTSCALE")==0)
{
rDGR.Read();
setGlobalLineTypeScale(getGlobalLineTypeScale() * rDGR.GetF());
}
else rDGR.Read();
}
}
else rDGR.Read();
}
}
void DXFRepresentation::CalcBoundingBox(const DXFEntities & rEntities,
DXFBoundingBox & rBox)
{
DXFBasicEntity * pBE=rEntities.pFirst;
while (pBE!=NULL) {
switch (pBE->eType) {
case DXF_LINE: {
const DXFLineEntity * pE = (DXFLineEntity*)pBE;
rBox.Union(pE->aP0);
rBox.Union(pE->aP1);
break;
}
case DXF_POINT: {
const DXFPointEntity * pE = (DXFPointEntity*)pBE;
rBox.Union(pE->aP0);
break;
}
case DXF_CIRCLE: {
const DXFCircleEntity * pE = (DXFCircleEntity*)pBE;
DXFVector aP;
aP=pE->aP0;
aP.fx-=pE->fRadius;
aP.fy-=pE->fRadius;
rBox.Union(aP);
aP=pE->aP0;
aP.fx+=pE->fRadius;
aP.fy+=pE->fRadius;
rBox.Union(aP);
break;
}
case DXF_ARC: {
const DXFArcEntity * pE = (DXFArcEntity*)pBE;
DXFVector aP;
aP=pE->aP0;
aP.fx-=pE->fRadius;
aP.fy-=pE->fRadius;
rBox.Union(aP);
aP=pE->aP0;
aP.fx+=pE->fRadius;
aP.fy+=pE->fRadius;
rBox.Union(aP);
break;
}
case DXF_TRACE: {
const DXFTraceEntity * pE = (DXFTraceEntity*)pBE;
rBox.Union(pE->aP0);
rBox.Union(pE->aP1);
rBox.Union(pE->aP2);
rBox.Union(pE->aP3);
break;
}
case DXF_SOLID: {
const DXFSolidEntity * pE = (DXFSolidEntity*)pBE;
rBox.Union(pE->aP0);
rBox.Union(pE->aP1);
rBox.Union(pE->aP2);
rBox.Union(pE->aP3);
break;
}
case DXF_TEXT: {
//const DXFTextEntity * pE = (DXFTextEntity*)pBE;
//???
break;
}
case DXF_SHAPE: {
//const DXFShapeEntity * pE = (DXFShapeEntity*)pBE;
//???
break;
}
case DXF_INSERT: {
const DXFInsertEntity * pE = (DXFInsertEntity*)pBE;
DXFBlock * pB;
DXFBoundingBox aBox;
DXFVector aP;
pB=aBlocks.Search(pE->sName);
if (pB==NULL) break;
CalcBoundingBox(*pB,aBox);
if (aBox.bEmpty==sal_True) break;
aP.fx=(aBox.fMinX-pB->aBasePoint.fx)*pE->fXScale+pE->aP0.fx;
aP.fy=(aBox.fMinY-pB->aBasePoint.fy)*pE->fYScale+pE->aP0.fy;
aP.fz=(aBox.fMinZ-pB->aBasePoint.fz)*pE->fZScale+pE->aP0.fz;
rBox.Union(aP);
aP.fx=(aBox.fMaxX-pB->aBasePoint.fx)*pE->fXScale+pE->aP0.fx;
aP.fy=(aBox.fMaxY-pB->aBasePoint.fy)*pE->fYScale+pE->aP0.fy;
aP.fz=(aBox.fMaxZ-pB->aBasePoint.fz)*pE->fZScale+pE->aP0.fz;
rBox.Union(aP);
break;
}
case DXF_ATTDEF: {
//const DXFAttDefEntity * pE = (DXFAttDefEntity*)pBE;
//???
break;
}
case DXF_ATTRIB: {
//const DXFAttribEntity * pE = (DXFAttribEntity*)pBE;
//???
break;
}
case DXF_VERTEX: {
const DXFVertexEntity * pE = (DXFVertexEntity*)pBE;
rBox.Union(pE->aP0);
break;
}
case DXF_3DFACE: {
const DXF3DFaceEntity * pE = (DXF3DFaceEntity*)pBE;
rBox.Union(pE->aP0);
rBox.Union(pE->aP1);
rBox.Union(pE->aP2);
rBox.Union(pE->aP3);
break;
}
case DXF_DIMENSION: {
const DXFDimensionEntity * pE = (DXFDimensionEntity*)pBE;
DXFBlock * pB;
DXFBoundingBox aBox;
DXFVector aP;
pB=aBlocks.Search(pE->sPseudoBlock);
if (pB==NULL) break;
CalcBoundingBox(*pB,aBox);
if (aBox.bEmpty==sal_True) break;
aP.fx=aBox.fMinX-pB->aBasePoint.fx;
aP.fy=aBox.fMinY-pB->aBasePoint.fy;
aP.fz=aBox.fMinZ-pB->aBasePoint.fz;
rBox.Union(aP);
aP.fx=aBox.fMaxX-pB->aBasePoint.fx;
aP.fy=aBox.fMaxY-pB->aBasePoint.fy;
aP.fz=aBox.fMaxZ-pB->aBasePoint.fz;
rBox.Union(aP);
break;
}
case DXF_POLYLINE: {
//const DXFAttribEntity * pE = (DXFAttribEntity*)pBE;
//???
break;
}
case DXF_SEQEND: {
//const DXFAttribEntity * pE = (DXFAttribEntity*)pBE;
//???
break;
}
case DXF_HATCH :
break;
case DXF_LWPOLYLINE :
break;
}
pBE=pBE->pSucc;
}
}