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 #include <sal/main.h>
25 #include <tools/extendapplicationenvironment.hxx>
26 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
27
28 #include <vcl/event.hxx>
29 #include <vcl/svapp.hxx>
30 #include <vcl/wrkwin.hxx>
31 #include <vcl/gradient.hxx>
32 #include <vcl/lineinfo.hxx>
33 #include <vcl/bitmap.hxx>
34 #include <vcl/bmpacc.hxx>
35 #include <vcl/metric.hxx>
36
37 #include <rtl/ustrbuf.hxx>
38
39 #include <math.h>
40
41 #include <comphelper/processfactory.hxx>
42 #include <cppuhelper/servicefactory.hxx>
43 #include <cppuhelper/bootstrap.hxx>
44
45 using namespace rtl;
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::lang;
48 // -----------------------------------------------------------------------
49
50 // Forward declaration
51 void Main();
52
53 // -----------------------------------------------------------------------
54
SAL_IMPLEMENT_MAIN()55 SAL_IMPLEMENT_MAIN()
56 {
57 tools::extendApplicationEnvironment();
58
59 Reference< XMultiServiceFactory > xMS;
60 xMS = cppu::createRegistryServiceFactory( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "types.rdb" ) ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "applicat.rdb" ) ), sal_True );
61
62 InitVCL( xMS );
63 ::Main();
64 DeInitVCL();
65
66 return 0;
67 }
68
69 // -----------------------------------------------------------------------
70
71 class MyWin : public WorkWindow
72 {
73 Bitmap m_aBitmap;
74 public:
75 MyWin( Window* pParent, WinBits nWinStyle );
76
77 void MouseMove( const MouseEvent& rMEvt );
78 void MouseButtonDown( const MouseEvent& rMEvt );
79 void MouseButtonUp( const MouseEvent& rMEvt );
80 void KeyInput( const KeyEvent& rKEvt );
81 void KeyUp( const KeyEvent& rKEvt );
82 void Paint( const Rectangle& rRect );
83 void Resize();
84 };
85
86 // -----------------------------------------------------------------------
87
Main()88 void Main()
89 {
90 MyWin aMainWin( NULL, WB_APP | WB_STDWORK );
91 aMainWin.SetText( XubString( RTL_CONSTASCII_USTRINGPARAM( "VCL - Workbench" ) ) );
92 aMainWin.Show();
93
94 Application::Execute();
95 }
96
97 // -----------------------------------------------------------------------
98
MyWin(Window * pParent,WinBits nWinStyle)99 MyWin::MyWin( Window* pParent, WinBits nWinStyle ) :
100 WorkWindow( pParent, nWinStyle ),
101 m_aBitmap( Size( 256, 256 ), 32 )
102 {
103 // prepare an alpha mask
104 BitmapWriteAccess* pAcc = m_aBitmap.AcquireWriteAccess();
105 for( int nX = 0; nX < 256; nX++ )
106 {
107 for( int nY = 0; nY < 256; nY++ )
108 {
109 double fRed = 255.0-1.5*sqrt((double)(nX*nX+nY*nY));
110 if( fRed < 0.0 )
111 fRed = 0.0;
112 double fGreen = 255.0-1.5*sqrt((double)(((255-nX)*(255-nX)+nY*nY)));
113 if( fGreen < 0.0 )
114 fGreen = 0.0;
115 double fBlue = 255.0-1.5*sqrt((double)((128-nX)*(128-nX)+(255-nY)*(255-nY)));
116 if( fBlue < 0.0 )
117 fBlue = 0.0;
118 pAcc->SetPixel( nX, nY, BitmapColor( sal_uInt8(fRed), sal_uInt8(fGreen), sal_uInt8(fBlue) ) );
119 }
120 }
121 m_aBitmap.ReleaseAccess( pAcc );
122 }
123
124 // -----------------------------------------------------------------------
125
MouseMove(const MouseEvent & rMEvt)126 void MyWin::MouseMove( const MouseEvent& rMEvt )
127 {
128 WorkWindow::MouseMove( rMEvt );
129 }
130
131 // -----------------------------------------------------------------------
132
MouseButtonDown(const MouseEvent & rMEvt)133 void MyWin::MouseButtonDown( const MouseEvent& rMEvt )
134 {
135 WorkWindow::MouseButtonDown( rMEvt );
136 }
137
138 // -----------------------------------------------------------------------
139
MouseButtonUp(const MouseEvent & rMEvt)140 void MyWin::MouseButtonUp( const MouseEvent& rMEvt )
141 {
142 WorkWindow::MouseButtonUp( rMEvt );
143 }
144
145 // -----------------------------------------------------------------------
146
KeyInput(const KeyEvent & rKEvt)147 void MyWin::KeyInput( const KeyEvent& rKEvt )
148 {
149 WorkWindow::KeyInput( rKEvt );
150 }
151
152 // -----------------------------------------------------------------------
153
KeyUp(const KeyEvent & rKEvt)154 void MyWin::KeyUp( const KeyEvent& rKEvt )
155 {
156 WorkWindow::KeyUp( rKEvt );
157 }
158
159 // -----------------------------------------------------------------------
160
project(const Point & rPoint)161 static Point project( const Point& rPoint )
162 {
163 const double angle_x = M_PI / 6.0;
164 const double angle_z = M_PI / 6.0;
165
166 // transform planar coordinates to 3d
167 double x = rPoint.X();
168 double y = rPoint.Y();
169 //double z = 0;
170
171 // rotate around X axis
172 double x1 = x;
173 double y1 = y * cos( angle_x );
174 double z1 = y * sin( angle_x );
175
176 // rotate around Z axis
177 double x2 = x1 * cos( angle_z ) + y1 * sin( angle_z );
178 //double y2 = y1 * cos( angle_z ) - x1 * sin( angle_z );
179 double z2 = z1;
180
181 return Point( (sal_Int32)x2, (sal_Int32)z2 );
182 }
183
approachColor(const Color & rFrom,const Color & rTo)184 static Color approachColor( const Color& rFrom, const Color& rTo )
185 {
186 Color aColor;
187 sal_uInt8 nDiff;
188 // approach red
189 if( rFrom.GetRed() < rTo.GetRed() )
190 {
191 nDiff = rTo.GetRed() - rFrom.GetRed();
192 aColor.SetRed( rFrom.GetRed() + ( nDiff < 10 ? nDiff : 10 ) );
193 }
194 else if( rFrom.GetRed() > rTo.GetRed() )
195 {
196 nDiff = rFrom.GetRed() - rTo.GetRed();
197 aColor.SetRed( rFrom.GetRed() - ( nDiff < 10 ? nDiff : 10 ) );
198 }
199 else
200 aColor.SetRed( rFrom.GetRed() );
201
202 // approach Green
203 if( rFrom.GetGreen() < rTo.GetGreen() )
204 {
205 nDiff = rTo.GetGreen() - rFrom.GetGreen();
206 aColor.SetGreen( rFrom.GetGreen() + ( nDiff < 10 ? nDiff : 10 ) );
207 }
208 else if( rFrom.GetGreen() > rTo.GetGreen() )
209 {
210 nDiff = rFrom.GetGreen() - rTo.GetGreen();
211 aColor.SetGreen( rFrom.GetGreen() - ( nDiff < 10 ? nDiff : 10 ) );
212 }
213 else
214 aColor.SetGreen( rFrom.GetGreen() );
215
216 // approach blue
217 if( rFrom.GetBlue() < rTo.GetBlue() )
218 {
219 nDiff = rTo.GetBlue() - rFrom.GetBlue();
220 aColor.SetBlue( rFrom.GetBlue() + ( nDiff < 10 ? nDiff : 10 ) );
221 }
222 else if( rFrom.GetBlue() > rTo.GetBlue() )
223 {
224 nDiff = rFrom.GetBlue() - rTo.GetBlue();
225 aColor.SetBlue( rFrom.GetBlue() - ( nDiff < 10 ? nDiff : 10 ) );
226 }
227 else
228 aColor.SetBlue( rFrom.GetBlue() );
229
230 return aColor;
231 }
232
233 #define DELTA 5.0
Paint(const Rectangle & rRect)234 void MyWin::Paint( const Rectangle& rRect )
235 {
236 WorkWindow::Paint( rRect );
237
238 Push( PUSH_ALL );
239 MapMode aMapMode( MAP_100TH_MM );
240
241 SetMapMode( aMapMode );
242
243 Size aPaperSize = GetOutputSize();
244 Point aCenter( aPaperSize.Width()/2-300,
245 (aPaperSize.Height() - 8400)/2 + 8400 );
246 Point aP1( aPaperSize.Width()/48, 0), aP2( aPaperSize.Width()/40, 0 ), aPoint;
247
248 DrawRect( Rectangle( Point( 0,0 ), aPaperSize ) );
249 DrawRect( Rectangle( Point( 100,100 ),
250 Size( aPaperSize.Width()-200,
251 aPaperSize.Height()-200 ) ) );
252 DrawRect( Rectangle( Point( 200,200 ),
253 Size( aPaperSize.Width()-400,
254 aPaperSize.Height()-400 ) ) );
255 DrawRect( Rectangle( Point( 300,300 ),
256 Size( aPaperSize.Width()-600,
257 aPaperSize.Height()-600 ) ) );
258
259 // AllSettings aSettings( Application::GetSettings() );
260
261 const int nFontCount = GetDevFontCount();
262 const int nFontSamples = (nFontCount<15) ? nFontCount : 15;
263 for( int i = 0; i < nFontSamples; ++i )
264 {
265 #if 0
266 Font aFont( GetFont() );
267 aFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM( "Courier" ) ) );
268 aFont.SetWeight( WEIGHT_NORMAL );
269 aFont.SetItalic( ITALIC_NONE );
270 #else
271 FontInfo aFont = GetDevFont( (i*nFontCount) / nFontSamples );
272 aFont.SetHeight( 400 + (i%7) * 100 );
273 aFont.SetOrientation( i * (3600 / nFontSamples) );
274 #endif
275 SetFont( aFont );
276
277 sal_uInt8 nRed = (i << 6) & 0xC0;
278 sal_uInt8 nGreen = (i << 4) & 0xC0;
279 sal_uInt8 nBlue = (i << 2) & 0xC0;
280 SetTextColor( Color( nRed, nGreen, nBlue ) );
281
282 OUStringBuffer aPrintText(1024);
283 long nMaxWidth = 0;
284
285 aPrintText.appendAscii( "SVP test program" );
286
287 DrawText( Rectangle( Point( (aPaperSize.Width() - 4000) / 2, 2000 ),
288 Size( aPaperSize.Width() - 2100 - nMaxWidth,
289 aPaperSize.Height() - 4000 ) ),
290 aPrintText.makeStringAndClear(),
291 TEXT_DRAW_MULTILINE );
292 }
293
294 SetFillColor();
295 DrawRect( Rectangle( Point( aPaperSize.Width() - 4000, 1000 ),
296 Size( 3000,3000 ) ) );
297 DrawBitmap( Point( aPaperSize.Width() - 4000, 1000 ),
298 Size( 3000,3000 ),
299 m_aBitmap );
300
301 Color aWhite( 0xff, 0xff, 0xff );
302 Color aBlack( 0, 0, 0 );
303 Color aLightRed( 0xff, 0, 0 );
304 Color aDarkRed( 0x40, 0, 0 );
305 Color aLightBlue( 0, 0, 0xff );
306 Color aDarkBlue( 0,0,0x40 );
307 Color aLightGreen( 0, 0xff, 0 );
308 Color aDarkGreen( 0, 0x40, 0 );
309
310 Gradient aGradient( GRADIENT_LINEAR, aBlack, aWhite );
311 aGradient.SetAngle( 900 );
312 DrawGradient( Rectangle( Point( 1000, 4500 ),
313 Size( aPaperSize.Width() - 2000,
314 500 ) ), aGradient );
315 aGradient.SetStartColor( aDarkRed );
316 aGradient.SetEndColor( aLightBlue );
317 DrawGradient( Rectangle( Point( 1000, 5300 ),
318 Size( aPaperSize.Width() - 2000,
319 500 ) ), aGradient );
320 aGradient.SetStartColor( aDarkBlue );
321 aGradient.SetEndColor( aLightGreen );
322 DrawGradient( Rectangle( Point( 1000, 6100 ),
323 Size( aPaperSize.Width() - 2000,
324 500 ) ), aGradient );
325 aGradient.SetStartColor( aDarkGreen );
326 aGradient.SetEndColor( aLightRed );
327 DrawGradient( Rectangle( Point( 1000, 6900 ),
328 Size( aPaperSize.Width() - 2000,
329 500 ) ), aGradient );
330
331
332
333 LineInfo aLineInfo( LINE_SOLID, 200 );
334 double sind = sin( DELTA*M_PI/180.0 );
335 double cosd = cos( DELTA*M_PI/180.0 );
336 double factor = 1 + (DELTA/1000.0);
337 int n=0;
338 Color aLineColor( 0, 0, 0 );
339 Color aApproachColor( 0, 0, 200 );
340 while ( aP2.X() < aCenter.X() && n++ < 680 )
341 {
342 aLineInfo.SetWidth( n/3 );
343 aLineColor = approachColor( aLineColor, aApproachColor );
344 SetLineColor( aLineColor );
345
346 // switch aproach color
347 if( aApproachColor.IsRGBEqual( aLineColor ) )
348 {
349 if( aApproachColor.GetRed() )
350 aApproachColor = Color( 0, 0, 200 );
351 else if( aApproachColor.GetGreen() )
352 aApproachColor = Color( 200, 0, 0 );
353 else
354 aApproachColor = Color( 0, 200, 0 );
355 }
356
357 DrawLine( project( aP1 ) + aCenter,
358 project( aP2 ) + aCenter,
359 aLineInfo );
360 aPoint.X() = (int)((((double)aP1.X())*cosd - ((double)aP1.Y())*sind)*factor);
361 aPoint.Y() = (int)((((double)aP1.Y())*cosd + ((double)aP1.X())*sind)*factor);
362 aP1 = aPoint;
363 aPoint.X() = (int)((((double)aP2.X())*cosd - ((double)aP2.Y())*sind)*factor);
364 aPoint.Y() = (int)((((double)aP2.Y())*cosd + ((double)aP2.X())*sind)*factor);
365 aP2 = aPoint;
366 }
367 Pop();
368 }
369
370 // -----------------------------------------------------------------------
371
Resize()372 void MyWin::Resize()
373 {
374 WorkWindow::Resize();
375 }
376