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