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