1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include <rtl/math.hxx>
22 #include <osl/endian.h>
23 #include <vcl/graph.hxx>
24 #include <tools/poly.hxx>
25 #include <vcl/graphicfilter.hxx>
26 #include "sgffilt.hxx"
27 #include "sgfbram.hxx"
28 #include "sgvmain.hxx"
29 #include "sgvspln.hxx"
30 #include <unotools/ucbstreamhelper.hxx>
32 #define SWAPPOINT(p) { \
33 p.x=OSL_SWAPWORD(p.x); \
34 p.y=OSL_SWAPWORD(p.y); }
36 #define SWAPPAGE(p) { \
37 p.Next =OSL_SWAPDWORD (p.Next ); \
38 p.nList =OSL_SWAPDWORD (p.nList ); \
39 p.ListEnd=OSL_SWAPDWORD (p.ListEnd); \
40 p.Paper.Size.x=OSL_SWAPWORD(p.Paper.Size.x); \
41 p.Paper.Size.y=OSL_SWAPWORD(p.Paper.Size.y); \
42 p.Paper.RandL =OSL_SWAPWORD(p.Paper.RandL ); \
43 p.Paper.RandR =OSL_SWAPWORD(p.Paper.RandR ); \
44 p.Paper.RandO =OSL_SWAPWORD(p.Paper.RandO ); \
45 p.Paper.RandU =OSL_SWAPWORD(p.Paper.RandU ); \
48 for (iTemp=0;iTemp<20;iTemp++) { \
49 rPage.HlpLnH[iTemp]=OSL_SWAPWORD(rPage.HlpLnH[iTemp]); \
50 rPage.HlpLnV[iTemp]=OSL_SWAPWORD(rPage.HlpLnV[iTemp]); }}
52 #define SWAPOBJK(o) { \
53 o.Last =OSL_SWAPDWORD (o.Last ); \
54 o.Next =OSL_SWAPDWORD (o.Next ); \
55 o.MemSize =OSL_SWAPWORD(o.MemSize ); \
56 SWAPPOINT(o.ObjMin); \
57 SWAPPOINT(o.ObjMax); }
59 #define SWAPLINE(l) { \
60 l.LMSize=OSL_SWAPWORD(l.LMSize); \
61 l.LDicke=OSL_SWAPWORD(l.LDicke); }
63 #define SWAPAREA(a) { \
64 a.FDummy2=OSL_SWAPWORD(a.FDummy2); \
65 a.FMuster=OSL_SWAPWORD(a.FMuster); }
67 #define SWAPTEXT(t) { \
70 t.FontLo =OSL_SWAPWORD(t.FontLo ); \
71 t.FontHi =OSL_SWAPWORD(t.FontHi ); \
72 t.Grad =OSL_SWAPWORD(t.Grad ); \
73 t.Breite =OSL_SWAPWORD(t.Breite ); \
74 t.Schnitt=OSL_SWAPWORD(t.Schnitt); \
75 t.LnFeed =OSL_SWAPWORD(t.LnFeed ); \
76 t.Slant =OSL_SWAPWORD(t.Slant ); \
79 SWAPPOINT(t.ShdVers); \
83 ////////////////////////////////////////////////////////////////////////////////////////////////////
87 // - Flaechenmuster werden den unter StarView verfuegbaren Mustern angenaehert.
88 // - Linienenden werden unter StarView immer rund dargestellt und gehen ueber
89 // den Endpunkt der Linie hinaus.
90 // - Linienmuster werden den unter StarView verfuegbaren Mustern angenaehert.
91 // Transparent/Opak wird zur Zeit noch nicht beruecksichtigt.
92 // - Keine gedrehten Ellipsen
97 ////////////////////////////////////////////////////////////////////////////////////////////////////
99 ////////////////////////////////////////////////////////////////////////////////////////////////////
100 // Fuer Fontuebersetzung ///////////////////////////////////////////////////////////////////////////
101 ////////////////////////////////////////////////////////////////////////////////////////////////////
102 SgfFontLst
* pSgfFonts
= 0;
104 ////////////////////////////////////////////////////////////////////////////////////////////////////
105 // Fuer Kreisunterarten, Text und gedrehte Rechtecke ///////////////////////////////////////////////
106 ////////////////////////////////////////////////////////////////////////////////////////////////////
107 void RotatePoint(PointType
& P
, sal_Int16 cx
, sal_Int16 cy
, double sn
, double cs
)
115 P
.x
=cx
+sal_Int16(x1
);
116 P
.y
=cy
+sal_Int16(y1
);
119 void RotatePoint(Point
& P
, sal_Int16 cx
, sal_Int16 cy
, double sn
, double cs
)
123 dx
=(sal_Int16
)(P
.X()-cx
);
124 dy
=(sal_Int16
)(P
.Y()-cy
);
127 P
=Point(cx
+sal_Int16(x1
),cy
+sal_Int16(y1
));
130 sal_Int16
iMulDiv(sal_Int16 a
, sal_Int16 Mul
, sal_Int16 Div
)
133 Temp
=sal_Int32(a
)*sal_Int32(Mul
)/sal_Int32(Div
);
134 return sal_Int16(Temp
);
137 sal_uInt16
MulDiv(sal_uInt16 a
, sal_uInt16 Mul
, sal_uInt16 Div
)
140 Temp
=sal_uInt32(a
)*sal_uInt32(Mul
)/sal_uInt32(Div
);
141 return sal_uInt16(Temp
);
144 ////////////////////////////////////////////////////////////////////////////////////////////////////
145 // SgfFilterSDrw ///////////////////////////////////////////////////////////////////////////////////
146 ////////////////////////////////////////////////////////////////////////////////////////////////////
148 SvStream
& operator>>(SvStream
& rIStream
, DtHdType
& rDtHd
)
150 rIStream
.Read((char*)&rDtHd
.Reserved
[0],DtHdSize
);
154 void DtHdOverSeek(SvStream
& rInp
)
156 sal_uLong FPos
=rInp
.Tell();
157 FPos
+=(sal_uLong
)DtHdSize
;
162 SvStream
& operator>>(SvStream
& rIStream
, PageType
& rPage
)
164 rIStream
.Read((char*)&rPage
.Next
,PageSize
);
165 #if defined OSL_BIGENDIAN
171 void ObjkOverSeek(SvStream
& rInp
, ObjkType
& rObjk
)
174 Siz
=(sal_uLong
)rObjk
.MemSize
+rObjk
.Last
; // ObjSize+ObjAnhSize
175 rInp
.Seek(rInp
.Tell()+Siz
);
178 SvStream
& operator>>(SvStream
& rInp
, ObjkType
& rObjk
)
179 { // Die Fileposition im Stream bleibt unveraendert!
182 rInp
.Read((char*)&rObjk
.Last
,ObjkSize
);
183 #if defined OSL_BIGENDIAN
187 sal_uLong nPos1
=rInp
.Tell();
188 if(nPos
== nPos1
) InfoBox( NULL
, "tellg funkt nich" ).Execute();
192 if (rInp
.Tell() != nPos
) InfoBox( NULL
, "seekg funkt nich" ).Execute();
196 SvStream
& operator>>(SvStream
& rInp
, StrkType
& rStrk
)
198 rInp
.Read((char*)&rStrk
.Last
,StrkSize
);
199 #if defined OSL_BIGENDIAN
202 SWAPPOINT(rStrk
.Pos1
);
203 SWAPPOINT(rStrk
.Pos2
);
207 SvStream
& operator>>(SvStream
& rInp
, RectType
& rRect
)
209 rInp
.Read((char*)&rRect
.Last
,RectSize
);
210 #if defined OSL_BIGENDIAN
214 SWAPPOINT(rRect
.Pos1
);
215 SWAPPOINT(rRect
.Pos2
);
216 rRect
.Radius
=OSL_SWAPWORD(rRect
.Radius
);
217 rRect
.DrehWink
=OSL_SWAPWORD(rRect
.DrehWink
);
218 rRect
.Slant
=OSL_SWAPWORD(rRect
.Slant
);
222 SvStream
& operator>>(SvStream
& rInp
, PolyType
& rPoly
)
224 rInp
.Read((char*)&rPoly
.Last
,PolySize
);
225 #if defined OSL_BIGENDIAN
232 SvStream
& operator>>(SvStream
& rInp
, SplnType
& rSpln
)
234 rInp
.Read((char*)&rSpln
.Last
,SplnSize
);
235 #if defined OSL_BIGENDIAN
242 SvStream
& operator>>(SvStream
& rInp
, CircType
& rCirc
)
244 rInp
.Read((char*)&rCirc
.Last
,CircSize
);
245 #if defined OSL_BIGENDIAN
249 SWAPPOINT(rCirc
.Radius
);
250 SWAPPOINT(rCirc
.Center
);
251 rCirc
.DrehWink
=OSL_SWAPWORD(rCirc
.DrehWink
);
252 rCirc
.StartWink
=OSL_SWAPWORD(rCirc
.StartWink
);
253 rCirc
.RelWink
=OSL_SWAPWORD(rCirc
.RelWink
);
257 SvStream
& operator>>(SvStream
& rInp
, TextType
& rText
)
259 rInp
.Read((char*)&rText
.Last
,TextSize
);
260 #if defined OSL_BIGENDIAN
263 SWAPPOINT(rText
.Pos1
);
264 SWAPPOINT(rText
.Pos2
);
265 rText
.TopOfs
=OSL_SWAPWORD(rText
.TopOfs
);
266 rText
.DrehWink
=OSL_SWAPWORD(rText
.DrehWink
);
267 rText
.BoxSlant
=OSL_SWAPWORD(rText
.BoxSlant
);
268 rText
.BufSize
=OSL_SWAPWORD(rText
.BufSize
);
269 SWAPPOINT(rText
.FitSize
);
270 rText
.FitBreit
=OSL_SWAPWORD(rText
.FitBreit
);
275 SvStream
& operator>>(SvStream
& rInp
, BmapType
& rBmap
)
277 rInp
.Read((char*)&rBmap
.Last
,BmapSize
);
278 #if defined OSL_BIGENDIAN
281 SWAPPOINT(rBmap
.Pos1
);
282 SWAPPOINT(rBmap
.Pos2
);
283 rBmap
.DrehWink
=OSL_SWAPWORD(rBmap
.DrehWink
);
284 rBmap
.Slant
=OSL_SWAPWORD(rBmap
.Slant
);
285 SWAPPOINT(rBmap
.PixSize
);
289 SvStream
& operator>>(SvStream
& rInp
, GrupType
& rGrup
)
291 rInp
.Read((char*)&rGrup
.Last
,GrupSize
);
292 #if defined OSL_BIGENDIAN
294 rGrup
.SbLo
=OSL_SWAPWORD(rGrup
.SbLo
);
295 rGrup
.SbHi
=OSL_SWAPWORD(rGrup
.SbHi
);
296 rGrup
.UpLo
=OSL_SWAPWORD(rGrup
.UpLo
);
297 rGrup
.UpHi
=OSL_SWAPWORD(rGrup
.UpHi
);
298 rGrup
.ChartSize
=OSL_SWAPWORD(rGrup
.ChartSize
);
299 rGrup
.ChartPtr
=OSL_SWAPDWORD (rGrup
.ChartPtr
);
306 /*************************************************************************
310 *************************************************************************/
311 Color
Sgv2SvFarbe(sal_uInt8 nFrb1
, sal_uInt8 nFrb2
, sal_uInt8 nInts
)
313 sal_uInt16 r1
=0,g1
=0,b1
=0,r2
=0,g2
=0,b2
=0;
314 sal_uInt8 nInt2
=100-nInts
;
315 switch(nFrb1
& 0x07) {
316 case 0: r1
=0xFF; g1
=0xFF; b1
=0xFF; break;
317 case 1: r1
=0xFF; g1
=0xFF; break;
318 case 2: g1
=0xFF; b1
=0xFF; break;
319 case 3: g1
=0xFF; break;
320 case 4: r1
=0xFF; b1
=0xFF; break;
321 case 5: r1
=0xFF; break;
322 case 6: b1
=0xFF; break;
325 switch(nFrb2
& 0x07) {
326 case 0: r2
=0xFF; g2
=0xFF; b2
=0xFF; break;
327 case 1: r2
=0xFF; g2
=0xFF; break;
328 case 2: g2
=0xFF; b2
=0xFF; break;
329 case 3: g2
=0xFF; break;
330 case 4: r2
=0xFF; b2
=0xFF; break;
331 case 5: r2
=0xFF; break;
332 case 6: b2
=0xFF; break;
335 r1
=(sal_uInt16
)((sal_uInt32
)r1
*nInts
/100+(sal_uInt32
)r2
*nInt2
/100);
336 g1
=(sal_uInt16
)((sal_uInt32
)g1
*nInts
/100+(sal_uInt32
)g2
*nInt2
/100);
337 b1
=(sal_uInt16
)((sal_uInt32
)b1
*nInts
/100+(sal_uInt32
)b2
*nInt2
/100);
338 Color
aColor( (sal_uInt8
)r1
, (sal_uInt8
)g1
, (sal_uInt8
)b1
);
342 void SetLine(ObjLineType
& rLine
, OutputDevice
& rOut
)
344 if( 0 == ( rLine
.LMuster
& 0x07 ) )
347 rOut
.SetLineColor( Sgv2SvFarbe(rLine
.LFarbe
,rLine
.LBFarbe
,rLine
.LIntens
) );
350 void SetArea(ObjAreaType
& rArea
, OutputDevice
& rOut
)
352 if( 0 == ( rArea
.FMuster
& 0x00FF ) )
355 rOut
.SetFillColor( Sgv2SvFarbe( rArea
.FFarbe
,rArea
.FBFarbe
,rArea
.FIntens
) );
358 /*************************************************************************
360 |* ObjkType::DrawObjekt()
362 *************************************************************************/
363 void ObjkType::Draw(OutputDevice
&)
367 void Obj0Type::Draw(OutputDevice
&) {}
369 /*************************************************************************
371 |* StrkType::DrawObjekt()
373 *************************************************************************/
374 void StrkType::Draw(OutputDevice
& rOut
)
377 rOut
.DrawLine(Point(Pos1
.x
,Pos1
.y
),Point(Pos2
.x
,Pos2
.y
)); // !!!
380 /*************************************************************************
382 |* RectType::DrawObjekt()
384 *************************************************************************/
385 void SgfAreaColorIntens(sal_uInt16 Muster
, sal_uInt8 Col1
, sal_uInt8 Col2
, sal_uInt8 Int
, OutputDevice
& rOut
)
395 void DrawSlideRect(sal_Int16 x1
, sal_Int16 y1
, sal_Int16 x2
, sal_Int16 y2
, ObjAreaType
& F
, OutputDevice
& rOut
)
400 // ClipMerk: HgdClipRec;
406 if (x1
>x2
) { i
=x1
; x1
=x2
; x2
=i
; }
407 if (y1
>y2
) { i
=y1
; y1
=y2
; y2
=i
; }
408 Col1
=F
.FBFarbe
& 0x87; Col2
=F
.FFarbe
& 0x87;
409 Int1
=100-F
.FIntens
; Int2
=F
.FIntens
;
411 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int2
,rOut
);
412 rOut
.DrawRect(Rectangle(x1
,y1
,x2
,y2
));
415 switch (F
.FBFarbe
& 0x38) {
416 case 0x08: { // vertikal
420 b
=Int1
+sal_Int16((sal_Int32
)(Int2
-Int1
)*(sal_Int32
)(i
-y1
) /(sal_Int32
)(y2
-y1
+1));
422 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)b0
,rOut
);
423 rOut
.DrawRect(Rectangle(x1
,i0
,x2
,i
-1));
428 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int2
,rOut
);
429 rOut
.DrawRect(Rectangle(x1
,i0
,x2
,y2
));
431 case 0x28: { // horizontal
435 b
=Int1
+sal_Int16((sal_Int32
)(Int2
-Int1
)*(sal_Int32
)(i
-x1
) /(sal_Int32
)(x2
-x1
+1));
437 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)b0
,rOut
);
438 rOut
.DrawRect(Rectangle(i0
,y1
,i
-1,y2
));
443 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int2
,rOut
);
444 rOut
.DrawRect(Rectangle(i0
,y1
,x2
,y2
));
447 case 0x18: case 0x38: { // Kreis
448 Region ClipMerk
=rOut
.GetClipRegion();
451 rOut
.SetClipRegion(Region(Rectangle(x1
,y1
,x2
,y2
)));
456 a
=sqrt((double)(dx
*dx
+dy
*dy
));
457 MaxR
=sal_Int16(a
) /2 +1;
459 i0
=MaxR
; if (MaxR
<1) MaxR
=1;
462 b
=Int1
+sal_Int16((sal_Int32(Int2
-Int1
)*sal_Int32(i
)) /sal_Int32(MaxR
));
464 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)b0
,rOut
);
465 rOut
.DrawEllipse(Rectangle(cx
-i0
,cy
-i0
,cx
+i0
,cy
+i0
));
470 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int1
,rOut
);
471 rOut
.DrawEllipse(Rectangle(cx
-i0
,cy
-i0
,cx
+i0
,cy
+i0
));
472 rOut
.SetClipRegion(ClipMerk
);
479 void RectType::Draw(OutputDevice
& rOut
)
481 if (L
.LMuster
!=0) L
.LMuster
=1; // keine Linienmuster hier, nur an oder aus
484 if ((F
.FBFarbe
& 0x38)==0 || Radius
!=0) {
486 rOut
.DrawRect(Rectangle(Pos1
.x
,Pos1
.y
,Pos2
.x
,Pos2
.y
),Radius
,Radius
);
488 DrawSlideRect(Pos1
.x
,Pos1
.y
,Pos2
.x
,Pos2
.y
,F
,rOut
);
492 rOut
.DrawRect(Rectangle(Pos1
.x
,Pos1
.y
,Pos2
.x
,Pos2
.y
));
499 sn
=sin(double(DrehWink
)*3.14159265359/18000);
500 cs
=cos(double(DrehWink
)*3.14159265359/18000);
501 aPts
[0]=Point(Pos1
.x
,Pos1
.y
);
502 aPts
[1]=Point(Pos2
.x
,Pos1
.y
);
503 aPts
[2]=Point(Pos2
.x
,Pos2
.y
);
504 aPts
[3]=Point(Pos1
.x
,Pos2
.y
);
506 RotatePoint(aPts
[i
],Pos1
.x
,Pos1
.y
,sn
,cs
);
509 Polygon
aPoly(4,aPts
);
510 rOut
.DrawPolygon(aPoly
);
514 /*************************************************************************
518 *************************************************************************/
519 void PolyType::Draw(OutputDevice
& rOut
)
521 if ((Flags
& PolyClosBit
) !=0) SetArea(F
,rOut
);
523 Polygon
aPoly(nPoints
);
525 for(i
=0;i
<nPoints
;i
++) aPoly
.SetPoint(Point(EckP
[i
].x
,EckP
[i
].y
),i
);
526 if ((Flags
& PolyClosBit
) !=0) {
527 rOut
.DrawPolygon(aPoly
);
529 rOut
.DrawPolyLine(aPoly
);
533 /*************************************************************************
537 *************************************************************************/
538 void SplnType::Draw(OutputDevice
& rOut
)
540 if ((Flags
& PolyClosBit
) !=0) SetArea(F
,rOut
);
543 Polygon
aSpln(nPoints
);
545 for(i
=0;i
<nPoints
;i
++) aSpln
.SetPoint(Point(EckP
[i
].x
,EckP
[i
].y
),i
);
546 if ((Flags
& PolyClosBit
) !=0) {
547 Spline2Poly(aSpln
,sal_True
,aPoly
);
548 if (aPoly
.GetSize()>0) rOut
.DrawPolygon(aPoly
);
550 Spline2Poly(aSpln
,sal_False
,aPoly
);
551 if (aPoly
.GetSize()>0) rOut
.DrawPolyLine(aPoly
);
555 /*************************************************************************
559 *************************************************************************/
560 void DrawSlideCirc(sal_Int16 cx
, sal_Int16 cy
, sal_Int16 rx
, sal_Int16 ry
, ObjAreaType
& F
, OutputDevice
& rOut
)
572 Col1
=F
.FBFarbe
& 0x87; Col2
=F
.FFarbe
& 0x87;
573 Int1
=100-F
.FIntens
; Int2
=F
.FIntens
;
575 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int2
,rOut
);
576 rOut
.DrawEllipse(Rectangle(x1
,y1
,x2
,y2
));
579 switch (F
.FBFarbe
& 0x38) {
580 case 0x08: { // vertikal
581 Region ClipMerk
=rOut
.GetClipRegion();
585 b
=Int1
+sal_Int16((sal_Int32
)(Int2
-Int1
)*(sal_Int32
)(i
-y1
) /(sal_Int32
)(y2
-y1
+1));
587 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)b0
,rOut
);
588 rOut
.SetClipRegion(Rectangle(x1
,i0
,x2
,i
-1));
589 rOut
.DrawEllipse(Rectangle(x1
,y1
,x2
,y2
));
594 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int2
,rOut
);
595 rOut
.SetClipRegion(Rectangle(x1
,i0
,x2
,y2
));
596 rOut
.DrawEllipse(Rectangle(x1
,y1
,x2
,y2
));
597 rOut
.SetClipRegion(ClipMerk
);
599 case 0x28: { // horizontal
600 Region ClipMerk
=rOut
.GetClipRegion();
604 b
=Int1
+sal_Int16((sal_Int32
)(Int2
-Int1
)*(sal_Int32
)(i
-x1
) /(sal_Int32
)(x2
-x1
+1));
606 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)b0
,rOut
);
607 rOut
.SetClipRegion(Rectangle(i0
,y1
,i
-1,y2
));
608 rOut
.DrawEllipse(Rectangle(x1
,y1
,x2
,y2
));
613 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int2
,rOut
);
614 rOut
.SetClipRegion(Rectangle(i0
,y1
,x2
,y2
));
615 rOut
.DrawEllipse(Rectangle(x1
,y1
,x2
,y2
));
616 rOut
.SetClipRegion(ClipMerk
);
619 case 0x18: case 0x38: { // Kreis
626 i0
=MaxR
; if (MaxR
<1) MaxR
=1;
629 b
=Int1
+sal_Int16((sal_Int32(Int2
-Int1
)*sal_Int32(i
)) /sal_Int32(MaxR
));
631 sal_Int32 temp
=sal_Int32(i0
)*sal_Int32(ry
)/sal_Int32(rx
);
632 sal_Int16 j0
=sal_Int16(temp
);
633 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)b0
,rOut
);
634 rOut
.DrawEllipse(Rectangle(cx
-i0
,cy
-j0
,cx
+i0
,cy
+j0
));
639 SgfAreaColorIntens(F
.FMuster
,(sal_uInt8
)Col1
,(sal_uInt8
)Col2
,(sal_uInt8
)Int1
,rOut
);
640 rOut
.DrawEllipse(Rectangle(cx
-i0
,cy
-i0
,cx
+i0
,cy
+i0
));
647 void CircType::Draw(OutputDevice
& rOut
)
649 Rectangle
aRect(Center
.x
-Radius
.x
,Center
.y
-Radius
.y
,Center
.x
+Radius
.x
,Center
.y
+Radius
.y
);
651 if (L
.LMuster
!=0) L
.LMuster
=1; // keine Linienmuster hier, nur an oder aus
653 if ((Flags
& 0x03)==CircFull
) {
654 if ((F
.FBFarbe
& 0x38)==0) {
656 rOut
.DrawEllipse(aRect
);
658 DrawSlideCirc(Center
.x
,Center
.y
,Radius
.x
,Radius
.y
,F
,rOut
);
662 rOut
.DrawEllipse(aRect
);
670 a
.x
=Center
.x
+Radius
.x
; a
.y
=Center
.y
; b
=a
;
671 sn
=sin(double(StartWink
)*3.14159265359/18000);
672 cs
=cos(double(StartWink
)*3.14159265359/18000);
673 RotatePoint(a
,Center
.x
,Center
.y
,sn
,cs
);
674 sn
=sin(double(StartWink
+RelWink
)*3.14159265359/18000);
675 cs
=cos(double(StartWink
+RelWink
)*3.14159265359/18000);
676 RotatePoint(b
,Center
.x
,Center
.y
,sn
,cs
);
677 if (Radius
.x
!=Radius
.y
) {
678 if (Radius
.x
<1) Radius
.x
=1;
679 if (Radius
.y
<1) Radius
.y
=1;
680 a
.y
= a
.y
- Center
.y
;
681 b
.y
= b
.y
- Center
.y
;
682 a
.y
=iMulDiv(a
.y
,Radius
.y
,Radius
.x
);
683 b
.y
=iMulDiv(b
.y
,Radius
.y
,Radius
.x
);
684 a
.y
= a
.y
+ Center
.y
;
685 b
.y
= b
.y
+ Center
.y
;
687 aStrt
=Point(a
.x
,a
.y
);
688 aEnde
=Point(b
.x
,b
.y
);
690 switch (Flags
& 0x03) {
691 case CircArc
: rOut
.DrawArc(aRect
,aEnde
,aStrt
); break;
693 case CircAbsn
: rOut
.DrawPie(aRect
,aEnde
,aStrt
); break;
698 /*************************************************************************
702 *************************************************************************/
704 void BmapType::Draw(OutputDevice
& rOut
)
707 unsigned char nSgfTyp
;
710 reinterpret_cast< char const * >(&Filename
[ 1 ]),
711 (xub_StrLen
)Filename
[ 0 ], RTL_TEXTENCODING_UTF8
);
712 INetURLObject
aFNam( aStr
);
714 SvStream
* pInp
= ::utl::UcbStreamHelper::CreateStream( aFNam
.GetMainURL( INetURLObject::NO_DECODE
), STREAM_READ
);
717 nSgfTyp
=CheckSgfTyp( *pInp
,nVersion
);
722 aFlt
.ImportGraphic(aGrf
,aFNam
);
723 aGrf
.Draw(&rOut
,Point(Pos1
.x
,Pos1
.y
),Size(Pos2
.x
-Pos1
.x
,Pos2
.y
-Pos1
.y
));
729 SgfVectXmul
=Pos2
.x
-Pos1
.x
;
730 SgfVectYmul
=Pos2
.y
-Pos1
.y
;
733 SgfVectScal
=sal_True
;
734 SgfVectFilter(*pInp
,aMtf
);
741 SgfVectScal
=sal_False
;
750 /*************************************************************************
754 *************************************************************************/
755 sal_uInt32
GrupType::GetSubPtr()
757 return sal_uInt32(SbLo
)+0x00010000*sal_uInt32(SbHi
);
760 /*************************************************************************
764 *************************************************************************/
765 void DrawObjkList( SvStream
& rInp
, OutputDevice
& rOut
)
768 sal_uInt16 nGrpCnt
=0;
769 sal_Bool bEnde
=sal_False
;
772 if (!rInp
.GetError()) {
774 case ObjStrk
: { StrkType aStrk
; rInp
>>aStrk
; if (!rInp
.GetError()) aStrk
.Draw(rOut
); } break;
775 case ObjRect
: { RectType aRect
; rInp
>>aRect
; if (!rInp
.GetError()) aRect
.Draw(rOut
); } break;
776 case ObjCirc
: { CircType aCirc
; rInp
>>aCirc
; if (!rInp
.GetError()) aCirc
.Draw(rOut
); } break;
780 if (!rInp
.GetError()) {
781 aText
.Buffer
=new UCHAR
[aText
.BufSize
+1]; // Ein mehr fuer LookAhead bei CK-Trennung
782 rInp
.Read((char* )aText
.Buffer
,aText
.BufSize
);
783 if (!rInp
.GetError()) aText
.Draw(rOut
);
784 delete[] aText
.Buffer
;
790 if (!rInp
.GetError()) {
797 if (!rInp
.GetError()) {
798 aPoly
.EckP
=new PointType
[aPoly
.nPoints
];
799 rInp
.Read((char*)aPoly
.EckP
,4*aPoly
.nPoints
);
800 #if defined OSL_BIGENDIAN
801 for(short i
=0;i
<aPoly
.nPoints
;i
++) SWAPPOINT(aPoly
.EckP
[i
]);
803 if (!rInp
.GetError()) aPoly
.Draw(rOut
);
810 if (!rInp
.GetError()) {
811 aSpln
.EckP
=new PointType
[aSpln
.nPoints
];
812 rInp
.Read((char*)aSpln
.EckP
,4*aSpln
.nPoints
);
813 #if defined OSL_BIGENDIAN
814 for(short i
=0;i
<aSpln
.nPoints
;i
++) SWAPPOINT(aSpln
.EckP
[i
]);
816 if (!rInp
.GetError()) aSpln
.Draw(rOut
);
823 if (!rInp
.GetError()) {
824 rInp
.Seek(rInp
.Tell()+aGrup
.Last
); // Obj-Anhaengsel
825 if(aGrup
.GetSubPtr()!=0L) nGrpCnt
++;// DrawObjkList(rInp,rOut );
829 aObjk
.Draw(rOut
); // Objektbezeichnung auf 2. Screen
830 ObjkOverSeek(rInp
,aObjk
); // zum naechsten Objekt
834 if (!rInp
.GetError()) {
835 if (aObjk
.Next
==0L) {
836 if (nGrpCnt
==0) bEnde
=sal_True
;
840 bEnde
=sal_True
; // Lesefehler
845 /*************************************************************************
849 *************************************************************************/
850 void SkipObjkList(SvStream
& rInp
)
856 if(aObjk
.Art
==ObjGrup
) {
859 rInp
.Seek(rInp
.Tell()+aGrup
.Last
); // Obj-Anhaengsel
860 if(aGrup
.GetSubPtr()!=0L) SkipObjkList(rInp
);
862 ObjkOverSeek(rInp
,aObjk
); // zum naechsten Objekt
864 } while (aObjk
.Next
!=0L && !rInp
.GetError());
867 /*************************************************************************
871 *************************************************************************/
872 sal_Bool
SgfFilterSDrw( SvStream
& rInp
, SgfHeader
&, SgfEntry
&, GDIMetaFile
& rMtf
)
874 sal_Bool bRet
= sal_False
;
876 VirtualDevice aOutDev
;
877 OutputDevice
* pOutDev
;
883 DtHdOverSeek(rInp
); // DataHeader weglesen
886 do { // Standardseiten weglesen
888 if (aPage
.nList
!=0) SkipObjkList(rInp
);
889 } while (aPage
.Next
!=0L && !rInp
.GetError());
891 // ShowMsg("Zeichnungseite(n)\n");
895 rMtf
.Record(pOutDev
);
899 while(Num
>1 && aPage
.Next
!=0L && !rInp
.GetError()) { // Standardseite suchen
901 if (aPage
.nList
!=0) SkipObjkList(rInp
);
905 if(Num
==1 && aPage
.nList
!=0L) DrawObjkList( rInp
,*pOutDev
);
910 if (aPage
.nList
!=0L) DrawObjkList(rInp
,*pOutDev
);
914 MapMode
aMap(MAP_10TH_MM
,Point(),Fraction(1,4),Fraction(1,4));
915 rMtf
.SetPrefMapMode(aMap
);
916 rMtf
.SetPrefSize(Size((sal_Int16
)aPage
.Paper
.Size
.x
,(sal_Int16
)aPage
.Paper
.Size
.y
));
923 /*************************************************************************
927 *************************************************************************/
928 sal_Bool
SgfSDrwFilter(SvStream
& rInp
, GDIMetaFile
& rMtf
, INetURLObject aIniPath
)
930 #if OSL_DEBUG_LEVEL > 1 // Recordgroessen checken. Neuer Compiler hat vielleichte anderes Alignment!
931 if (sizeof(ObjTextType
)!=ObjTextTypeSize
) return sal_False
;
934 sal_uLong nFileStart
; // Offset des SgfHeaders. Im allgemeinen 0.
938 sal_Bool bRdFlag
=sal_False
; // Grafikentry gelesen ?
939 sal_Bool bRet
=sal_False
; // Returncode
941 aIniPath
.Append(rtl::OUString("sgf.ini"));
943 pSgfFonts
= new SgfFontLst
;
945 pSgfFonts
->AssignFN( aIniPath
.GetMainURL( INetURLObject::NO_DECODE
) );
946 nFileStart
=rInp
.Tell();
948 if (aHead
.ChkMagic() && aHead
.Typ
==SgfStarDraw
&& aHead
.Version
==SGV_VERSION
) {
949 nNext
=aHead
.GetOffset();
950 while (nNext
&& !bRdFlag
&& !rInp
.GetError()) {
951 rInp
.Seek(nFileStart
+nNext
);
953 nNext
=aEntr
.GetOffset();
954 if (aEntr
.Typ
==aHead
.Typ
) {
955 bRet
=SgfFilterSDrw( rInp
,aHead
,aEntr
,rMtf
);
959 if (!rInp
.GetError()) bRet
=sal_True
; // Scheinbar Ok
966 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */