Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sal/main.h>
21 : #include <tools/extendapplicationenvironment.hxx>
22 :
23 : #include <cppuhelper/bootstrap.hxx>
24 : #include <comphelper/processfactory.hxx>
25 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
26 : #include <com/sun/star/uno/XComponentContext.hpp>
27 :
28 : #include <vcl/svapp.hxx>
29 : #include <vcl/window.hxx>
30 : #include <vcl/dialog.hxx>
31 : #include <vcl/outdev.hxx>
32 : #include <vcl/virdev.hxx>
33 : #include <vcl/hatch.hxx>
34 : #include <vcl/bitmap.hxx>
35 : #include <vcl/wall.hxx>
36 : #include <vcl/image.hxx>
37 : #include <vcl/gdimtf.hxx>
38 : #include <vcl/metaact.hxx>
39 : #include <vcl/bitmapex.hxx>
40 : #include <vcl/gradient.hxx>
41 : #include <vcl/lineinfo.hxx>
42 :
43 : #include <rtl/bootstrap.hxx>
44 :
45 : #include <osl/time.h>
46 :
47 : #include <boost/function.hpp>
48 : #include <boost/bind.hpp>
49 :
50 : #include <stdio.h>
51 :
52 : using namespace ::com::sun::star;
53 :
54 : namespace
55 : {
56 :
57 0 : class GrindApp : public Application
58 : {
59 : public:
60 : virtual int Main() SAL_OVERRIDE;
61 : virtual sal_uInt16 Exception( sal_uInt16 nError ) SAL_OVERRIDE;
62 : };
63 :
64 0 : class TestWindow : public Dialog
65 : {
66 : public:
67 0 : TestWindow() : Dialog( nullptr )
68 : {
69 0 : SetText( OUString("OutDev grinding") );
70 0 : SetSizePixel( Size( 1024, 1024 ) );
71 0 : EnablePaint( true );
72 0 : Show();
73 0 : }
74 :
75 : virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE;
76 : };
77 :
78 : typedef boost::function1<void, OutputDevice*> functor_type;
79 : typedef std::vector< std::pair<const char*,
80 : functor_type> > functor_vector_type;
81 :
82 0 : template< typename Functor > void add( functor_vector_type& res,
83 : const char* pStr,
84 : const Functor& func )
85 : {
86 0 : res.push_back( std::make_pair(pStr,functor_type(func)) );
87 0 : }
88 :
89 0 : void setupMethodStubs( functor_vector_type& res )
90 : {
91 0 : const Color aWhiteColor( COL_WHITE );
92 0 : const Color aBlackColor( COL_BLACK );
93 :
94 0 : const Point aPt1(10,10);
95 0 : const Point aPt2(500,500);
96 0 : const Point aPt3(0,0);
97 0 : const Point aPt4(450,450);
98 :
99 0 : const Rectangle aRect(aPt1,aPt2);
100 0 : const Rectangle aRect2(aPt3,aPt4);
101 0 : const Polygon aPoly(aRect);
102 0 : const Polygon aPoly2(aRect2);
103 0 : tools::PolyPolygon aPolyPoly(aPoly);
104 0 : aPolyPoly.Insert( aPoly2 );
105 0 : Polygon aPoly3(aPoly2);
106 0 : aPoly3.Rotate( aPoly3.GetBoundRect().Center(),
107 0 : 900 );
108 :
109 0 : const LineInfo aLineInfo(LINE_SOLID,5);
110 :
111 : #ifdef FIXME_VDEV
112 : const OUString aString("This is a test");
113 :
114 : // unfortunately, VDevs have inaccessible copy constructors
115 : static VirtualDevice aVDev;
116 : static VirtualDevice aVDevBW(1);
117 :
118 : const Size aVDevSize;
119 : aVDev.SetOutputSizePixel(aVDevSize);
120 : aVDevBW.SetOutputSizePixel(aVDevSize);
121 :
122 : const Bitmap aBitmap( aVDev.GetBitmap(aPt1,aVDevSize) );
123 : const Bitmap aBitmapBW( aVDevBW.GetBitmap(aPt1,aVDevSize) );
124 : const Bitmap aBitmapAlien( aVDevSize, 8 );
125 : #else
126 0 : BitmapEx aIntro;
127 0 : rtl::Bootstrap::set("BRAND_BASE_DIR", ".");
128 0 : if (Application::LoadBrandBitmap ("intro", aIntro))
129 0 : Application::Abort( "Failed to load intro image, run inside program/" );
130 :
131 0 : const Bitmap aBitmap( aIntro.GetBitmap() );
132 0 : Bitmap aBitmapBW( aBitmap );
133 0 : aBitmapBW.Filter( BMP_FILTER_EMBOSS_GREY );
134 0 : Bitmap aBitmapAlien( Size( 100, 100 ), 8 );
135 0 : aBitmapAlien.Erase( COL_RED );
136 : #endif
137 :
138 0 : const BitmapEx aBitmapEx( aBitmap, aBitmapBW );
139 0 : const BitmapEx aBitmapExBW( aBitmapBW, aBitmapBW );
140 0 : const BitmapEx aBitmapExAlien( aBitmapAlien, aBitmapBW );
141 0 : const BitmapEx aBitmapExAlpha( aBitmap, aBitmapAlien );
142 0 : const BitmapEx aBitmapExAlphaAlien( aBitmapAlien, aBitmapAlien );
143 :
144 0 : const Image aImage( aBitmapEx );
145 0 : const Gradient aGradient(GradientStyle_ELLIPTICAL,aBlackColor,aWhiteColor);
146 0 : const Hatch aHatch(HatchStyle_TRIPLE,aBlackColor,4,450);
147 0 : const Wallpaper aWallpaper( aWhiteColor );
148 :
149 0 : GDIMetaFile aMtf;
150 0 : aMtf.AddAction( new MetaFillColorAction(Color(COL_RED),true) );
151 0 : aMtf.AddAction( new MetaRectAction(aRect) );
152 :
153 : #ifdef FIXME_NEEDS_LOVE
154 : add(res,
155 : "DrawTextArray",
156 : boost::bind(
157 : &OutputDevice::DrawTextArray,
158 : _1,
159 : aPt1, aString, (const sal_Int32*)0, (sal_uInt16)0, aString.getLength() ));
160 : #endif
161 :
162 : /* void DrawPixel( const Point& rPt, const Color& rColor ); */
163 : add(res,
164 : "DrawPixel",
165 : boost::bind(
166 : (void (OutputDevice::*)( const Point&, const Color& ))(
167 : &OutputDevice::DrawPixel),
168 : _1,
169 0 : aPt1, aBlackColor ));
170 :
171 : /* void DrawLine( const Point& rStartPt, const Point& rEndPt ); */
172 : add(res,
173 : "DrawLine",
174 : boost::bind(
175 : (void (OutputDevice::*)( const Point&, const Point& ))(
176 : &OutputDevice::DrawLine),
177 : _1,
178 0 : aPt1, aPt2 ));
179 :
180 : /* void DrawLine( const Point& rStartPt, const Point& rEndPt,
181 : const LineInfo& rLineInfo );
182 : */
183 : add(res,
184 : "DrawLine(LineInfo)",
185 : boost::bind(
186 : (void (OutputDevice::*)( const Point&, const Point&,const LineInfo& ))(
187 : &OutputDevice::DrawLine),
188 : _1,
189 0 : aPt1, aPt2, aLineInfo ));
190 :
191 : /* void DrawPolyLine( const Polygon& rPoly ); */
192 : add(res,
193 : "DrawPolyLine",
194 : boost::bind(
195 : (void (OutputDevice::*)( const Polygon& ))(
196 : &OutputDevice::DrawPolyLine),
197 : _1,
198 0 : aPoly ));
199 :
200 : /* void DrawPolyLine( const Polygon& rPoly,
201 : const LineInfo& rLineInfo );
202 : */
203 : add(res,
204 : "DrawPolyLine(LineInfo)",
205 : boost::bind(
206 : (void (OutputDevice::*)( const Polygon&, const LineInfo& ))(
207 : &OutputDevice::DrawPolyLine),
208 : _1,
209 0 : aPoly, aLineInfo ));
210 :
211 : /* void DrawPolygon( const Polygon& rPoly ); */
212 : add(res,
213 : "DrawPolygon",
214 : boost::bind(
215 : (void (OutputDevice::*)( const Polygon& ))
216 : &OutputDevice::DrawPolygon,
217 : _1,
218 0 : aPoly ));
219 :
220 : /* void DrawPolyPolygon( const tools::PolyPolygon& rPolyPoly ); */
221 : add(res,
222 : "DrawPolyPolygon",
223 : boost::bind(
224 : (void (OutputDevice::*)( const tools::PolyPolygon& ))
225 : &OutputDevice::DrawPolyPolygon,
226 : _1,
227 0 : aPolyPoly ));
228 :
229 : /* void DrawRect( const Rectangle& rRect ); */
230 : add(res,
231 : "DrawRect",
232 : boost::bind(
233 : (void (OutputDevice::*)( const Rectangle& ))(
234 : &OutputDevice::DrawRect),
235 : _1,
236 0 : aRect ));
237 :
238 : /* void DrawRect( const Rectangle& rRect,
239 : sal_uLong nHorzRount, sal_uLong nVertRound );
240 : */
241 : add(res,
242 : "DrawRect(round corners)",
243 : boost::bind(
244 : (void (OutputDevice::*)( const Rectangle&, sal_uLong nHorzRount, sal_uLong nVertRound ))(
245 : &OutputDevice::DrawRect),
246 : _1,
247 : aRect2,
248 0 : 4,4));
249 :
250 : /* void DrawEllipse( const Rectangle& rRect ); */
251 : add(res,
252 : "DrawEllipse",
253 : boost::bind(
254 : &OutputDevice::DrawEllipse,
255 : _1,
256 0 : aRect ));
257 :
258 : /* void DrawArc( const Rectangle& rRect,
259 : const Point& rStartPt, const Point& rEndPt );
260 : */
261 : add(res,
262 : "DrawArc",
263 : boost::bind(
264 : &OutputDevice::DrawArc,
265 : _1,
266 0 : aRect,aPt1,aPt2 ));
267 :
268 : /* void DrawPie( const Rectangle& rRect,
269 : const Point& rStartPt, const Point& rEndPt );
270 : */
271 : add(res,
272 : "DrawPie",
273 : boost::bind(
274 : &OutputDevice::DrawPie,
275 : _1,
276 0 : aRect2,aPt3,aPt4 ));
277 :
278 : /* void DrawChord( const Rectangle& rRect,
279 : const Point& rStartPt, const Point& rEndPt );
280 : */
281 : add(res,
282 : "DrawChord",
283 : boost::bind(
284 : &OutputDevice::DrawChord,
285 : _1,
286 0 : aRect2,aPt3,aPt4 ));
287 :
288 : /* void DrawOutDev( const Point& rDestPt, const Size& rDestSize,
289 : const Point& rSrcPt, const Size& rSrcSize );
290 : */
291 : add(res,
292 : "DrawOutDev",
293 : boost::bind(
294 : (void (OutputDevice::*)( const Point&, const Size&,
295 : const Point&, const Size& ))(
296 : &OutputDevice::DrawOutDev),
297 : _1,
298 : aRect2.TopLeft(), aRect2.GetSize(),
299 0 : aRect.TopLeft(), aRect.GetSize()));
300 :
301 : #ifdef FIXME_VDEV
302 : /* void DrawOutDev( const Point& rDestPt, const Size& rDestSize,
303 : const Point& rSrcPt, const Size& rSrcSize,
304 : const OutputDevice& rOutDev );
305 : */
306 : add(res,
307 : "DrawOutDev(foreign source)",
308 : boost::bind(
309 : (void (OutputDevice::*)( const Point&, const Size&,
310 : const Point&, const Size&,
311 : const OutputDevice& ))(
312 : &OutputDevice::DrawOutDev),
313 : _1,
314 : aRect2.TopLeft(), aRect2.GetSize(),
315 : aRect.TopLeft(), aRect.GetSize(),
316 : boost::cref(aVDevBW) ));
317 :
318 : /* void DrawOutDev( const Point& rDestPt, const Size& rDestSize,
319 : const Point& rSrcPt, const Size& rSrcSize,
320 : const OutputDevice& rOutDev );
321 : */
322 : add(res,
323 : "DrawOutDev(foreign source, scaled)",
324 : boost::bind(
325 : (void (OutputDevice::*)( const Point&, const Size&,
326 : const Point&, const Size&,
327 : const OutputDevice& ))(
328 : &OutputDevice::DrawOutDev),
329 : _1,
330 : aRect2.TopLeft(), aRect2.GetSize(),
331 : aRect.TopLeft(), aRect.GetSize(),
332 : boost::cref(aVDev) ));
333 : #endif
334 :
335 : /* void CopyArea( const Point& rDestPt,
336 : const Point& rSrcPt, const Size& rSrcSize,
337 : sal_uInt16 nFlags = 0 );
338 : */
339 : add(res,
340 : "CopyArea",
341 : boost::bind(
342 : &OutputDevice::CopyArea,
343 : _1,
344 0 : aPt1, aPt3, aRect2.GetSize(), false ));
345 :
346 : #ifdef NEEDS_QUALIY_PARAMTER
347 : /* void DrawBitmap( const Point& rDestPt,
348 : const Bitmap& rBitmap );
349 : */
350 : add(res,
351 : "DrawBitmap(alien source)",
352 : boost::bind(
353 : (void (OutputDevice::*)( const Point&,
354 : const Bitmap& ))(
355 : &OutputDevice::DrawBitmap),
356 : _1,
357 : aPt1,aBitmapAlien ));
358 :
359 : /* void DrawBitmap( const Point& rDestPt,
360 : const Bitmap& rBitmap );
361 : */
362 : add(res,
363 : "DrawBitmap",
364 : boost::bind(
365 : (void (OutputDevice::*)( const Point&,
366 : const Bitmap& ))(
367 : &OutputDevice::DrawBitmap),
368 : _1,
369 : aPt1,aBitmap ));
370 :
371 : /* void DrawBitmap( const Point& rDestPt, const Size& rDestSize,
372 : const Bitmap& rBitmap );
373 : */
374 : add(res,
375 : "DrawBitmap(scaled,alien source)",
376 : boost::bind(
377 : (void (OutputDevice::*)( const Point&,
378 : const Size&,
379 : const Bitmap& ))(
380 : &OutputDevice::DrawBitmap),
381 : _1,
382 : aPt1,aRect.GetSize(),aBitmapAlien ));
383 :
384 : /* void DrawBitmap( const Point& rDestPt, const Size& rDestSize,
385 : const Bitmap& rBitmap );
386 : */
387 : add(res,
388 : "DrawBitmap(scaled)",
389 : boost::bind(
390 : (void (OutputDevice::*)( const Point&,
391 : const Size&,
392 : const Bitmap& ))(
393 : &OutputDevice::DrawBitmap),
394 : _1,
395 : aPt1,aRect.GetSize(),aBitmap ));
396 :
397 : #if 0
398 : /* void DrawBitmap( const Point& rDestPt, const Size& rDestSize,
399 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
400 : const Bitmap& rBitmap );
401 : */
402 : add(res,
403 : "DrawBitmap(scaled subset,alien source)",
404 : boost::bind(
405 : (void (OutputDevice::*)( const Point&,
406 : const Size&,
407 : const Point&,
408 : const Size&,
409 : const Bitmap& ))(
410 : &OutputDevice::DrawBitmap),
411 : _1,
412 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmapAlien ));
413 : #endif
414 :
415 : /* void DrawBitmap( const Point& rDestPt, const Size& rDestSize,
416 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
417 : const Bitmap& rBitmap );
418 : */
419 : add(res,
420 : "DrawBitmap(scaled subset)",
421 : boost::bind(
422 : (void (OutputDevice::*)( const Point&,
423 : const Size&,
424 : const Point&,
425 : const Size&,
426 : const Bitmap& ))(
427 : &OutputDevice::DrawBitmap),
428 : _1,
429 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmap ));
430 :
431 : /* void DrawBitmapEx( const Point& rDestPt,
432 : const BitmapEx& rBitmapEx );
433 : */
434 : add(res,
435 : "DrawBitmapEx(alien source)",
436 : boost::bind(
437 : (void (OutputDevice::*)( const Point&,
438 : const BitmapEx& ))(
439 : &OutputDevice::DrawBitmapEx),
440 : _1,
441 : aPt1,aBitmapExAlien ));
442 :
443 : /* void DrawBitmapEx( const Point& rDestPt,
444 : const BitmapEx& rBitmapEx );
445 : */
446 : add(res,
447 : "DrawBitmapEx",
448 : boost::bind(
449 : (void (OutputDevice::*)( const Point&,
450 : const BitmapEx& ))(
451 : &OutputDevice::DrawBitmapEx),
452 : _1,
453 : aPt1,aBitmapEx ));
454 :
455 : /* void DrawBitmapEx( const Point& rDestPt,
456 : const BitmapEx& rBitmapEx );
457 : */
458 : add(res,
459 : "DrawBitmapEx(alpha)",
460 : boost::bind(
461 : (void (OutputDevice::*)( const Point&,
462 : const BitmapEx& ))(
463 : &OutputDevice::DrawBitmapEx),
464 : _1,
465 : aPt1,aBitmapExAlpha ));
466 :
467 : /* void DrawBitmapEx( const Point& rDestPt,
468 : const BitmapEx& rBitmapEx );
469 : */
470 : add(res,
471 : "DrawBitmapEx(alpha, alien source)",
472 : boost::bind(
473 : (void (OutputDevice::*)( const Point&,
474 : const BitmapEx& ))(
475 : &OutputDevice::DrawBitmapEx),
476 : _1,
477 : aPt1,aBitmapExAlphaAlien ));
478 :
479 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
480 : const BitmapEx& rBitmapEx );
481 : */
482 : add(res,
483 : "DrawBitmapEx(scaled,alien source)",
484 : boost::bind(
485 : (void (OutputDevice::*)( const Point&,
486 : const Size&,
487 : const BitmapEx& ))(
488 : &OutputDevice::DrawBitmapEx),
489 : _1,
490 : aPt1,aRect.GetSize(),aBitmapExAlien ));
491 :
492 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
493 : const BitmapEx& rBitmapEx );
494 : */
495 : add(res,
496 : "DrawBitmapEx(scaled)",
497 : boost::bind(
498 : (void (OutputDevice::*)( const Point&,
499 : const Size&,
500 : const BitmapEx& ))(
501 : &OutputDevice::DrawBitmapEx),
502 : _1,
503 : aPt1,aRect.GetSize(),aBitmapEx ));
504 :
505 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
506 : const BitmapEx& rBitmapEx );
507 : */
508 : add(res,
509 : "DrawBitmapEx(scaled alpha)",
510 : boost::bind(
511 : (void (OutputDevice::*)( const Point&,
512 : const Size&,
513 : const BitmapEx& ))(
514 : &OutputDevice::DrawBitmapEx),
515 : _1,
516 : aPt1,aRect.GetSize(),aBitmapExAlpha ));
517 :
518 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
519 : const BitmapEx& rBitmapEx );
520 : */
521 : add(res,
522 : "DrawBitmapEx(scaled alpha, alien source)",
523 : boost::bind(
524 : (void (OutputDevice::*)( const Point&,
525 : const Size&,
526 : const BitmapEx& ))(
527 : &OutputDevice::DrawBitmapEx),
528 : _1,
529 : aPt1,aRect.GetSize(),aBitmapExAlphaAlien ));
530 :
531 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
532 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
533 : const BitmapEx& rBitmapEx );
534 : */
535 : add(res,
536 : "DrawBitmapEx(scaled subset,alien source)",
537 : boost::bind(
538 : (void (OutputDevice::*)( const Point&,
539 : const Size&,
540 : const Point&,
541 : const Size&,
542 : const BitmapEx& ))(
543 : &OutputDevice::DrawBitmapEx),
544 : _1,
545 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmapExAlien ));
546 :
547 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
548 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
549 : const BitmapEx& rBitmapEx );
550 : */
551 : add(res,
552 : "DrawBitmapEx(scaled subset)",
553 : boost::bind(
554 : (void (OutputDevice::*)( const Point&,
555 : const Size&,
556 : const Point&,
557 : const Size&,
558 : const BitmapEx& ))(
559 : &OutputDevice::DrawBitmapEx),
560 : _1,
561 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmapEx ));
562 :
563 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
564 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
565 : const BitmapEx& rBitmapEx );
566 : */
567 : add(res,
568 : "DrawBitmapEx(scaled subset, alpha)",
569 : boost::bind(
570 : (void (OutputDevice::*)( const Point&,
571 : const Size&,
572 : const Point&,
573 : const Size&,
574 : const BitmapEx& ))(
575 : &OutputDevice::DrawBitmapEx),
576 : _1,
577 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmapExAlpha ));
578 :
579 : /* void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
580 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
581 : const BitmapEx& rBitmapEx );
582 : */
583 : add(res,
584 : "DrawBitmapEx(scaled subset, alpha alien source)",
585 : boost::bind(
586 : (void (OutputDevice::*)( const Point&,
587 : const Size&,
588 : const Point&,
589 : const Size&,
590 : const BitmapEx& ))(
591 : &OutputDevice::DrawBitmapEx),
592 : _1,
593 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmapExAlphaAlien ));
594 :
595 : /* void DrawMask( const Point& rDestPt,
596 : const Bitmap& rBitmap, const Color& rMaskColor );
597 : */
598 : add(res,
599 : "DrawMask(alien source)",
600 : boost::bind(
601 : (void (OutputDevice::*)( const Point&,
602 : const Bitmap&,
603 : const Color& ))(
604 : &OutputDevice::DrawMask),
605 : _1,
606 : aPt1,aBitmapAlien,aBlackColor ));
607 :
608 : /* void DrawMask( const Point& rDestPt,
609 : const Bitmap& rBitmap, const Color& rMaskColor );
610 : */
611 : add(res,
612 : "DrawMask",
613 : boost::bind(
614 : (void (OutputDevice::*)( const Point&,
615 : const Bitmap&,
616 : const Color& ))(
617 : &OutputDevice::DrawMask),
618 : _1,
619 : aPt1,aBitmap,aBlackColor ));
620 :
621 : /* void DrawMask( const Point& rDestPt, const Size& rDestSize,
622 : const Bitmap& rBitmap, const Color& rMaskColor );
623 : */
624 : add(res,
625 : "DrawMask(scaled,alien source)",
626 : boost::bind(
627 : (void (OutputDevice::*)( const Point&,
628 : const Size&,
629 : const Bitmap&,
630 : const Color& ))(
631 : &OutputDevice::DrawMask),
632 : _1,
633 : aPt1,aRect.GetSize(),aBitmapAlien, aBlackColor ));
634 :
635 : /* void DrawMask( const Point& rDestPt, const Size& rDestSize,
636 : const Bitmap& rBitmap, const Color& rMaskColor );
637 : */
638 : add(res,
639 : "DrawMask(scaled)",
640 : boost::bind(
641 : (void (OutputDevice::*)( const Point&,
642 : const Size&,
643 : const Bitmap&,
644 : const Color& ))(
645 : &OutputDevice::DrawMask),
646 : _1,
647 : aPt1,aRect.GetSize(),aBitmap,aBlackColor ));
648 :
649 : /* void DrawMask( const Point& rDestPt, const Size& rDestSize,
650 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
651 : const Bitmap& rBitmap, const Color& rMaskColor );
652 : */
653 : add(res,
654 : "DrawMask(scaled subset,alien source)",
655 : boost::bind(
656 : (void (OutputDevice::*)( const Point&,
657 : const Size&,
658 : const Point&,
659 : const Size&,
660 : const Bitmap&,
661 : const Color& ))(
662 : &OutputDevice::DrawMask),
663 : _1,
664 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmapAlien,aBlackColor ));
665 :
666 : /* void DrawMask( const Point& rDestPt, const Size& rDestSize,
667 : const Point& rSrcPtPixel, const Size& rSrcSizePixel,
668 : const Bitmap& rBitmap, const Color& rMaskColor );
669 : */
670 : add(res,
671 : "DrawMask(scaled subset)",
672 : boost::bind(
673 : (void (OutputDevice::*)( const Point&,
674 : const Size&,
675 : const Point&,
676 : const Size&,
677 : const Bitmap&,
678 : const Color& ))(
679 : &OutputDevice::DrawMask),
680 : _1,
681 : aPt1,aRect.GetSize(),aPt3,aRect2.GetSize(),aBitmap,aBlackColor ));
682 :
683 : /* void DrawImage( const Point& rPos,
684 : const Image& rImage, sal_uInt16 nStyle = 0 );
685 : */
686 : add(res,
687 : "DrawImage",
688 : boost::bind(
689 : (void (OutputDevice::*)( const Point&,
690 : const Image&,
691 : sal_uInt16 nStyle ))(
692 : &OutputDevice::DrawImage),
693 : _1,
694 : aPt1,aImage,(sal_uInt16)0 ));
695 :
696 : /* void DrawImage( const Point& rPos, const Size& rSize,
697 : const Image& rImage, sal_uInt16 nStyle = 0 );
698 : */
699 : add(res,
700 : "DrawImage(scaled)",
701 : boost::bind(
702 : (void (OutputDevice::*)( const Point&,
703 : const Size&,
704 : const Image&,
705 : sal_uInt16 nStyle ))(
706 : &OutputDevice::DrawImage),
707 : _1,
708 : aPt1,aRect.GetSize(),aImage,(sal_uInt16)0 ));
709 :
710 : #endif // NEEDS_QUALITY_PARAMATER
711 :
712 : /* void DrawGradient( const Rectangle& rRect, const Gradient& rGradient ); */
713 : add(res,
714 : "DrawGradient",
715 : boost::bind(
716 : (void (OutputDevice::*)( const Rectangle&, const Gradient& ))(
717 : &OutputDevice::DrawGradient),
718 : _1,
719 0 : aRect,aGradient ));
720 :
721 : /* void DrawGradient( const tools::PolyPolygon& rPolyPoly, const Gradient& rGradient ); */
722 : add(res,
723 : "DrawGradient(polygon)",
724 : boost::bind(
725 : (void (OutputDevice::*)( const tools::PolyPolygon&, const Gradient& ))(
726 : &OutputDevice::DrawGradient),
727 : _1,
728 0 : aPoly3,aGradient ));
729 :
730 : /* void DrawHatch( const tools::PolyPolygon& rPolyPoly, const Hatch& rHatch ); */
731 : add(res,
732 : "DrawHatch",
733 : boost::bind(
734 : &OutputDevice::DrawHatch,
735 : _1,
736 0 : aPoly3,aHatch ));
737 :
738 : /* void DrawWallpaper( const Rectangle& rRect, const Wallpaper& rWallpaper ); */
739 : add(res,
740 : "DrawWallpaper",
741 : boost::bind(
742 : &OutputDevice::DrawWallpaper,
743 : _1,
744 0 : aRect2,aWallpaper ));
745 :
746 : #ifdef FIXME_HAVE_WAVE_NORMAL
747 : /* void DrawWaveLine( const Point& rStartPos, const Point& rEndPos, sal_uInt16 nStyle ); */
748 : add(res,
749 : "DrawWaveLine",
750 : boost::bind(
751 : &OutputDevice::DrawWaveLine,
752 : _1,
753 : aPt1,aPt2,(sal_uInt16)WAVE_NORMAL ));
754 : #endif
755 :
756 : /* void DrawGrid( const Rectangle& rRect, const Size& rDist, sal_uLong nFlags ); */
757 : add(res,
758 : "DrawGrid",
759 : boost::bind(
760 : &OutputDevice::DrawGrid,
761 : _1,
762 0 : aRect,Size(10,20),DrawGridFlags::HorzLines|DrawGridFlags::VertLines ));
763 :
764 : /* void DrawTransparent( const tools::PolyPolygon& rPolyPoly,
765 : sal_uInt16 nTransparencePercent );
766 : */
767 : add(res,
768 : "DrawTransparent",
769 : boost::bind(
770 : (void (OutputDevice::*)( const tools::PolyPolygon&, sal_uInt16 ))(
771 : &OutputDevice::DrawTransparent),
772 : _1,
773 0 : aPoly3,(sal_uInt16)50 ));
774 :
775 : /* void DrawTransparent( const GDIMetaFile& rMtf,
776 : const Point& rPos, const Size& rSize,
777 : const Gradient& rTransparenceGradient );
778 : */
779 : add(res,
780 : "DrawTransparent(metafile)",
781 : boost::bind(
782 : (void (OutputDevice::*)( const GDIMetaFile&,
783 : const Point&,
784 : const Size&,
785 : const Gradient& ))(
786 : &OutputDevice::DrawTransparent),
787 : _1,
788 0 : aMtf,aPt1,aRect.GetSize(),aGradient ));
789 :
790 : /* void Erase(); */
791 : add(res,
792 : "Erase",
793 : boost::bind(
794 : &OutputDevice::Erase,
795 0 : _1 ));
796 :
797 0 : }
798 :
799 0 : void grindFunc( OutputDevice& rTarget,
800 : functor_vector_type::const_iterator iter,
801 : sal_Int32 nTurns,
802 : const char* pMsg )
803 : {
804 0 : const sal_uInt32 nStartTime( osl_getGlobalTimer() );
805 :
806 0 : for( sal_Int32 i=0; i<nTurns; ++i )
807 0 : iter->second(&rTarget);
808 :
809 0 : if( rTarget.GetOutDevType() == OUTDEV_WINDOW )
810 0 : static_cast< vcl::Window & >( rTarget ).Sync();
811 :
812 : fprintf( stdout,
813 : "Duration: %d ms (%d repetitions)\tOperation: %s\tSetup: %s\n",
814 0 : (int)(osl_getGlobalTimer() - nStartTime),
815 : (int)(nTurns),
816 0 : iter->first,
817 0 : pMsg );
818 0 : }
819 :
820 : /** Call OutputDevice render methods repeatedly, and output elapsed
821 : time to stdout
822 : */
823 0 : void outDevGrind(vcl::RenderContext& rTarget, sal_Int32 nTurns = 100)
824 : {
825 : // TODO(F1): also profile pure complex clip setup times!
826 :
827 : // State: fill/line color, draw mode, w/o clip, rect clip, complex clip
828 0 : functor_vector_type aMethods;
829 0 : setupMethodStubs( aMethods );
830 :
831 0 : const Rectangle aClipRect(10,10,1000,1000);
832 0 : const Polygon aPoly1( aClipRect );
833 0 : Polygon aPoly2( aClipRect );
834 0 : aPoly2.Rotate(aClipRect.Center(),450);
835 0 : tools::PolyPolygon aClipPoly(aPoly1);
836 0 : aClipPoly.Insert(aPoly2);
837 :
838 0 : functor_vector_type::const_iterator iter = aMethods.begin();
839 0 : const functor_vector_type::const_iterator end = aMethods.end();
840 0 : while( iter != end )
841 : {
842 0 : rTarget.SetLineColor( Color(COL_BLACK) );
843 0 : rTarget.SetFillColor( Color(COL_GREEN) );
844 0 : rTarget.SetRasterOp( ROP_OVERPAINT );
845 0 : rTarget.SetClipRegion();
846 0 : grindFunc( rTarget, iter, nTurns, "w/o clip, w/o xor" );
847 :
848 0 : rTarget.SetLineColor( Color(COL_BLACK) );
849 0 : rTarget.SetFillColor( Color(COL_GREEN) );
850 0 : rTarget.SetRasterOp( ROP_OVERPAINT );
851 0 : rTarget.SetClipRegion( vcl::Region( aClipRect ) );
852 0 : grindFunc( rTarget, iter, nTurns, "with rect clip, w/o xor" );
853 :
854 0 : rTarget.SetLineColor( Color(COL_BLACK) );
855 0 : rTarget.SetFillColor( Color(COL_GREEN) );
856 0 : rTarget.SetRasterOp( ROP_OVERPAINT );
857 0 : rTarget.SetClipRegion( vcl::Region( aClipPoly ) );
858 0 : grindFunc( rTarget, iter, nTurns, "with complex clip, w/o xor" );
859 :
860 0 : rTarget.SetLineColor( Color(COL_BLACK) );
861 0 : rTarget.SetFillColor( Color(COL_GREEN) );
862 0 : rTarget.SetRasterOp( ROP_XOR );
863 0 : rTarget.SetClipRegion();
864 0 : grindFunc( rTarget, iter, nTurns, "w/o clip, with xor" );
865 :
866 0 : rTarget.SetLineColor( Color(COL_BLACK) );
867 0 : rTarget.SetFillColor( Color(COL_GREEN) );
868 0 : rTarget.SetRasterOp( ROP_XOR );
869 0 : rTarget.SetClipRegion( vcl::Region( aClipRect ) );
870 0 : grindFunc( rTarget, iter, nTurns, "with rect clip, with xor" );
871 :
872 0 : rTarget.SetLineColor( Color(COL_BLACK) );
873 0 : rTarget.SetFillColor( Color(COL_GREEN) );
874 0 : rTarget.SetRasterOp( ROP_XOR );
875 0 : rTarget.SetClipRegion( vcl::Region( aClipPoly ) );
876 0 : grindFunc( rTarget, iter, nTurns, "with complex clip, with xor" );
877 :
878 0 : ++iter;
879 0 : }
880 0 : }
881 :
882 0 : void TestWindow::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
883 : {
884 0 : outDevGrind(rRenderContext);
885 0 : fflush(stdout);
886 0 : }
887 :
888 0 : sal_uInt16 GrindApp::Exception( sal_uInt16 nError )
889 : {
890 0 : switch( nError & EXC_MAJORTYPE )
891 : {
892 : case EXC_RSCNOTLOADED:
893 0 : Abort( "Error: could not load language resources.\nPlease check your installation.\n" );
894 0 : break;
895 : }
896 0 : return 0;
897 : }
898 :
899 0 : int GrindApp::Main()
900 : {
901 0 : ScopedVclPtrInstance<TestWindow> aWindow;
902 0 : aWindow->Execute();
903 0 : return 0;
904 : }
905 :
906 : } // namespace
907 :
908 :
909 0 : SAL_IMPLEMENT_MAIN()
910 : {
911 : try
912 : {
913 0 : bool bHelp = false;
914 :
915 0 : for( sal_uInt16 i = 0; i < Application::GetCommandLineParamCount(); i++ )
916 : {
917 0 : OUString aParam = Application::GetCommandLineParam( i );
918 :
919 0 : if( aParam == "--help" || aParam == "-h" )
920 0 : bHelp = true;
921 0 : }
922 :
923 0 : if( bHelp )
924 : {
925 0 : printf( "outdevgrind - Profile OutputDevice\n" );
926 0 : return EXIT_SUCCESS;
927 : }
928 :
929 0 : tools::extendApplicationEnvironment();
930 :
931 0 : uno::Reference< uno::XComponentContext > xContext = cppu::defaultBootstrap_InitialComponentContext();
932 0 : uno::Reference< lang::XMultiServiceFactory > xServiceManager( xContext->getServiceManager(), uno::UNO_QUERY );
933 :
934 0 : if( !xServiceManager.is() )
935 0 : Application::Abort( "Failed to bootstrap" );
936 :
937 0 : comphelper::setProcessServiceFactory( xServiceManager );
938 :
939 0 : InitVCL();
940 :
941 0 : GrindApp aGrindApp;
942 0 : aGrindApp.Main();
943 :
944 0 : DeInitVCL();
945 : }
946 0 : catch (const css::uno::Exception& e)
947 : {
948 : SAL_WARN("vcl.app", "Fatal exception: " << e.Message);
949 0 : return EXIT_FAILURE;
950 : }
951 0 : catch (const std::exception& e)
952 : {
953 : SAL_WARN("vcl.app", "Fatal exception: " << e.what());
954 0 : return EXIT_FAILURE;
955 : }
956 :
957 0 : return EXIT_SUCCESS;
958 0 : }
959 :
960 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|