1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: wmfwr.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
34 #include <tools/bigint.hxx>
35 #include <tools/debug.hxx>
36 #include <vcl/metaact.hxx>
37 #include <vcl/graph.hxx>
38 #include <vcl/gdimtf.hxx>
39 #include <vcl/virdev.hxx>
40 #include <svtools/fltcall.hxx>
42 // -----------------------------------------------------------------------------
44 #define MAXOBJECTHANDLES 16
46 // -----------------------------------------------------------------------------
48 struct WMFWriterAttrStackMember
50 struct WMFWriterAttrStackMember
* pSucc
;
67 class StarSymbolToMSMultiFont
;
74 ULONG nLastPercent
; // Mit welcher Zahl pCallback zuletzt aufgerufen wurde.
75 FilterConfigItem
* pFilterConfigItem
;
77 com::sun::star::uno::Reference
< com::sun::star::task::XStatusIndicator
> xStatusIndicator
;
80 VirtualDevice
* pVirDev
;
81 StarSymbolToMSMultiFont
*pConvert
;
82 MapMode aTargetMapMode
;
84 USHORT nTargetDivisor
;
86 ULONG nMetafileHeaderPos
;
87 sal_uInt32 nMaxRecordSize
; // in Worten
90 // Aktuelle Attribute im Quell-Metafile:
94 LineInfo aSrcLineInfo
;
95 RasterOp eSrcRasterOp
;
96 FontAlign eSrcTextAlign
;
100 Region aSrcClipRegion
;
101 WMFWriterAttrStackMember
* pAttrStack
;
103 UINT32 eSrcHorTextAlign
;
105 // Aktuelle Attribute im Ziel-Metafile:
109 LineInfo aDstLineInfo
;
111 FontAlign eDstTextAlign
;
114 UINT32 eDstHorTextAlign
;
116 BOOL bDstIsClipping
; // ???: derzeit unberuecksichtigt
117 Region aDstClipRegion
; // ???: derzeit unberuecksichtigt
118 BOOL bHandleAllocated
[MAXOBJECTHANDLES
]; // Welche Handles vergeben sind
119 USHORT nDstPenHandle
,nDstFontHandle
,nDstBrushHandle
; // Welche Handles die jeweiligen
120 // Selected-Objects besitzen
123 // Damit nicht bei jeder Operation alle Attribute verglichen werden muessen:
125 ULONG nNumberOfActions
; // Anzahl der Actions im GDIMetafile
126 ULONG nNumberOfBitmaps
; // Anzahl der Bitmaps
127 ULONG nWrittenActions
; // Anzahl der bereits verarbeiteten Actions beim Schreiben der Orders
128 ULONG nWrittenBitmaps
; // Anzahl der bereits geschriebenen Bitmaps
129 ULONG nActBitmapPercent
; // Wieviel Prozent die naechste Bitmap schon geschrieben ist.
132 // Berechnet anhand der obigen 5 Parameter eine Prozentzahl
133 // und macht dann ggf. einen Callback. Setzt bStatus auf FALSE wenn User abbrechen
136 void CountActionsAndBitmaps(const GDIMetaFile
& rMTF
);
137 // Zaehlt die Bitmaps und Actions (nNumberOfActions und nNumberOfBitmaps muessen
138 // zu Anfang auf 0 gesetzt werden, weil diese Methode rekursiv ist)
140 void WritePointXY(const Point
& rPoint
);
141 void WritePointYX(const Point
& rPoint
);
142 sal_Int32
ScaleWidth( sal_Int32 nDX
);
143 void WriteSize(const Size
& rSize
);
144 void WriteHeightWidth(const Size
& rSize
);
145 void WriteRectangle(const Rectangle
& rRect
);
146 void WriteColor(const Color
& rColor
);
148 void WriteRecordHeader(sal_uInt32 nSizeWords
, sal_uInt16 nType
);
149 // nSizeWords ist die Groesse des gesammten Records in Anzahl Worte.
150 // Wenn nSizeWords unbekannt ist, dann 0 einsetzen (siehe UpdateRecordHeader()).
152 void UpdateRecordHeader();
153 // berichtig die Groesse des Records nach dem Schreiben der Parameter, wenn
154 // nSizeWords bei Aufruf von WriteRecordHeader(..) unbekannt war.
155 // fuegt ggf. noch ein BYTE 0 ein damit Anzahl Bytes immer gerade.
157 void WMFRecord_Arc(const Rectangle
& rRect
, const Point
& rStartPt
, const Point
& rEndPt
);
158 void WMFRecord_Chord(const Rectangle
& rRect
, const Point
& rStartPt
, const Point
& rEndPt
);
159 void WMFRecord_CreateBrushIndirect(const Color
& rColor
);
160 void WMFRecord_CreateFontIndirect(const Font
& rFont
);
161 void WMFRecord_CreatePenIndirect(const Color
& rColor
, const LineInfo
& rLineInfo
);
162 void WMFRecord_DeleteObject(USHORT nObjectHandle
);
163 void WMFRecord_Ellipse(const Rectangle
& rRect
);
164 void WMFRecord_Escape( sal_uInt32 nEsc
, sal_uInt32 nLen
, const sal_Int8
* pData
);
165 sal_Bool
WMFRecord_Escape_Unicode( const Point
& rPoint
, const String
& rStr
, const sal_Int32
* pDXAry
);
166 void WMFRecord_ExtTextOut(const Point
& rPoint
, const String
& rString
, const sal_Int32
* pDXAry
);
168 void TrueExtTextOut(const Point
& rPoint
, const String
& rString
,
169 const ByteString
& rByteString
, const sal_Int32
* pDXAry
);
170 void TrueTextOut(const Point
& rPoint
, const ByteString
& rString
);
171 void WMFRecord_LineTo(const Point
& rPoint
);
172 void WMFRecord_MoveTo(const Point
& rPoint
);
173 void WMFRecord_Pie(const Rectangle
& rRect
, const Point
& rStartPt
, const Point
& rEndPt
);
174 void WMFRecord_Polygon(const Polygon
& rPoly
);
175 void WMFRecord_PolyLine(const Polygon
& rPoly
);
176 void WMFRecord_PolyPolygon(const PolyPolygon
& rPolyPoly
);
177 void WMFRecord_Rectangle(const Rectangle
& rRect
);
178 void WMFRecord_RestoreDC();
179 void WMFRecord_RoundRect(const Rectangle
& rRect
, long nHorzRound
, long nVertRound
);
180 void WMFRecord_SaveDC();
181 void WMFRecord_SelectObject(USHORT nObjectHandle
);
182 void WMFRecord_SetBkColor(const Color
& rColor
);
183 void WMFRecord_SetBkMode(BOOL bTransparent
);
184 void WMFRecord_SetStretchBltMode();
185 void WMFRecord_SetPixel(const Point
& rPoint
, const Color
& rColor
);
186 void WMFRecord_SetROP2(RasterOp eROP
);
187 void WMFRecord_SetTextAlign(FontAlign eFontAlign
, UINT32 eHorTextAlign
);
188 void WMFRecord_SetTextColor(const Color
& rColor
);
189 void WMFRecord_SetWindowExt(const Size
& rSize
);
190 void WMFRecord_SetWindowOrg(const Point
& rPoint
);
191 void WMFRecord_StretchDIB(const Point
& rPoint
, const Size
& rSize
, const Bitmap
& rBitmap
, sal_uInt32 nROP
= 0UL );
192 void WMFRecord_TextOut(const Point
& rPoint
, const String
& rString
);
193 void WMFRecord_EndOfFile();
194 void WMFRecord_IntersectClipRect( const Rectangle
& rRect
);
196 USHORT
AllocHandle();
197 void FreeHandle(USHORT nObjectHandle
);
198 void CreateSelectDeletePen( const Color
& rColor
, const LineInfo
& rLineInfo
);
199 void CreateSelectDeleteFont(const Font
& rFont
);
200 void CreateSelectDeleteBrush(const Color
& rColor
);
202 void SetLineAndFillAttr();
205 void WriteRecords(const GDIMetaFile
& rMTF
);
207 void WriteHeader(const GDIMetaFile
& rMTF
, BOOL bPlaceable
);
210 USHORT
CalcSaveTargetMapMode(MapMode
& rMapMode
, const Size
& rPrefSize
);
216 BOOL
WriteWMF(const GDIMetaFile
& rMTF
, SvStream
& rTargetStream
, FilterConfigItem
* pFilterConfigItem
, BOOL bPlaceable
=TRUE
);