1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*b3f79822SAndrew Rist * distributed with this work for additional information
6*b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10*b3f79822SAndrew Rist *
11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*b3f79822SAndrew Rist *
13*b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17*b3f79822SAndrew Rist * specific language governing permissions and limitations
18*b3f79822SAndrew Rist * under the License.
19*b3f79822SAndrew Rist *
20*b3f79822SAndrew Rist *************************************************************/
21*b3f79822SAndrew Rist
22*b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <vcl/outdev.hxx>
30cdf0e10cSrcweir
31cdf0e10cSrcweir #include "gridmerg.hxx"
32cdf0e10cSrcweir
33cdf0e10cSrcweir //------------------------------------------------------------------
34cdf0e10cSrcweir
ScGridMerger(OutputDevice * pOutDev,long nOnePixelX,long nOnePixelY)35cdf0e10cSrcweir ScGridMerger::ScGridMerger( OutputDevice* pOutDev, long nOnePixelX, long nOnePixelY ) :
36cdf0e10cSrcweir pDev( pOutDev ),
37cdf0e10cSrcweir nOneX( nOnePixelX ),
38cdf0e10cSrcweir nOneY( nOnePixelY ),
39cdf0e10cSrcweir nCount( 0 ),
40cdf0e10cSrcweir bVertical( sal_False )
41cdf0e10cSrcweir {
42cdf0e10cSrcweir // optimize (DrawGrid) only for pixel MapMode,
43cdf0e10cSrcweir // to avoid rounding errors
44cdf0e10cSrcweir
45cdf0e10cSrcweir bOptimize = ( pDev->GetMapMode().GetMapUnit() == MAP_PIXEL );
46cdf0e10cSrcweir }
47cdf0e10cSrcweir
~ScGridMerger()48cdf0e10cSrcweir ScGridMerger::~ScGridMerger()
49cdf0e10cSrcweir {
50cdf0e10cSrcweir Flush();
51cdf0e10cSrcweir }
52cdf0e10cSrcweir
AddLine(long nStart,long nEnd,long nPos)53cdf0e10cSrcweir void ScGridMerger::AddLine( long nStart, long nEnd, long nPos )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir if ( nCount )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir // not first line - test fix position
58cdf0e10cSrcweir // more than one previous line - test distance
59cdf0e10cSrcweir
60cdf0e10cSrcweir if ( nStart != nFixStart || nEnd != nFixEnd )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir if ( nCount == 1 && nPos == nVarStart &&
63cdf0e10cSrcweir ( nStart == nFixEnd ||
64cdf0e10cSrcweir nStart == nFixEnd + ( bVertical ? nOneY : nOneX ) ) )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir // additional optimization: extend connected lines
67cdf0e10cSrcweir // keep nCount at 1
68cdf0e10cSrcweir nFixEnd = nEnd;
69cdf0e10cSrcweir }
70cdf0e10cSrcweir else
71cdf0e10cSrcweir Flush();
72cdf0e10cSrcweir }
73cdf0e10cSrcweir else if ( nCount == 1 )
74cdf0e10cSrcweir {
75cdf0e10cSrcweir nVarDiff = nPos - nVarStart;
76cdf0e10cSrcweir ++nCount;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir else if ( nPos != nVarStart + nCount * nVarDiff ) //! keep VarEnd?
79cdf0e10cSrcweir Flush();
80cdf0e10cSrcweir else
81cdf0e10cSrcweir ++nCount;
82cdf0e10cSrcweir }
83cdf0e10cSrcweir
84cdf0e10cSrcweir if ( !nCount )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir // first line (or flushed above) - just store
87cdf0e10cSrcweir
88cdf0e10cSrcweir nFixStart = nStart;
89cdf0e10cSrcweir nFixEnd = nEnd;
90cdf0e10cSrcweir nVarStart = nPos;
91cdf0e10cSrcweir nVarDiff = 0;
92cdf0e10cSrcweir nCount = 1;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir }
95cdf0e10cSrcweir
AddHorLine(long nX1,long nX2,long nY)96cdf0e10cSrcweir void ScGridMerger::AddHorLine( long nX1, long nX2, long nY )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir if ( bOptimize )
99cdf0e10cSrcweir {
100cdf0e10cSrcweir if ( bVertical )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir Flush();
103cdf0e10cSrcweir bVertical = sal_False;
104cdf0e10cSrcweir }
105cdf0e10cSrcweir AddLine( nX1, nX2, nY );
106cdf0e10cSrcweir }
107cdf0e10cSrcweir else
108cdf0e10cSrcweir pDev->DrawLine( Point( nX1, nY ), Point( nX2, nY ) );
109cdf0e10cSrcweir }
110cdf0e10cSrcweir
AddVerLine(long nX,long nY1,long nY2)111cdf0e10cSrcweir void ScGridMerger::AddVerLine( long nX, long nY1, long nY2 )
112cdf0e10cSrcweir {
113cdf0e10cSrcweir if ( bOptimize )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir if ( !bVertical )
116cdf0e10cSrcweir {
117cdf0e10cSrcweir Flush();
118cdf0e10cSrcweir bVertical = sal_True;
119cdf0e10cSrcweir }
120cdf0e10cSrcweir AddLine( nY1, nY2, nX );
121cdf0e10cSrcweir }
122cdf0e10cSrcweir else
123cdf0e10cSrcweir pDev->DrawLine( Point( nX, nY1 ), Point( nX, nY2 ) );
124cdf0e10cSrcweir }
125cdf0e10cSrcweir
Flush()126cdf0e10cSrcweir void ScGridMerger::Flush()
127cdf0e10cSrcweir {
128cdf0e10cSrcweir if (nCount)
129cdf0e10cSrcweir {
130cdf0e10cSrcweir if (bVertical)
131cdf0e10cSrcweir {
132cdf0e10cSrcweir if ( nCount == 1 )
133cdf0e10cSrcweir pDev->DrawLine( Point( nVarStart, nFixStart ), Point( nVarStart, nFixEnd ) );
134cdf0e10cSrcweir else
135cdf0e10cSrcweir {
136cdf0e10cSrcweir long nVarEnd = nVarStart + ( nCount - 1 ) * nVarDiff;
137cdf0e10cSrcweir if ( nVarDiff < 0 )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir // nVarDiff is negative in RTL layout mode
140cdf0e10cSrcweir // Change the positions so DrawGrid is called with a positive distance
141cdf0e10cSrcweir // (nVarStart / nVarDiff can be modified, aren't used after Flush)
142cdf0e10cSrcweir
143cdf0e10cSrcweir nVarDiff = -nVarDiff;
144cdf0e10cSrcweir long nTemp = nVarStart;
145cdf0e10cSrcweir nVarStart = nVarEnd;
146cdf0e10cSrcweir nVarEnd = nTemp;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir pDev->DrawGrid( Rectangle( nVarStart, nFixStart, nVarEnd, nFixEnd ),
149cdf0e10cSrcweir Size( nVarDiff, nFixEnd - nFixStart ),
150cdf0e10cSrcweir GRID_VERTLINES );
151cdf0e10cSrcweir }
152cdf0e10cSrcweir }
153cdf0e10cSrcweir else
154cdf0e10cSrcweir {
155cdf0e10cSrcweir if ( nCount == 1 )
156cdf0e10cSrcweir pDev->DrawLine( Point( nFixStart, nVarStart ), Point( nFixEnd, nVarStart ) );
157cdf0e10cSrcweir else
158cdf0e10cSrcweir {
159cdf0e10cSrcweir long nVarEnd = nVarStart + ( nCount - 1 ) * nVarDiff;
160cdf0e10cSrcweir pDev->DrawGrid( Rectangle( nFixStart, nVarStart, nFixEnd, nVarEnd ),
161cdf0e10cSrcweir Size( nFixEnd - nFixStart, nVarDiff ),
162cdf0e10cSrcweir GRID_HORZLINES );
163cdf0e10cSrcweir }
164cdf0e10cSrcweir }
165cdf0e10cSrcweir nCount = 0;
166cdf0e10cSrcweir }
167cdf0e10cSrcweir }
168cdf0e10cSrcweir
169cdf0e10cSrcweir
170cdf0e10cSrcweir
171