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 <vcl/builder.hxx>
21 : #include <vcl/msgbox.hxx>
22 : #include <sfx2/viewfrm.hxx>
23 : #include <sfx2/viewsh.hxx>
24 : #include <sfx2/objsh.hxx>
25 : #include <sfx2/request.hxx>
26 : #include <dialmgr.hxx>
27 : #include "cuigrfflt.hxx"
28 : #include <cuires.hrc>
29 : #include <svx/dialogs.hrc>
30 :
31 0 : GraphicPreviewWindow::GraphicPreviewWindow(vcl::Window* pParent,
32 : const WinBits nStyle)
33 : : Control(pParent, nStyle)
34 : , mpOrigGraphic(NULL)
35 : , mfScaleX(0.0)
36 0 : , mfScaleY(0.0)
37 : {
38 0 : }
39 :
40 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeGraphicPreviewWindow(vcl::Window *pParent, VclBuilder::stringmap &rMap)
41 : {
42 0 : WinBits nWinBits = WB_TABSTOP;
43 :
44 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
45 0 : if (!sBorder.isEmpty())
46 0 : nWinBits |= WB_BORDER;
47 :
48 0 : return new GraphicPreviewWindow(pParent, nWinBits);
49 : }
50 :
51 0 : Size GraphicPreviewWindow::GetOptimalSize() const
52 : {
53 0 : return LogicToPixel(Size(81, 73), MAP_APPFONT);
54 : }
55 :
56 :
57 :
58 0 : void GraphicPreviewWindow::Paint( const Rectangle& rRect )
59 : {
60 0 : Control::Paint( rRect );
61 :
62 0 : const Size aOutputSize( GetOutputSizePixel() );
63 :
64 0 : if( maPreview.IsAnimated() )
65 : {
66 0 : const Size aGraphicSize( LogicToPixel( maPreview.GetPrefSize(), maPreview.GetPrefMapMode() ) );
67 0 : const Point aGraphicPosition( ( aOutputSize.Width() - aGraphicSize.Width() ) >> 1,
68 0 : ( aOutputSize.Height() - aGraphicSize.Height() ) >> 1 );
69 0 : maPreview.StartAnimation( this, aGraphicPosition, aGraphicSize );
70 : }
71 : else
72 : {
73 0 : const Size aGraphicSize( maPreview.GetSizePixel() );
74 0 : const Point aGraphicPosition( ( aOutputSize.Width() - aGraphicSize.Width() ) >> 1,
75 0 : ( aOutputSize.Height() - aGraphicSize.Height() ) >> 1 );
76 0 : maPreview.Draw( this, aGraphicPosition, aGraphicSize );
77 : }
78 0 : }
79 :
80 :
81 :
82 0 : void GraphicPreviewWindow::SetPreview( const Graphic& rGraphic )
83 : {
84 0 : maPreview = rGraphic;
85 0 : Invalidate();
86 0 : }
87 :
88 0 : void GraphicPreviewWindow::ScaleImageToFit()
89 : {
90 0 : if (!mpOrigGraphic)
91 0 : return;
92 :
93 0 : maScaledOrig = *mpOrigGraphic;
94 :
95 0 : const Size aPreviewSize( GetOutputSizePixel() );
96 0 : Size aSizePixel(LogicToPixel(mpOrigGraphic->GetPrefSize(),
97 0 : mpOrigGraphic->GetPrefMapMode()));
98 0 : Size aGrfSize(aSizePixel);
99 :
100 0 : if( mpOrigGraphic->GetType() == GRAPHIC_BITMAP &&
101 0 : aPreviewSize.Width() && aPreviewSize.Height() &&
102 0 : aGrfSize.Width() && aGrfSize.Height() )
103 : {
104 0 : const double fGrfWH = (double) aGrfSize.Width() / aGrfSize.Height();
105 0 : const double fPreWH = (double) aPreviewSize.Width() / aPreviewSize.Height();
106 :
107 0 : if( fGrfWH < fPreWH )
108 : {
109 0 : aGrfSize.Width() = (long) ( aPreviewSize.Height() * fGrfWH );
110 0 : aGrfSize.Height() = aPreviewSize.Height();
111 : }
112 : else
113 : {
114 0 : aGrfSize.Width() = aPreviewSize.Width();
115 0 : aGrfSize.Height() = (long) ( aPreviewSize.Width() / fGrfWH );
116 : }
117 :
118 0 : mfScaleX = (double) aGrfSize.Width() / aSizePixel.Width();
119 0 : mfScaleY = (double) aGrfSize.Height() / aSizePixel.Height();
120 :
121 0 : if( !mpOrigGraphic->IsAnimated() )
122 : {
123 0 : BitmapEx aBmpEx( mpOrigGraphic->GetBitmapEx() );
124 :
125 0 : if( aBmpEx.Scale( aGrfSize, BMP_SCALE_DEFAULT ) )
126 0 : maScaledOrig = aBmpEx;
127 : }
128 : }
129 :
130 0 : maModifyHdl.Call(this);
131 : }
132 :
133 0 : void GraphicPreviewWindow::Resize()
134 : {
135 0 : Control::Resize();
136 0 : ScaleImageToFit();
137 0 : }
138 :
139 0 : GraphicFilterDialog::GraphicFilterDialog(vcl::Window* pParent,
140 : const OString& rID, const OUString& rUIXMLDescription,
141 : const Graphic& rGraphic)
142 : : ModalDialog(pParent, rID, rUIXMLDescription)
143 : , maModifyHdl(LINK( this, GraphicFilterDialog, ImplModifyHdl))
144 : , maSizePixel(LogicToPixel(rGraphic.GetPrefSize(),
145 0 : rGraphic.GetPrefMapMode()))
146 : {
147 0 : bIsBitmap = rGraphic.GetType() == GRAPHIC_BITMAP;
148 :
149 0 : maTimer.SetTimeoutHdl( LINK( this, GraphicFilterDialog, ImplPreviewTimeoutHdl ) );
150 0 : maTimer.SetTimeout( 5 );
151 :
152 0 : get(mpPreview, "preview");
153 0 : mpPreview->init(&rGraphic, maModifyHdl);
154 0 : }
155 :
156 :
157 :
158 0 : IMPL_LINK_NOARG(GraphicFilterDialog, ImplPreviewTimeoutHdl)
159 : {
160 0 : maTimer.Stop();
161 0 : mpPreview->SetPreview(GetFilteredGraphic(mpPreview->GetScaledOriginal(),
162 0 : mpPreview->GetScaleX(), mpPreview->GetScaleY()));
163 :
164 0 : return 0;
165 : }
166 :
167 :
168 :
169 0 : IMPL_LINK_NOARG(GraphicFilterDialog, ImplModifyHdl)
170 : {
171 0 : if (bIsBitmap)
172 : {
173 0 : maTimer.Stop();
174 0 : maTimer.Start();
175 : }
176 :
177 0 : return 0;
178 : }
179 :
180 :
181 : // - FilterMosaic -
182 :
183 :
184 0 : GraphicFilterMosaic::GraphicFilterMosaic( vcl::Window* pParent, const Graphic& rGraphic,
185 : sal_uInt16 nTileWidth, sal_uInt16 nTileHeight, bool bEnhanceEdges )
186 : : GraphicFilterDialog(pParent, "MosaicDialog",
187 0 : "cui/ui/mosaicdialog.ui", rGraphic)
188 : {
189 0 : get(mpMtrWidth, "width");
190 0 : get(mpMtrHeight, "height");
191 0 : get(mpCbxEdges, "edges");
192 :
193 0 : mpMtrWidth->SetValue( nTileWidth );
194 0 : mpMtrWidth->SetLast( GetGraphicSizePixel().Width() );
195 0 : mpMtrWidth->SetModifyHdl( GetModifyHdl() );
196 :
197 0 : mpMtrHeight->SetValue( nTileHeight );
198 0 : mpMtrHeight->SetLast( GetGraphicSizePixel().Height() );
199 0 : mpMtrHeight->SetModifyHdl( GetModifyHdl() );
200 :
201 0 : mpCbxEdges->Check( bEnhanceEdges );
202 0 : mpCbxEdges->SetToggleHdl( GetModifyHdl() );
203 :
204 0 : mpMtrWidth->GrabFocus();
205 0 : }
206 :
207 :
208 :
209 0 : Graphic GraphicFilterMosaic::GetFilteredGraphic( const Graphic& rGraphic,
210 : double fScaleX, double fScaleY )
211 : {
212 0 : Graphic aRet;
213 0 : const Size aSize( std::max( FRound( GetTileWidth() * fScaleX ), 1L ),
214 0 : std::max( FRound( GetTileHeight() * fScaleY ), 1L ) );
215 0 : BmpFilterParam aParam( aSize );
216 :
217 0 : if( rGraphic.IsAnimated() )
218 : {
219 0 : Animation aAnim( rGraphic.GetAnimation() );
220 :
221 0 : if( aAnim.Filter( BMP_FILTER_MOSAIC, &aParam ) )
222 : {
223 0 : if( IsEnhanceEdges() )
224 0 : aAnim.Filter( BMP_FILTER_SHARPEN );
225 :
226 0 : aRet = aAnim;
227 0 : }
228 : }
229 : else
230 : {
231 0 : BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
232 :
233 0 : if( aBmpEx.Filter( BMP_FILTER_MOSAIC, &aParam ) )
234 : {
235 0 : if( IsEnhanceEdges() )
236 0 : (void)aBmpEx.Filter( BMP_FILTER_SHARPEN );
237 :
238 0 : aRet = aBmpEx;
239 0 : }
240 : }
241 :
242 0 : return aRet;
243 : }
244 :
245 :
246 : // - GraphicFilterSmooth -
247 :
248 :
249 0 : GraphicFilterSmooth::GraphicFilterSmooth( vcl::Window* pParent, const Graphic& rGraphic, double nRadius)
250 : : GraphicFilterDialog(pParent, "SmoothDialog",
251 0 : "cui/ui/smoothdialog.ui", rGraphic)
252 : {
253 0 : get(mpMtrRadius, "radius");
254 :
255 0 : mpMtrRadius->SetValue( nRadius* 10 );
256 0 : mpMtrRadius->SetModifyHdl( GetModifyHdl() );
257 0 : mpMtrRadius->GrabFocus();
258 0 : }
259 :
260 :
261 :
262 0 : Graphic GraphicFilterSmooth::GetFilteredGraphic( const Graphic& rGraphic, double /*fScaleX*/, double /*fScaleY*/ )
263 : {
264 0 : Graphic aRet;
265 0 : BmpFilterParam aParam( GetRadius() );
266 :
267 0 : if( rGraphic.IsAnimated() )
268 : {
269 0 : Animation aAnim( rGraphic.GetAnimation() );
270 :
271 0 : if( aAnim.Filter( BMP_FILTER_SMOOTH, &aParam ) )
272 : {
273 0 : aRet = aAnim;
274 0 : }
275 : }
276 : else
277 : {
278 0 : BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
279 :
280 0 : if( aBmpEx.Filter( BMP_FILTER_SMOOTH, &aParam ) )
281 : {
282 0 : aRet = aBmpEx;
283 0 : }
284 : }
285 :
286 0 : return aRet;
287 : }
288 :
289 :
290 : // - GraphicFilterSolarize -
291 :
292 :
293 0 : GraphicFilterSolarize::GraphicFilterSolarize( vcl::Window* pParent, const Graphic& rGraphic,
294 : sal_uInt8 cGreyThreshold, bool bInvert )
295 : : GraphicFilterDialog(pParent, "SolarizeDialog",
296 0 : "cui/ui/solarizedialog.ui", rGraphic)
297 : {
298 0 : get(mpMtrThreshold, "value");
299 0 : get(mpCbxInvert, "invert");
300 :
301 0 : mpMtrThreshold->SetValue( FRound( cGreyThreshold / 2.55 ) );
302 0 : mpMtrThreshold->SetModifyHdl( GetModifyHdl() );
303 :
304 0 : mpCbxInvert->Check( bInvert );
305 0 : mpCbxInvert->SetToggleHdl( GetModifyHdl() );
306 0 : }
307 :
308 :
309 :
310 0 : Graphic GraphicFilterSolarize::GetFilteredGraphic( const Graphic& rGraphic,
311 : double /*fScaleX*/, double /*fScaleY*/ )
312 : {
313 0 : Graphic aRet;
314 0 : BmpFilterParam aParam( GetGreyThreshold() );
315 :
316 0 : if( rGraphic.IsAnimated() )
317 : {
318 0 : Animation aAnim( rGraphic.GetAnimation() );
319 :
320 0 : if( aAnim.Filter( BMP_FILTER_SOLARIZE, &aParam ) )
321 : {
322 0 : if( IsInvert() )
323 0 : aAnim.Invert();
324 :
325 0 : aRet = aAnim;
326 0 : }
327 : }
328 : else
329 : {
330 0 : BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
331 :
332 0 : if( aBmpEx.Filter( BMP_FILTER_SOLARIZE, &aParam ) )
333 : {
334 0 : if( IsInvert() )
335 0 : aBmpEx.Invert();
336 :
337 0 : aRet = aBmpEx;
338 0 : }
339 : }
340 :
341 0 : return aRet;
342 : }
343 :
344 :
345 : // - GraphicFilterSepia -
346 :
347 :
348 0 : GraphicFilterSepia::GraphicFilterSepia( vcl::Window* pParent, const Graphic& rGraphic,
349 : sal_uInt16 nSepiaPercent )
350 : : GraphicFilterDialog(pParent, "AgingDialog",
351 0 : "cui/ui/agingdialog.ui", rGraphic)
352 : {
353 0 : get(mpMtrSepia, "value");
354 :
355 0 : mpMtrSepia->SetValue( nSepiaPercent );
356 0 : mpMtrSepia->SetModifyHdl( GetModifyHdl() );
357 0 : }
358 :
359 :
360 :
361 0 : Graphic GraphicFilterSepia::GetFilteredGraphic( const Graphic& rGraphic,
362 : double /*fScaleX*/, double /*fScaleY*/ )
363 : {
364 0 : Graphic aRet;
365 0 : BmpFilterParam aParam( GetSepiaPercent() );
366 :
367 0 : if( rGraphic.IsAnimated() )
368 : {
369 0 : Animation aAnim( rGraphic.GetAnimation() );
370 :
371 0 : if( aAnim.Filter( BMP_FILTER_SEPIA, &aParam ) )
372 0 : aRet = aAnim;
373 : }
374 : else
375 : {
376 0 : BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
377 :
378 0 : if( aBmpEx.Filter( BMP_FILTER_SEPIA, &aParam ) )
379 0 : aRet = aBmpEx;
380 : }
381 :
382 0 : return aRet;
383 : }
384 :
385 :
386 : // - GraphicFilterPoster -
387 :
388 :
389 0 : GraphicFilterPoster::GraphicFilterPoster(vcl::Window* pParent, const Graphic& rGraphic,
390 : sal_uInt16 nPosterCount)
391 : : GraphicFilterDialog(pParent, "PosterDialog",
392 0 : "cui/ui/posterdialog.ui", rGraphic)
393 : {
394 0 : get(mpNumPoster, "value");
395 :
396 0 : mpNumPoster->SetFirst( 2 );
397 0 : mpNumPoster->SetLast( rGraphic.GetBitmapEx().GetBitCount() );
398 0 : mpNumPoster->SetValue( nPosterCount );
399 0 : mpNumPoster->SetModifyHdl( GetModifyHdl() );
400 0 : }
401 :
402 :
403 :
404 0 : Graphic GraphicFilterPoster::GetFilteredGraphic( const Graphic& rGraphic,
405 : double /*fScaleX*/, double /*fScaleY*/ )
406 : {
407 0 : Graphic aRet;
408 0 : const sal_uInt16 nPosterCount = GetPosterColorCount();
409 :
410 0 : if( rGraphic.IsAnimated() )
411 : {
412 0 : Animation aAnim( rGraphic.GetAnimation() );
413 :
414 0 : if( aAnim.ReduceColors( nPosterCount, BMP_REDUCE_POPULAR ) )
415 0 : aRet = aAnim;
416 : }
417 : else
418 : {
419 0 : BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
420 :
421 0 : if( aBmpEx.ReduceColors( nPosterCount, BMP_REDUCE_POPULAR ) )
422 0 : aRet = aBmpEx;
423 : }
424 :
425 0 : return aRet;
426 : }
427 :
428 :
429 : // - GraphicFilterEmboss -
430 :
431 :
432 0 : void EmbossControl::MouseButtonDown( const MouseEvent& rEvt )
433 : {
434 0 : const RECT_POINT eOldRP = GetActualRP();
435 :
436 0 : SvxRectCtl::MouseButtonDown( rEvt );
437 :
438 0 : if( GetActualRP() != eOldRP )
439 0 : maModifyHdl.Call( this );
440 0 : }
441 :
442 0 : Size EmbossControl::GetOptimalSize() const
443 : {
444 0 : return LogicToPixel(Size(77, 60), MAP_APPFONT);
445 : }
446 :
447 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeEmbossControl(vcl::Window *pParent, VclBuilder::stringmap &)
448 : {
449 0 : return new EmbossControl(pParent);
450 : }
451 :
452 :
453 :
454 0 : GraphicFilterEmboss::GraphicFilterEmboss(vcl::Window* pParent,
455 : const Graphic& rGraphic, RECT_POINT eLightSource)
456 : : GraphicFilterDialog (pParent, "EmbossDialog",
457 0 : "cui/ui/embossdialog.ui", rGraphic)
458 : {
459 0 : get(mpCtlLight, "lightsource");
460 0 : mpCtlLight->SetActualRP(eLightSource);
461 0 : mpCtlLight->SetModifyHdl( GetModifyHdl() );
462 0 : mpCtlLight->GrabFocus();
463 0 : }
464 :
465 :
466 :
467 0 : Graphic GraphicFilterEmboss::GetFilteredGraphic( const Graphic& rGraphic,
468 : double /*fScaleX*/, double /*fScaleY*/ )
469 : {
470 0 : Graphic aRet;
471 : sal_uInt16 nAzim, nElev;
472 :
473 0 : switch( mpCtlLight->GetActualRP() )
474 : {
475 : default: OSL_FAIL("svx::GraphicFilterEmboss::GetFilteredGraphic(), unknown Reference Point!" );
476 : /* Fall through */
477 0 : case( RP_LT ): nAzim = 4500, nElev = 4500; break;
478 0 : case( RP_MT ): nAzim = 9000, nElev = 4500; break;
479 0 : case( RP_RT ): nAzim = 13500, nElev = 4500; break;
480 0 : case( RP_LM ): nAzim = 0, nElev = 4500; break;
481 0 : case( RP_MM ): nAzim = 0, nElev = 9000; break;
482 0 : case( RP_RM ): nAzim = 18000, nElev = 4500; break;
483 0 : case( RP_LB ): nAzim = 31500, nElev = 4500; break;
484 0 : case( RP_MB ): nAzim = 27000, nElev = 4500; break;
485 0 : case( RP_RB ): nAzim = 22500, nElev = 4500; break;
486 : }
487 :
488 0 : BmpFilterParam aParam( nAzim, nElev );
489 :
490 0 : if( rGraphic.IsAnimated() )
491 : {
492 0 : Animation aAnim( rGraphic.GetAnimation() );
493 :
494 0 : if( aAnim.Filter( BMP_FILTER_EMBOSS_GREY, &aParam ) )
495 0 : aRet = aAnim;
496 : }
497 : else
498 : {
499 0 : BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
500 :
501 0 : if( aBmpEx.Filter( BMP_FILTER_EMBOSS_GREY, &aParam ) )
502 0 : aRet = aBmpEx;
503 : }
504 :
505 0 : return aRet;
506 0 : }
507 :
508 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|