xref: /aoo41x/main/sc/source/ui/view/gridmerg.cxx (revision b3f79822)
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