xref: /trunk/main/cui/source/dialogs/cuigrfflt.cxx (revision 2ee96f1c)
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_cui.hxx"
26 
27 #include <tools/shl.hxx>
28 #include <vcl/msgbox.hxx>
29 #include <sfx2/viewfrm.hxx>
30 #include <sfx2/viewsh.hxx>
31 #include <sfx2/objsh.hxx>
32 #include <sfx2/request.hxx>
33 #include <dialmgr.hxx>
34 #include "cuigrfflt.hxx"
35 #include "grfflt.hrc"
36 #include <cuires.hrc>
37 #include <svx/dialogs.hrc> // RID_SVX_GRFFILTER_DLG_...
38 
39 // --------------------
40 // - SvxGraphicFilter -
41 // --------------------
42 /*
43 sal_uLong SvxGraphicFilter::ExecuteGrfFilterSlot( SfxRequest& rReq, GraphicObject& rFilterObject )
44 {
45 	const Graphic&	rGraphic = rFilterObject.GetGraphic();
46 	sal_uLong			nRet;
47 
48 	if( rGraphic.GetType() == GRAPHIC_BITMAP )
49 	{
50 		SfxViewFrame*	pViewFrame = SfxViewFrame::Current();
51 		SfxObjectShell*	pShell = pViewFrame ? pViewFrame->GetObjectShell() : NULL;
52 		Window*			pWindow = ( pViewFrame && pViewFrame->GetViewShell() ) ? pViewFrame->GetViewShell()->GetWindow() : NULL;
53 		Graphic			aGraphic;
54 
55 		switch( rReq.GetSlot() )
56 		{
57 			case( SID_GRFFILTER_INVERT ):
58 			{
59 				if( pShell )
60 					pShell->SetWaitCursor( sal_True );
61 
62 				if( rGraphic.IsAnimated() )
63 				{
64 					Animation aAnimation( rGraphic.GetAnimation() );
65 
66 					if( aAnimation.Invert() )
67 						aGraphic = aAnimation;
68 				}
69 				else
70 				{
71 					BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
72 
73 					if( aBmpEx.Invert() )
74 						aGraphic = aBmpEx;
75 				}
76 
77 				if( pShell )
78 					pShell->SetWaitCursor( sal_False );
79 			}
80 			break;
81 
82 			case( SID_GRFFILTER_SMOOTH ):
83 			{
84 				if( pShell )
85 					pShell->SetWaitCursor( sal_True );
86 
87 				if( rGraphic.IsAnimated() )
88 				{
89 					Animation aAnimation( rGraphic.GetAnimation() );
90 
91 					if( aAnimation.Filter( BMP_FILTER_SMOOTH ) )
92 						aGraphic = aAnimation;
93 				}
94 				else
95 				{
96 					BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
97 
98 					if( aBmpEx.Filter( BMP_FILTER_SMOOTH ) )
99 						aGraphic = aBmpEx;
100 				}
101 
102 				if( pShell )
103 					pShell->SetWaitCursor( sal_False );
104 			}
105 			break;
106 
107 			case( SID_GRFFILTER_SHARPEN ):
108 			{
109 				if( pShell )
110 					pShell->SetWaitCursor( sal_True );
111 
112 				if( rGraphic.IsAnimated() )
113 				{
114 					Animation aAnimation( rGraphic.GetAnimation() );
115 
116 					if( aAnimation.Filter( BMP_FILTER_SHARPEN ) )
117 						aGraphic = aAnimation;
118 				}
119 				else
120 				{
121 					BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
122 
123 					if( aBmpEx.Filter( BMP_FILTER_SHARPEN ) )
124 						aGraphic = aBmpEx;
125 				}
126 
127 				if( pShell )
128 					pShell->SetWaitCursor( sal_False );
129 			}
130 			break;
131 
132 			case( SID_GRFFILTER_REMOVENOISE ):
133 			{
134 				if( pShell )
135 					pShell->SetWaitCursor( sal_True );
136 
137 				if( rGraphic.IsAnimated() )
138 				{
139 					Animation aAnimation( rGraphic.GetAnimation() );
140 
141 					if( aAnimation.Filter( BMP_FILTER_REMOVENOISE ) )
142 						aGraphic = aAnimation;
143 				}
144 				else
145 				{
146 					BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
147 
148 					if( aBmpEx.Filter( BMP_FILTER_REMOVENOISE ) )
149 						aGraphic = aBmpEx;
150 				}
151 
152 				if( pShell )
153 					pShell->SetWaitCursor( sal_False );
154 			}
155 			break;
156 
157 			case( SID_GRFFILTER_SOBEL ):
158 			{
159 				if( pShell )
160 					pShell->SetWaitCursor( sal_True );
161 
162 				if( rGraphic.IsAnimated() )
163 				{
164 					Animation aAnimation( rGraphic.GetAnimation() );
165 
166 					if( aAnimation.Filter( BMP_FILTER_SOBEL_GREY ) )
167 						aGraphic = aAnimation;
168 				}
169 				else
170 				{
171 					BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
172 
173 					if( aBmpEx.Filter( BMP_FILTER_SOBEL_GREY ) )
174 						aGraphic = aBmpEx;
175 				}
176 
177 				if( pShell )
178 					pShell->SetWaitCursor( sal_False );
179 			}
180 			break;
181 
182 			case( SID_GRFFILTER_MOSAIC ):
183 			{
184 				GraphicFilterMosaic aDlg( pWindow, rGraphic, 4, 4, sal_False );
185 
186 				if( aDlg.Execute() == RET_OK )
187 					aGraphic = aDlg.GetFilteredGraphic( rGraphic, 1.0, 1.0 );
188 			}
189 			break;
190 
191 			case( SID_GRFFILTER_EMBOSS	):
192 			{
193 				GraphicFilterEmboss aDlg( pWindow, rGraphic, RP_MM );
194 
195 				if( aDlg.Execute() == RET_OK )
196 					aGraphic = aDlg.GetFilteredGraphic( rGraphic, 1.0, 1.0 );
197 			}
198 			break;
199 
200 			case( SID_GRFFILTER_POSTER	):
201 			{
202 				GraphicFilterPoster aDlg( pWindow, rGraphic, 16 );
203 
204 				if( aDlg.Execute() == RET_OK )
205 					aGraphic = aDlg.GetFilteredGraphic( rGraphic, 1.0, 1.0 );
206 			}
207 			break;
208 
209 			case( SID_GRFFILTER_POPART	):
210 			{
211 				if( pShell )
212 					pShell->SetWaitCursor( sal_True );
213 
214 				if( rGraphic.IsAnimated() )
215 				{
216 					Animation aAnimation( rGraphic.GetAnimation() );
217 
218 					if( aAnimation.Filter( BMP_FILTER_POPART ) )
219 						aGraphic = aAnimation;
220 				}
221 				else
222 				{
223 					BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
224 
225 					if( aBmpEx.Filter( BMP_FILTER_POPART ) )
226 						aGraphic = aBmpEx;
227 				}
228 
229 				if( pShell )
230 					pShell->SetWaitCursor( sal_False );
231 			}
232 			break;
233 
234 			case( SID_GRFFILTER_SEPIA ):
235 			{
236 				GraphicFilterSepia aDlg( pWindow, rGraphic, 10 );
237 
238 				if( aDlg.Execute() == RET_OK )
239 					aGraphic = aDlg.GetFilteredGraphic( rGraphic, 1.0, 1.0 );
240 			}
241 			break;
242 
243 			case( SID_GRFFILTER_SOLARIZE ):
244 			{
245 				GraphicFilterSolarize aDlg( pWindow, rGraphic, 128, sal_False );
246 
247 				if( aDlg.Execute() == RET_OK )
248 					aGraphic = aDlg.GetFilteredGraphic( rGraphic, 1.0, 1.0 );
249 			}
250 			break;
251 
252 			default:
253 			{
254 				DBG_ERROR( "SvxGraphicFilter: selected filter slot not yet implemented" );
255 				nRet = SVX_GRAPHICFILTER_UNSUPPORTED_SLOT;
256 			}
257 			break;
258 		}
259 
260 		if( aGraphic.GetType() != GRAPHIC_NONE )
261 		{
262 			rFilterObject.SetGraphic( aGraphic );
263 			nRet = SVX_GRAPHICFILTER_ERRCODE_NONE;
264 		}
265 	}
266 	else
267 		nRet = SVX_GRAPHICFILTER_UNSUPPORTED_GRAPHICTYPE;
268 
269 	return nRet;
270 }
271 
272 // -----------------------------------------------------------------------------
273 
274 void SvxGraphicFilter::DisableGraphicFilterSlots( SfxItemSet& rSet )
275 {
276 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER ) )
277 		rSet.DisableItem( SID_GRFFILTER );
278 
279 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_INVERT ) )
280 		rSet.DisableItem( SID_GRFFILTER_INVERT );
281 
282 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_SMOOTH ) )
283 		rSet.DisableItem( SID_GRFFILTER_SMOOTH );
284 
285 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_SHARPEN ) )
286 		rSet.DisableItem( SID_GRFFILTER_SHARPEN );
287 
288 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_REMOVENOISE ) )
289 		rSet.DisableItem( SID_GRFFILTER_REMOVENOISE );
290 
291 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_SOBEL ) )
292 		rSet.DisableItem( SID_GRFFILTER_SOBEL );
293 
294 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_MOSAIC ) )
295 		rSet.DisableItem( SID_GRFFILTER_MOSAIC );
296 
297 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_EMBOSS ) )
298 		rSet.DisableItem( SID_GRFFILTER_EMBOSS );
299 
300 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_POSTER ) )
301 		rSet.DisableItem( SID_GRFFILTER_POSTER );
302 
303 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_POPART ) )
304 		rSet.DisableItem( SID_GRFFILTER_POPART );
305 
306 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_SEPIA ) )
307 		rSet.DisableItem( SID_GRFFILTER_SEPIA );
308 
309 	if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( SID_GRFFILTER_SOLARIZE ) )
310 		rSet.DisableItem( SID_GRFFILTER_SOLARIZE );
311 };
312 */
313 // --------------------------------------
314 // - GraphicFilterDialog::PreviewWindow -
315 // --------------------------------------
316 
317 GraphicFilterDialog::PreviewWindow::PreviewWindow( Window* pParent, const ResId& rResId ) :
318 	Control( pParent, rResId )
319 {
320 }
321 
322 // -----------------------------------------------------------------------------
323 
324 GraphicFilterDialog::PreviewWindow::~PreviewWindow()
325 {
326 }
327 
328 // -----------------------------------------------------------------------------
329 
330 void GraphicFilterDialog::PreviewWindow::Paint( const Rectangle& rRect )
331 {
332 	Control::Paint( rRect );
333 
334 	const Size	aGrfSize( LogicToPixel( maGraphic.GetPrefSize(), maGraphic.GetPrefMapMode() ) );
335 	const Size	aOutSize( GetOutputSizePixel() );
336 	const Point aGrfPos( ( aOutSize.Width() - aGrfSize.Width() ) >> 1,
337 						 ( aOutSize.Height() - aGrfSize.Height() ) >> 1 );
338 
339 	if( maGraphic.IsAnimated() )
340 		maGraphic.StartAnimation( this , aGrfPos, aGrfSize );
341 	else
342 		maGraphic.Draw( this, aGrfPos, aGrfSize );
343 }
344 
345 // -----------------------------------------------------------------------------
346 
347 void GraphicFilterDialog::PreviewWindow::SetGraphic( const Graphic& rGraphic )
348 {
349 	maGraphic = rGraphic;
350 
351 	if( maGraphic.IsAnimated() || maGraphic.IsTransparent() )
352 		Invalidate();
353 	else
354 		Paint( Rectangle( Point(), GetOutputSizePixel() ) );
355 }
356 
357 // -----------------------
358 // - GraphicFilterDialog -
359 // -----------------------
360 
361 GraphicFilterDialog::GraphicFilterDialog( Window* pParent, const ResId& rResId, const Graphic& rGraphic ) :
362 	ModalDialog		( pParent, rResId ),
363     maModifyHdl     ( LINK( this, GraphicFilterDialog, ImplModifyHdl ) ),
364     mfScaleX        ( 0.0 ),
365 	mfScaleY		( 0.0 ),
366 	maSizePixel		( LogicToPixel( rGraphic.GetPrefSize(), rGraphic.GetPrefMapMode() ) ),
367     maPreview       ( this, CUI_RES( CTL_PREVIEW ) ),
368 	maBtnOK			( this, CUI_RES( BTN_OK ) ),
369 	maBtnCancel		( this, CUI_RES( BTN_CANCEL ) ),
370 	maBtnHelp		( this, CUI_RES( BTN_HELP ) ),
371 	maFlParameter	( this, CUI_RES( FL_PARAMETER ) )
372 {
373 	const Size	aPreviewSize( maPreview.GetOutputSizePixel() );
374 	Size		aGrfSize( maSizePixel );
375 
376 	if( rGraphic.GetType() == GRAPHIC_BITMAP &&
377 		aPreviewSize.Width() && aPreviewSize.Height() &&
378 		aGrfSize.Width() && aGrfSize.Height() )
379 	{
380 		const double fGrfWH = (double) aGrfSize.Width() / aGrfSize.Height();
381 		const double fPreWH = (double) aPreviewSize.Width() / aPreviewSize.Height();
382 
383 		if( fGrfWH < fPreWH )
384 		{
385 			aGrfSize.Width() = (long) ( aPreviewSize.Height() * fGrfWH );
386 			aGrfSize.Height()= aPreviewSize.Height();
387 		}
388 		else
389 		{
390 			aGrfSize.Width() = aPreviewSize.Width();
391 			aGrfSize.Height()= (long) ( aPreviewSize.Width() / fGrfWH);
392 		}
393 
394 		mfScaleX = (double) aGrfSize.Width() / maSizePixel.Width();
395 		mfScaleY = (double) aGrfSize.Height() / maSizePixel.Height();
396 
397 		if( !rGraphic.IsAnimated() )
398 		{
399 			BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
400 
401 			if( aBmpEx.Scale( aGrfSize, BMP_SCALE_INTERPOLATE ) )
402 				maGraphic = aBmpEx;
403 		}
404 	}
405 
406 	maTimer.SetTimeoutHdl( LINK( this, GraphicFilterDialog, ImplPreviewTimeoutHdl ) );
407 	maTimer.SetTimeout( 100 );
408 	ImplModifyHdl( NULL );
409 }
410 
411 // -----------------------------------------------------------------------------
412 
413 GraphicFilterDialog::~GraphicFilterDialog()
414 {
415 }
416 
417 // -----------------------------------------------------------------------------
418 
419 IMPL_LINK( GraphicFilterDialog, ImplPreviewTimeoutHdl, Timer*, EMPTYARG )
420 {
421 	maTimer.Stop();
422 	maPreview.SetGraphic( GetFilteredGraphic( maGraphic, mfScaleX, mfScaleY ) );
423 
424 	return 0;
425 }
426 
427 // -----------------------------------------------------------------------------
428 
429 IMPL_LINK( GraphicFilterDialog, ImplModifyHdl, void*, EMPTYARG )
430 {
431 	if( maGraphic.GetType() == GRAPHIC_BITMAP )
432 	{
433 		maTimer.Stop();
434 		maTimer.Start();
435 	}
436 
437 	return 0;
438 }
439 
440 // ----------------
441 // - FilterMosaic -
442 // ----------------
443 
444 GraphicFilterMosaic::GraphicFilterMosaic( Window* pParent, const Graphic& rGraphic,
445 										  sal_uInt16 nTileWidth, sal_uInt16 nTileHeight, sal_Bool bEnhanceEdges ) :
446 	GraphicFilterDialog( pParent, CUI_RES( RID_SVX_GRFFILTER_DLG_MOSAIC ), rGraphic ),
447 	maFtWidth	( this, CUI_RES( DLG_FILTERMOSAIC_FT_WIDTH ) ),
448 	maMtrWidth	( this, CUI_RES( DLG_FILTERMOSAIC_MTR_WIDTH ) ),
449 	maFtHeight	( this, CUI_RES( DLG_FILTERMOSAIC_FT_HEIGHT ) ),
450 	maMtrHeight ( this, CUI_RES( DLG_FILTERMOSAIC_MTR_HEIGHT ) ),
451 	maCbxEdges	( this, CUI_RES( DLG_FILTERMOSAIC_CBX_EDGES ) )
452 {
453 	FreeResource();
454 
455 	maMtrWidth.SetValue( nTileWidth );
456 	maMtrWidth.SetLast( GetGraphicSizePixel().Width() );
457 	maMtrWidth.SetModifyHdl( GetModifyHdl() );
458 
459 	maMtrHeight.SetValue( nTileHeight );
460 	maMtrHeight.SetLast( GetGraphicSizePixel().Height() );
461 	maMtrHeight.SetModifyHdl( GetModifyHdl() );
462 
463 	maCbxEdges.Check( bEnhanceEdges );
464 	maCbxEdges.SetToggleHdl( GetModifyHdl() );
465 
466 	maMtrWidth.GrabFocus();
467 
468 	maFtWidth.SetAccessibleRelationMemberOf(&maFlParameter);
469 	maMtrWidth.SetAccessibleRelationMemberOf(&maFlParameter);
470 	maFtHeight.SetAccessibleRelationMemberOf(&maFlParameter);
471 	maMtrHeight.SetAccessibleRelationMemberOf(&maFlParameter);
472 	maCbxEdges.SetAccessibleRelationMemberOf(&maFlParameter);
473 }
474 
475 // -----------------------------------------------------------------------------
476 
477 GraphicFilterMosaic::~GraphicFilterMosaic()
478 {
479 }
480 
481 // -----------------------------------------------------------------------------
482 
483 Graphic	GraphicFilterMosaic::GetFilteredGraphic( const Graphic& rGraphic,
484 												 double fScaleX, double fScaleY )
485 {
486 	Graphic			aRet;
487 	const Size		aSize( Max( FRound( GetTileWidth() * fScaleX ), 1L ),
488 						   Max( FRound( GetTileHeight() * fScaleY ), 1L ) );
489 	BmpFilterParam	aParam( aSize );
490 
491 	if( rGraphic.IsAnimated() )
492 	{
493 		Animation aAnim( rGraphic.GetAnimation() );
494 
495 		if( aAnim.Filter( BMP_FILTER_MOSAIC, &aParam ) )
496 		{
497 			if( IsEnhanceEdges() )
498 				aAnim.Filter( BMP_FILTER_SHARPEN );
499 
500 			aRet = aAnim;
501 		}
502 	}
503 	else
504 	{
505 		BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
506 
507 		if( aBmpEx.Filter( BMP_FILTER_MOSAIC, &aParam ) )
508 		{
509 			if( IsEnhanceEdges() )
510 				aBmpEx.Filter( BMP_FILTER_SHARPEN );
511 
512 			aRet = aBmpEx;
513 		}
514 	}
515 
516 	return aRet;
517 }
518 
519 // ------------------
520 // - GraphicFilterSolarize -
521 // ------------------
522 
523 GraphicFilterSolarize::GraphicFilterSolarize( Window* pParent, const Graphic& rGraphic,
524 											  sal_uInt8 cGreyThreshold, sal_Bool bInvert ) :
525 	GraphicFilterDialog	( pParent, CUI_RES( RID_SVX_GRFFILTER_DLG_SOLARIZE ), rGraphic ),
526 	maFtThreshold	( this, CUI_RES( DLG_FILTERSOLARIZE_FT_THRESHOLD ) ),
527 	maMtrThreshold	( this, CUI_RES( DLG_FILTERSOLARIZE_MTR_THRESHOLD ) ),
528 	maCbxInvert		( this, CUI_RES( DLG_FILTERSOLARIZE_CBX_INVERT ) )
529 {
530 	FreeResource();
531 
532 	maMtrThreshold.SetValue( FRound( cGreyThreshold / 2.55 ) );
533 	maMtrThreshold.SetModifyHdl( GetModifyHdl() );
534 
535 	maCbxInvert.Check( bInvert );
536 	maCbxInvert.SetToggleHdl( GetModifyHdl() );
537 
538 	maMtrThreshold.GrabFocus();
539 }
540 
541 // -----------------------------------------------------------------------------
542 
543 GraphicFilterSolarize::~GraphicFilterSolarize()
544 {
545 }
546 
547 // -----------------------------------------------------------------------------
548 
549 Graphic	GraphicFilterSolarize::GetFilteredGraphic( const Graphic& rGraphic,
550                                                    double /*fScaleX*/, double /*fScaleY*/ )
551 {
552 	Graphic			aRet;
553 	BmpFilterParam	aParam( GetGreyThreshold() );
554 
555 	if( rGraphic.IsAnimated() )
556 	{
557 		Animation aAnim( rGraphic.GetAnimation() );
558 
559 		if( aAnim.Filter( BMP_FILTER_SOLARIZE, &aParam ) )
560 		{
561 			if( IsInvert() )
562 				aAnim.Invert();
563 
564 			aRet = aAnim;
565 		}
566 	}
567 	else
568 	{
569 		BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
570 
571 		if( aBmpEx.Filter( BMP_FILTER_SOLARIZE, &aParam ) )
572 		{
573 			if( IsInvert() )
574 				aBmpEx.Invert();
575 
576 			aRet = aBmpEx;
577 		}
578 	}
579 
580 	return aRet;
581 }
582 
583 // ----------------------
584 // - GraphicFilterSepia -
585 // ----------------------
586 
587 GraphicFilterSepia::GraphicFilterSepia( Window* pParent, const Graphic& rGraphic,
588 										sal_uInt16 nSepiaPercent ) :
589 	GraphicFilterDialog	( pParent, CUI_RES( RID_SVX_GRFFILTER_DLG_SEPIA ), rGraphic ),
590 	maFtSepia		( this, CUI_RES( DLG_FILTERSEPIA_FT_SEPIA ) ),
591 	maMtrSepia		( this, CUI_RES( DLG_FILTERSEPIA_MTR_SEPIA ) )
592 {
593 	FreeResource();
594 
595 	maMtrSepia.SetValue( nSepiaPercent );
596 	maMtrSepia.SetModifyHdl( GetModifyHdl() );
597 
598 	maMtrSepia.GrabFocus();
599 }
600 
601 // -----------------------------------------------------------------------------
602 
603 GraphicFilterSepia::~GraphicFilterSepia()
604 {
605 }
606 
607 // -----------------------------------------------------------------------------
608 
609 Graphic	GraphicFilterSepia::GetFilteredGraphic( const Graphic& rGraphic,
610                                                 double /*fScaleX*/, double /*fScaleY*/ )
611 {
612 	Graphic			aRet;
613 	BmpFilterParam	aParam( GetSepiaPercent() );
614 
615 	if( rGraphic.IsAnimated() )
616 	{
617 		Animation aAnim( rGraphic.GetAnimation() );
618 
619 		if( aAnim.Filter( BMP_FILTER_SEPIA, &aParam ) )
620 			aRet = aAnim;
621 	}
622 	else
623 	{
624 		BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
625 
626 		if( aBmpEx.Filter( BMP_FILTER_SEPIA, &aParam ) )
627 			aRet = aBmpEx;
628 	}
629 
630 	return aRet;
631 }
632 
633 // -----------------------
634 // - GraphicFilterPoster -
635 // -----------------------
636 
637 GraphicFilterPoster::GraphicFilterPoster( Window* pParent, const Graphic& rGraphic,
638 										  sal_uInt16 nPosterCount ) :
639 	GraphicFilterDialog	( pParent, CUI_RES( RID_SVX_GRFFILTER_DLG_POSTER ), rGraphic ),
640 	maFtPoster		( this, CUI_RES( DLG_FILTERPOSTER_FT_POSTER ) ),
641 	maNumPoster		( this, CUI_RES( DLG_FILTERPOSTER_NUM_POSTER ) )
642 {
643 	FreeResource();
644 
645     maNumPoster.SetFirst( 2 );
646     maNumPoster.SetLast( rGraphic.GetBitmapEx().GetBitCount() );
647 	maNumPoster.SetValue( nPosterCount );
648 	maNumPoster.SetModifyHdl( GetModifyHdl() );
649 	maNumPoster.GrabFocus();
650 }
651 
652 // -----------------------------------------------------------------------------
653 
654 GraphicFilterPoster::~GraphicFilterPoster()
655 {
656 }
657 
658 // -----------------------------------------------------------------------------
659 
660 Graphic	GraphicFilterPoster::GetFilteredGraphic( const Graphic& rGraphic,
661                                                  double /*fScaleX*/, double /*fScaleY*/ )
662 {
663 	Graphic			aRet;
664 	const sal_uInt16	nPosterCount = GetPosterColorCount();
665 
666 	if( rGraphic.IsAnimated() )
667 	{
668 		Animation aAnim( rGraphic.GetAnimation() );
669 
670 		if( aAnim.ReduceColors( nPosterCount, BMP_REDUCE_POPULAR ) )
671 			aRet = aAnim;
672 	}
673 	else
674 	{
675 		BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
676 
677 		if( aBmpEx.ReduceColors( nPosterCount, BMP_REDUCE_POPULAR ) )
678 			aRet = aBmpEx;
679 	}
680 
681 	return aRet;
682 }
683 
684 // -----------------------
685 // - GraphicFilterEmboss -
686 // -----------------------
687 
688 void GraphicFilterEmboss::EmbossControl::MouseButtonDown( const MouseEvent& rEvt )
689 {
690 	const RECT_POINT eOldRP = GetActualRP();
691 
692 	SvxRectCtl::MouseButtonDown( rEvt );
693 
694 	if( GetActualRP() != eOldRP )
695 		maModifyHdl.Call( this );
696 }
697 
698 // -----------------------------------------------------------------------------
699 
700 GraphicFilterEmboss::GraphicFilterEmboss( Window* pParent, const Graphic& rGraphic,
701 										  RECT_POINT eLightSource ) :
702 	GraphicFilterDialog	( pParent, CUI_RES( RID_SVX_GRFFILTER_DLG_EMBOSS ), rGraphic ),
703 	maFtLight		( this, CUI_RES( DLG_FILTEREMBOSS_FT_LIGHT ) ),
704 	maCtlLight		( this, CUI_RES( DLG_FILTEREMBOSS_CTL_LIGHT ), eLightSource )
705 {
706 	FreeResource();
707 
708 	maCtlLight.SetModifyHdl( GetModifyHdl() );
709 	maCtlLight.GrabFocus();
710 }
711 
712 // -----------------------------------------------------------------------------
713 
714 GraphicFilterEmboss::~GraphicFilterEmboss()
715 {
716 }
717 
718 // -----------------------------------------------------------------------------
719 
720 Graphic	GraphicFilterEmboss::GetFilteredGraphic( const Graphic& rGraphic,
721                                                  double /*fScaleX*/, double /*fScaleY*/ )
722 {
723 	Graphic	aRet;
724 	sal_uInt16	nAzim, nElev;
725 
726 	switch( maCtlLight.GetActualRP() )
727 	{
728 		default:	   DBG_ERROR("svx::GraphicFilterEmboss::GetFilteredGraphic(), unknown Reference Point!" );
729 		case( RP_LT ): nAzim = 4500,	nElev = 4500; break;
730 		case( RP_MT ): nAzim = 9000,	nElev = 4500; break;
731 		case( RP_RT ): nAzim = 13500,	nElev = 4500; break;
732 		case( RP_LM ): nAzim = 0,		nElev = 4500; break;
733 		case( RP_MM ): nAzim = 0,		nElev = 9000; break;
734 		case( RP_RM ): nAzim = 18000,	nElev = 4500; break;
735 		case( RP_LB ): nAzim = 31500,	nElev = 4500; break;
736 		case( RP_MB ): nAzim = 27000,	nElev = 4500; break;
737 		case( RP_RB ): nAzim = 22500,	nElev = 4500; break;
738 	}
739 
740 	BmpFilterParam aParam( nAzim, nElev );
741 
742 	if( rGraphic.IsAnimated() )
743 	{
744 		Animation aAnim( rGraphic.GetAnimation() );
745 
746 		if( aAnim.Filter( BMP_FILTER_EMBOSS_GREY, &aParam ) )
747 			aRet = aAnim;
748 	}
749 	else
750 	{
751 		BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
752 
753 		if( aBmpEx.Filter( BMP_FILTER_EMBOSS_GREY, &aParam ) )
754 			aRet = aBmpEx;
755 	}
756 
757 	return aRet;
758 }
759