/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" #include #include #include #include namespace ImageScaleMode = ::com::sun::star::awt::ImageScaleMode; // ----------------------------------------------------------------------- ImageControl::ImageControl( Window* pParent, WinBits nStyle ) :FixedImage( pParent, nStyle ) ,mnScaleMode( ImageScaleMode::Anisotropic ) { } // ----------------------------------------------------------------------- ImageControl::ImageControl( Window* pParent, const ResId& rResId ) :FixedImage( pParent, rResId ) ,mnScaleMode( ImageScaleMode::Anisotropic ) { } // ----------------------------------------------------------------------- void ImageControl::SetScaleMode( const ::sal_Int16 _nMode ) { if ( _nMode != mnScaleMode ) { mnScaleMode = _nMode; Invalidate(); } } // ----------------------------------------------------------------------- void ImageControl::Resize() { Invalidate(); } // ----------------------------------------------------------------------- namespace { static Size lcl_calcPaintSize( const Rectangle& _rPaintRect, const Size& _rBitmapSize ) { const Size aPaintSize = _rPaintRect.GetSize(); const double nRatioX = 1.0 * aPaintSize.Width() / _rBitmapSize.Width(); const double nRatioY = 1.0 * aPaintSize.Height() / _rBitmapSize.Height(); const double nRatioMin = ::std::min( nRatioX, nRatioY ); return Size( long( _rBitmapSize.Width() * nRatioMin ), long( _rBitmapSize.Height() * nRatioMin ) ); } static Point lcl_centerWithin( const Rectangle& _rArea, const Size& _rObjectSize ) { Point aPos( _rArea.TopLeft() ); aPos.X() += ( _rArea.GetWidth() - _rObjectSize.Width() ) / 2; aPos.Y() += ( _rArea.GetHeight() - _rObjectSize.Height() ) / 2; return aPos; } } // ----------------------------------------------------------------------- void ImageControl::ImplDraw( OutputDevice& rDev, sal_uLong nDrawFlags, const Point& rPos, const Size& rSize ) const { sal_uInt16 nStyle = 0; if ( !(nDrawFlags & WINDOW_DRAW_NODISABLE) ) { if ( !IsEnabled() ) nStyle |= IMAGE_DRAW_DISABLE; } const Image& rImage( GetModeImage( BMP_COLOR_NORMAL ) ); const Image& rImageHC( GetModeImage( BMP_COLOR_HIGHCONTRAST ) ); const Image* pImage = &rImage; if ( !!rImageHC && GetSettings().GetStyleSettings().GetHighContrastMode() ) pImage = &rImageHC; const Rectangle aDrawRect( rPos, rSize ); if ( !*pImage ) { String sText( GetText() ); if ( !sText.Len() ) return; WinBits nWinStyle = GetStyle(); sal_uInt16 nTextStyle = FixedText::ImplGetTextStyle( nWinStyle ); if ( !(nDrawFlags & WINDOW_DRAW_NODISABLE) ) if ( !IsEnabled() ) nTextStyle |= TEXT_DRAW_DISABLE; rDev.DrawText( aDrawRect, sText, nTextStyle ); return; } const Size& rBitmapSize = pImage->GetSizePixel(); switch ( mnScaleMode ) { case ImageScaleMode::None: { rDev.DrawImage( lcl_centerWithin( aDrawRect, rBitmapSize ), *pImage, nStyle ); } break; case ImageScaleMode::Isotropic: { const Size aPaintSize = lcl_calcPaintSize( aDrawRect, rBitmapSize ); rDev.DrawImage( lcl_centerWithin( aDrawRect, aPaintSize ), aPaintSize, *pImage, nStyle ); } break; case ImageScaleMode::Anisotropic: { rDev.DrawImage( aDrawRect.TopLeft(), aDrawRect.GetSize(), *pImage, nStyle ); } break; default: OSL_ENSURE( false, "ImageControl::ImplDraw: unhandled scale mode!" ); break; } // switch ( mnScaleMode ) } // ----------------------------------------------------------------------- void ImageControl::Paint( const Rectangle& /*rRect*/ ) { ImplDraw( *this, 0, Point(), GetOutputSizePixel() ); if( HasFocus() ) { Window *pWin = GetWindow( WINDOW_BORDER ); sal_Bool bFlat = (GetBorderStyle() == 2); Rectangle aRect( Point(0,0), pWin->GetOutputSizePixel() ); Color oldLineCol = pWin->GetLineColor(); Color oldFillCol = pWin->GetFillColor(); pWin->SetFillColor(); pWin->SetLineColor( bFlat ? COL_WHITE : COL_BLACK ); pWin->DrawRect( aRect ); aRect.nLeft++; aRect.nRight--; aRect.nTop++; aRect.nBottom--; pWin->SetLineColor( bFlat ? COL_BLACK : COL_WHITE ); pWin->DrawRect( aRect ); pWin->SetLineColor( oldLineCol ); pWin->SetFillColor( oldFillCol ); } } // ----------------------------------------------------------------------- void ImageControl::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) { const Point aPos = pDev->LogicToPixel( rPos ); const Size aSize = pDev->LogicToPixel( rSize ); Rectangle aRect( aPos, aSize ); pDev->Push(); pDev->SetMapMode(); // Border if ( !(nFlags & WINDOW_DRAW_NOBORDER) && (GetStyle() & WB_BORDER) ) { ImplDrawFrame( pDev, aRect ); } pDev->IntersectClipRegion( aRect ); ImplDraw( *pDev, nFlags, aRect.TopLeft(), aRect.GetSize() ); pDev->Pop(); } // ----------------------------------------------------------------------- void ImageControl::GetFocus() { FixedImage::GetFocus(); GetWindow( WINDOW_BORDER )->Invalidate(); } // ----------------------------------------------------------------------- void ImageControl::LoseFocus() { FixedImage::GetFocus(); GetWindow( WINDOW_BORDER )->Invalidate(); }