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_vcl.hxx" 26 27 #include <tools/ref.hxx> 28 #include <tools/debug.hxx> 29 #include <tools/poly.hxx> 30 31 #include <vcl/metaact.hxx> 32 #include <vcl/gdimtf.hxx> 33 #include <vcl/outdev.hxx> 34 #include <vcl/virdev.hxx> 35 36 #include <salgdi.hxx> 37 #include <svdata.hxx> 38 #include <outdata.hxx> 39 #include <outdev.h> 40 41 // ======================================================================= 42 43 DBG_NAMEEX( OutputDevice ) 44 45 // ======================================================================= 46 47 void OutputDevice::DrawRect( const Rectangle& rRect, 48 sal_uLong nHorzRound, sal_uLong nVertRound ) 49 { 50 DBG_TRACE( "OutputDevice::DrawRoundRect()" ); 51 DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); 52 53 if ( mpMetaFile ) 54 mpMetaFile->AddAction( new MetaRoundRectAction( rRect, nHorzRound, nVertRound ) ); 55 56 if ( !IsDeviceOutputNecessary() || (!mbLineColor && !mbFillColor) || ImplIsRecordLayout() ) 57 return; 58 59 const Rectangle aRect( ImplLogicToDevicePixel( rRect ) ); 60 61 if ( aRect.IsEmpty() ) 62 return; 63 64 nHorzRound = ImplLogicWidthToDevicePixel( nHorzRound ); 65 nVertRound = ImplLogicHeightToDevicePixel( nVertRound ); 66 67 // we need a graphics 68 if ( !mpGraphics ) 69 { 70 if ( !ImplGetGraphics() ) 71 return; 72 } 73 74 if ( mbInitClipRegion ) 75 ImplInitClipRegion(); 76 if ( mbOutputClipped ) 77 return; 78 79 if ( mbInitLineColor ) 80 ImplInitLineColor(); 81 if ( mbInitFillColor ) 82 ImplInitFillColor(); 83 84 if ( !nHorzRound && !nVertRound ) 85 mpGraphics->DrawRect( aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight(), this ); 86 else 87 { 88 const Polygon aRoundRectPoly( aRect, nHorzRound, nVertRound ); 89 90 if ( aRoundRectPoly.GetSize() >= 2 ) 91 { 92 const SalPoint* pPtAry = (const SalPoint*) aRoundRectPoly.GetConstPointAry(); 93 94 if ( !mbFillColor ) 95 mpGraphics->DrawPolyLine( aRoundRectPoly.GetSize(), pPtAry, this ); 96 else 97 mpGraphics->DrawPolygon( aRoundRectPoly.GetSize(), pPtAry, this ); 98 } 99 } 100 101 if( mpAlphaVDev ) 102 mpAlphaVDev->DrawRect( rRect, nHorzRound, nVertRound ); 103 } 104 105 // ----------------------------------------------------------------------- 106 107 void OutputDevice::DrawEllipse( const Rectangle& rRect ) 108 { 109 DBG_TRACE( "OutputDevice::DrawEllipse()" ); 110 DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); 111 112 if ( mpMetaFile ) 113 mpMetaFile->AddAction( new MetaEllipseAction( rRect ) ); 114 115 if ( !IsDeviceOutputNecessary() || (!mbLineColor && !mbFillColor) || ImplIsRecordLayout() ) 116 return; 117 118 Rectangle aRect( ImplLogicToDevicePixel( rRect ) ); 119 if ( aRect.IsEmpty() ) 120 return; 121 122 // we need a graphics 123 if ( !mpGraphics ) 124 { 125 if ( !ImplGetGraphics() ) 126 return; 127 } 128 129 if ( mbInitClipRegion ) 130 ImplInitClipRegion(); 131 if ( mbOutputClipped ) 132 return; 133 134 if ( mbInitLineColor ) 135 ImplInitLineColor(); 136 137 Polygon aRectPoly( aRect.Center(), aRect.GetWidth() >> 1, aRect.GetHeight() >> 1 ); 138 if ( aRectPoly.GetSize() >= 2 ) 139 { 140 const SalPoint* pPtAry = (const SalPoint*)aRectPoly.GetConstPointAry(); 141 if ( !mbFillColor ) 142 mpGraphics->DrawPolyLine( aRectPoly.GetSize(), pPtAry, this ); 143 else 144 { 145 if ( mbInitFillColor ) 146 ImplInitFillColor(); 147 mpGraphics->DrawPolygon( aRectPoly.GetSize(), pPtAry, this ); 148 } 149 } 150 151 if( mpAlphaVDev ) 152 mpAlphaVDev->DrawEllipse( rRect ); 153 } 154 155 // ----------------------------------------------------------------------- 156 157 void OutputDevice::DrawArc( const Rectangle& rRect, 158 const Point& rStartPt, const Point& rEndPt ) 159 { 160 DBG_TRACE( "OutputDevice::DrawArc()" ); 161 DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); 162 163 if ( mpMetaFile ) 164 mpMetaFile->AddAction( new MetaArcAction( rRect, rStartPt, rEndPt ) ); 165 166 if ( !IsDeviceOutputNecessary() || !mbLineColor || ImplIsRecordLayout() ) 167 return; 168 169 Rectangle aRect( ImplLogicToDevicePixel( rRect ) ); 170 if ( aRect.IsEmpty() ) 171 return; 172 173 // we need a graphics 174 if ( !mpGraphics ) 175 { 176 if ( !ImplGetGraphics() ) 177 return; 178 } 179 180 if ( mbInitClipRegion ) 181 ImplInitClipRegion(); 182 if ( mbOutputClipped ) 183 return; 184 185 if ( mbInitLineColor ) 186 ImplInitLineColor(); 187 188 const Point aStart( ImplLogicToDevicePixel( rStartPt ) ); 189 const Point aEnd( ImplLogicToDevicePixel( rEndPt ) ); 190 Polygon aArcPoly( aRect, aStart, aEnd, POLY_ARC ); 191 192 if ( aArcPoly.GetSize() >= 2 ) 193 { 194 const SalPoint* pPtAry = (const SalPoint*)aArcPoly.GetConstPointAry(); 195 mpGraphics->DrawPolyLine( aArcPoly.GetSize(), pPtAry, this ); 196 } 197 198 if( mpAlphaVDev ) 199 mpAlphaVDev->DrawArc( rRect, rStartPt, rEndPt ); 200 } 201 202 // ----------------------------------------------------------------------- 203 204 void OutputDevice::DrawPie( const Rectangle& rRect, 205 const Point& rStartPt, const Point& rEndPt ) 206 { 207 DBG_TRACE( "OutputDevice::DrawPie()" ); 208 DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); 209 210 if ( mpMetaFile ) 211 mpMetaFile->AddAction( new MetaPieAction( rRect, rStartPt, rEndPt ) ); 212 213 if ( !IsDeviceOutputNecessary() || (!mbLineColor && !mbFillColor) || ImplIsRecordLayout() ) 214 return; 215 216 Rectangle aRect( ImplLogicToDevicePixel( rRect ) ); 217 if ( aRect.IsEmpty() ) 218 return; 219 220 // we need a graphics 221 if ( !mpGraphics ) 222 { 223 if ( !ImplGetGraphics() ) 224 return; 225 } 226 227 if ( mbInitClipRegion ) 228 ImplInitClipRegion(); 229 if ( mbOutputClipped ) 230 return; 231 232 if ( mbInitLineColor ) 233 ImplInitLineColor(); 234 235 const Point aStart( ImplLogicToDevicePixel( rStartPt ) ); 236 const Point aEnd( ImplLogicToDevicePixel( rEndPt ) ); 237 Polygon aPiePoly( aRect, aStart, aEnd, POLY_PIE ); 238 239 if ( aPiePoly.GetSize() >= 2 ) 240 { 241 const SalPoint* pPtAry = (const SalPoint*)aPiePoly.GetConstPointAry(); 242 if ( !mbFillColor ) 243 mpGraphics->DrawPolyLine( aPiePoly.GetSize(), pPtAry, this ); 244 else 245 { 246 if ( mbInitFillColor ) 247 ImplInitFillColor(); 248 mpGraphics->DrawPolygon( aPiePoly.GetSize(), pPtAry, this ); 249 } 250 } 251 252 if( mpAlphaVDev ) 253 mpAlphaVDev->DrawPie( rRect, rStartPt, rEndPt ); 254 } 255 256 // ----------------------------------------------------------------------- 257 258 void OutputDevice::DrawChord( const Rectangle& rRect, 259 const Point& rStartPt, const Point& rEndPt ) 260 { 261 DBG_TRACE( "OutputDevice::DrawChord()" ); 262 DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); 263 264 if ( mpMetaFile ) 265 mpMetaFile->AddAction( new MetaChordAction( rRect, rStartPt, rEndPt ) ); 266 267 if ( !IsDeviceOutputNecessary() || (!mbLineColor && !mbFillColor) || ImplIsRecordLayout() ) 268 return; 269 270 Rectangle aRect( ImplLogicToDevicePixel( rRect ) ); 271 if ( aRect.IsEmpty() ) 272 return; 273 274 // we need a graphics 275 if ( !mpGraphics ) 276 { 277 if ( !ImplGetGraphics() ) 278 return; 279 } 280 281 if ( mbInitClipRegion ) 282 ImplInitClipRegion(); 283 if ( mbOutputClipped ) 284 return; 285 286 if ( mbInitLineColor ) 287 ImplInitLineColor(); 288 289 const Point aStart( ImplLogicToDevicePixel( rStartPt ) ); 290 const Point aEnd( ImplLogicToDevicePixel( rEndPt ) ); 291 Polygon aChordPoly( aRect, aStart, aEnd, POLY_CHORD ); 292 293 if ( aChordPoly.GetSize() >= 2 ) 294 { 295 const SalPoint* pPtAry = (const SalPoint*)aChordPoly.GetConstPointAry(); 296 if ( !mbFillColor ) 297 mpGraphics->DrawPolyLine( aChordPoly.GetSize(), pPtAry, this ); 298 else 299 { 300 if ( mbInitFillColor ) 301 ImplInitFillColor(); 302 mpGraphics->DrawPolygon( aChordPoly.GetSize(), pPtAry, this ); 303 } 304 } 305 306 if( mpAlphaVDev ) 307 mpAlphaVDev->DrawChord( rRect, rStartPt, rEndPt ); 308 } 309