xref: /AOO42X/main/sc/source/ui/view/gridmerg.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
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
10cdf0e10cSrcweir  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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 }
168