diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-01-05 14:09:17 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-01-05 15:00:54 +0000 |
commit | 3cd39b91f872ca32b09a362de2cb0efaf0e2ba3b (patch) | |
tree | 43cdb5f4e075c00eb6b63648ed825a1281192e8e /framework | |
parent | 4f5cd607e30633ca51263c2f45c4753e8990302f (diff) |
move ImageList to framework
this can probably be replaced by a std::*map<Image>
Change-Id: Ic36c5f406f5ea51cb9ff135858e319e0877179c7
Diffstat (limited to 'framework')
-rw-r--r-- | framework/Library_fwk.mk | 3 | ||||
-rw-r--r-- | framework/source/uiconfiguration/ImageArrayData.cxx | 91 | ||||
-rw-r--r-- | framework/source/uiconfiguration/ImageList.cxx | 317 | ||||
-rw-r--r-- | framework/source/uiconfiguration/ImplImageList.cxx | 73 | ||||
-rw-r--r-- | framework/source/uiconfiguration/image.h | 67 |
5 files changed, 551 insertions, 0 deletions
diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk index 1eaf49756fb0..f5b8f23fe978 100644 --- a/framework/Library_fwk.mk +++ b/framework/Library_fwk.mk @@ -114,6 +114,9 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\ framework/source/services/taskcreatorsrv \ framework/source/services/urltransformer \ framework/source/uiconfiguration/CommandImageResolver \ + framework/source/uiconfiguration/ImageArrayData \ + framework/source/uiconfiguration/ImageList \ + framework/source/uiconfiguration/ImplImageList \ framework/source/uiconfiguration/globalsettings \ framework/source/uiconfiguration/graphicnameaccess \ framework/source/uiconfiguration/imagemanager \ diff --git a/framework/source/uiconfiguration/ImageArrayData.cxx b/framework/source/uiconfiguration/ImageArrayData.cxx new file mode 100644 index 000000000000..6ebfc0928fdf --- /dev/null +++ b/framework/source/uiconfiguration/ImageArrayData.cxx @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <vcl/outdev.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/alpha.hxx> +#include <vcl/window.hxx> +#include <vcl/bitmapaccess.hxx> +#include <vcl/virdev.hxx> +#include <vcl/image.hxx> +#include <vcl/settings.hxx> +#include <vcl/svapp.hxx> +#include <vcl/ImageTree.hxx> + +#include <image.h> +#include <memory> + +#if OSL_DEBUG_LEVEL > 0 +#include <rtl/strbuf.hxx> +#endif + +ImageAryData::ImageAryData( const ImageAryData& rData ) : + maName( rData.maName ), + mnId( rData.mnId ), + maBitmapEx( rData.maBitmapEx ) +{ +} + +ImageAryData::ImageAryData( const OUString &aName, + sal_uInt16 nId, const BitmapEx &aBitmap ) + : maName( aName ), mnId( nId ), maBitmapEx( aBitmap ) +{ +} + +ImageAryData::~ImageAryData() +{ +} + +ImageAryData& ImageAryData::operator=( const ImageAryData& rData ) +{ + maName = rData.maName; + mnId = rData.mnId; + maBitmapEx = rData.maBitmapEx; + + return *this; +} + +void ImageAryData::Load(const OUString &rPrefix) +{ + OUString aIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); + + OUString aFileName = rPrefix; + aFileName += maName; + + bool bSuccess = ImageTree::get().loadImage(aFileName, aIconTheme, maBitmapEx, true); + + if (bSuccess) + {} +#if OSL_DEBUG_LEVEL > 0 + else + { + OStringBuffer aMessage; + aMessage.append( "ImageAryData::Load: failed to load image '" ); + aMessage.append( OUStringToOString( aFileName, RTL_TEXTENCODING_UTF8 ).getStr() ); + aMessage.append( "'" ); + aMessage.append( " from icon theme '" ); + aMessage.append( OUStringToOString( aIconTheme, RTL_TEXTENCODING_UTF8 ).getStr() ); + aMessage.append( "'" ); + OSL_FAIL( aMessage.makeStringAndClear().getStr() ); + } +#endif +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/uiconfiguration/ImageList.cxx b/framework/source/uiconfiguration/ImageList.cxx new file mode 100644 index 000000000000..6610c51c3216 --- /dev/null +++ b/framework/source/uiconfiguration/ImageList.cxx @@ -0,0 +1,317 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <osl/file.hxx> +#include <tools/debug.hxx> +#include <tools/stream.hxx> +#include <tools/rc.h> +#include <tools/rc.hxx> +#include <tools/resmgr.hxx> +#include <vcl/settings.hxx> +#include <vcl/outdev.hxx> +#include <vcl/graph.hxx> +#include <vcl/graphicfilter.hxx> +#include <vcl/svapp.hxx> +#include <vcl/image.hxx> +#include <vcl/imagerepository.hxx> +#include <vcl/ImageTree.hxx> +#include <image.h> + +ImageList::ImageList() +{ +} + +ImageList::ImageList(const std::vector< OUString >& rNameVector, + const OUString& rPrefix) +{ + SAL_INFO( "vcl", "vcl: ImageList::ImageList(const vector< OUString >& ..." ); + + ImplInit( sal::static_int_cast< sal_uInt16 >( rNameVector.size() ), Size() ); + + mpImplData->maPrefix = rPrefix; + for( size_t i = 0; i < rNameVector.size(); ++i ) + { + mpImplData->AddImage( rNameVector[ i ], static_cast< sal_uInt16 >( i ) + 1, BitmapEx() ); + } +} + +void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize ) +{ + mpImplData.reset(new ImplImageList); + mpImplData->maImages.reserve( nItems ); + mpImplData->maImageSize = rSize; +} + +// FIXME: Rather a performance hazard +BitmapEx ImageList::GetAsHorizontalStrip() const +{ + Size aSize( mpImplData->maImageSize ); + sal_uInt16 nCount = GetImageCount(); + if( !nCount ) + return BitmapEx(); + aSize.Width() *= nCount; + + // Load any stragglers + for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++) + { + ImageAryData *pData = mpImplData->maImages[ nIdx ]; + if( pData->IsLoadable() ) + pData->Load( mpImplData->maPrefix ); + } + + BitmapEx aTempl = mpImplData->maImages[ 0 ]->maBitmapEx; + BitmapEx aResult; + Bitmap aPixels( aSize, aTempl.GetBitmap().GetBitCount() ); + if( aTempl.IsAlpha() ) + aResult = BitmapEx( aPixels, AlphaMask( aSize ) ); + else if( aTempl.IsTransparent() ) + aResult = BitmapEx( aPixels, Bitmap( aSize, aTempl.GetMask().GetBitCount() ) ); + else + aResult = BitmapEx( aPixels ); + + Rectangle aSrcRect( Point( 0, 0 ), mpImplData->maImageSize ); + for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++) + { + Rectangle aDestRect( Point( nIdx * mpImplData->maImageSize.Width(), 0 ), + mpImplData->maImageSize ); + ImageAryData *pData = mpImplData->maImages[ nIdx ]; + aResult.CopyPixel( aDestRect, aSrcRect, &pData->maBitmapEx); + } + + return aResult; +} + +void ImageList::InsertFromHorizontalStrip( const BitmapEx &rBitmapEx, + const std::vector< OUString > &rNameVector ) +{ + sal_uInt16 nItems = sal::static_int_cast< sal_uInt16 >( rNameVector.size() ); + + if (!nItems) + return; + + Size aSize( rBitmapEx.GetSizePixel() ); + DBG_ASSERT (rBitmapEx.GetSizePixel().Width() % nItems == 0, + "ImageList::InsertFromHorizontalStrip - very odd size"); + aSize.Width() /= nItems; + ImplInit( nItems, aSize ); + + for (sal_uInt16 nIdx = 0; nIdx < nItems; nIdx++) + { + BitmapEx aBitmap( rBitmapEx, Point( nIdx * aSize.Width(), 0 ), aSize ); + mpImplData->AddImage( rNameVector[ nIdx ], nIdx + 1, aBitmap ); + } +} + +sal_uInt16 ImageList::ImplGetImageId( const OUString& rImageName ) const +{ + ImageAryData *pImg = mpImplData->maNameHash[ rImageName ]; + if( pImg ) + return pImg->mnId; + else + return 0; +} + +void ImageList::AddImage( const OUString& rImageName, const Image& rImage ) +{ + SAL_WARN_IF( GetImagePos( rImageName ) != IMAGELIST_IMAGE_NOTFOUND, "vcl", "ImageList::AddImage() - ImageName already exists" ); + + if( !mpImplData ) + ImplInit( 0, rImage.GetSizePixel() ); + + mpImplData->AddImage( rImageName, GetImageCount() + 1, + rImage.GetBitmapEx() ); +} + +void ImageList::ReplaceImage( const OUString& rImageName, const Image& rImage ) +{ + const sal_uInt16 nId = ImplGetImageId( rImageName ); + + if( nId ) + { + //Just replace the bitmap rather than doing RemoveImage / AddImage + //which breaks index-based iteration. + ImageAryData *pImg = mpImplData->maNameHash[ rImageName ]; + pImg->maBitmapEx = rImage.GetBitmapEx(); + } +} + +void ImageList::RemoveImage( sal_uInt16 nId ) +{ + for( size_t i = 0; i < mpImplData->maImages.size(); ++i ) + { + if( mpImplData->maImages[ i ]->mnId == nId ) + { + mpImplData->RemoveImage( static_cast< sal_uInt16 >( i ) ); + break; + } + } +} + +Image ImageList::GetImage( sal_uInt16 nId ) const +{ + Image aRet; + + if (mpImplData) + { + for (ImageAryData* pImageData : mpImplData->maImages) + { + if (pImageData->mnId == nId) + { + if (pImageData->IsLoadable()) + pImageData->Load(mpImplData->maPrefix); + aRet = Image(pImageData->maBitmapEx); + } + } + } + + if (!aRet) + { + BitmapEx rBitmap; + bool bResult = vcl::ImageRepository::loadDefaultImage(rBitmap); + if (bResult) + aRet = Image(rBitmap); + } + + return aRet; +} + +Image ImageList::GetImage( const OUString& rImageName ) const +{ + if( mpImplData ) + { + ImageAryData *pImg = mpImplData->maNameHash[ rImageName ]; + + if( pImg ) + { + if( pImg->IsLoadable() ) + pImg->Load( mpImplData->maPrefix ); + return Image( pImg->maBitmapEx ); + } + } + + return Image(); +} + +sal_uInt16 ImageList::GetImageCount() const +{ + return mpImplData ? static_cast< sal_uInt16 >( mpImplData->maImages.size() ) : 0; +} + +sal_uInt16 ImageList::GetImagePos( sal_uInt16 nId ) const +{ + + if( mpImplData && nId ) + { + for( size_t i = 0; i < mpImplData->maImages.size(); ++i ) + { + if (mpImplData->maImages[ i ]->mnId == nId) + return static_cast< sal_uInt16 >( i ); + } + } + + return IMAGELIST_IMAGE_NOTFOUND; +} + +bool ImageList::HasImageForId( sal_uInt16 nId ) const +{ + return GetImagePos( nId ) != IMAGELIST_IMAGE_NOTFOUND; +} + +sal_uInt16 ImageList::GetImagePos( const OUString& rImageName ) const +{ + if( mpImplData && !rImageName.isEmpty() ) + { + for( size_t i = 0; i < mpImplData->maImages.size(); i++ ) + { + if (mpImplData->maImages[i]->maName == rImageName) + return static_cast< sal_uInt16 >( i ); + } + } + + return IMAGELIST_IMAGE_NOTFOUND; +} + +sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const +{ + if( mpImplData && (nPos < GetImageCount()) ) + return mpImplData->maImages[ nPos ]->mnId; + + return 0; +} + +OUString ImageList::GetImageName( sal_uInt16 nPos ) const +{ + if( mpImplData && (nPos < GetImageCount()) ) + return mpImplData->maImages[ nPos ]->maName; + + return OUString(); +} + +void ImageList::GetImageNames( std::vector< OUString >& rNames ) const +{ + SAL_INFO( "vcl", "vcl: ImageList::GetImageNames" ); + + rNames = std::vector< OUString >(); + + if( mpImplData ) + { + for(const ImageAryData* pImage : mpImplData->maImages) + { + const OUString& rName( pImage->maName ); + if( !rName.isEmpty()) + rNames.push_back( rName ); + } + } +} + +Size ImageList::GetImageSize() const +{ + Size aRet; + + if( mpImplData ) + { + aRet = mpImplData->maImageSize; + + // force load of 1st image to see - uncommon case. + if( aRet.Width() == 0 && aRet.Height() == 0 && + !mpImplData->maImages.empty() ) + { + Image aTmp = GetImage( mpImplData->maImages[ 0 ]->mnId ); + aRet = mpImplData->maImageSize = aTmp.GetSizePixel(); + } + } + return aRet; +} + +bool ImageList::operator==( const ImageList& rImageList ) const +{ + bool bRet = false; + + if( rImageList.mpImplData == mpImplData ) + bRet = true; + else if( !rImageList.mpImplData || !mpImplData ) + bRet = false; + else if( rImageList.GetImageCount() == GetImageCount() && + rImageList.mpImplData->maImageSize == mpImplData->maImageSize ) + bRet = true; // strange semantic + + return bRet; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/uiconfiguration/ImplImageList.cxx b/framework/source/uiconfiguration/ImplImageList.cxx new file mode 100644 index 000000000000..f1a0d94973c8 --- /dev/null +++ b/framework/source/uiconfiguration/ImplImageList.cxx @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <vcl/outdev.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/alpha.hxx> +#include <vcl/window.hxx> +#include <vcl/bitmapaccess.hxx> +#include <vcl/virdev.hxx> +#include <vcl/image.hxx> +#include <vcl/settings.hxx> + +#include <image.h> +#include <memory> + +ImplImageList::ImplImageList() +{ +} + +ImplImageList::ImplImageList( const ImplImageList &aSrc ) + : maPrefix(aSrc.maPrefix) + , maImageSize(aSrc.maImageSize) +{ + maImages.reserve( aSrc.maImages.size() ); + for ( std::vector<ImageAryData *>::const_iterator aIt = aSrc.maImages.begin(), aEnd = aSrc.maImages.end(); aIt != aEnd; ++aIt ) + { + ImageAryData* pAryData = new ImageAryData( **aIt ); + maImages.push_back( pAryData ); + if( !pAryData->maName.isEmpty() ) + maNameHash [ pAryData->maName ] = pAryData; + } +} + +ImplImageList::~ImplImageList() +{ + for ( std::vector<ImageAryData *>::iterator aIt = maImages.begin(), aEnd = maImages.end(); aIt != aEnd; ++aIt ) + delete *aIt; +} + +void ImplImageList::AddImage( const OUString &aName, + sal_uInt16 nId, const BitmapEx &aBitmapEx ) +{ + ImageAryData *pImg = new ImageAryData( aName, nId, aBitmapEx ); + maImages.push_back( pImg ); + if( !aName.isEmpty() ) + maNameHash [ aName ] = pImg; +} + +void ImplImageList::RemoveImage( sal_uInt16 nPos ) +{ + ImageAryData *pImg = maImages[ nPos ]; + if( !pImg->maName.isEmpty() ) + maNameHash.erase( pImg->maName ); + maImages.erase( maImages.begin() + nPos ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/uiconfiguration/image.h b/framework/source/uiconfiguration/image.h new file mode 100644 index 000000000000..9b0542f1462f --- /dev/null +++ b/framework/source/uiconfiguration/image.h @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#ifndef FRAMEWORK_SOURCE_UICONFIGURATION_IMAGE_H +#define FRAMEWORK_SOURCE_UICONFIGURATION_IMAGE_H + +#include <vcl/bitmapex.hxx> + +#include <unordered_map> +#include <vector> + +struct ImageAryData +{ + OUString maName; + // Images identified by either name, or by id + sal_uInt16 mnId; + BitmapEx maBitmapEx; + + ImageAryData( const OUString &aName, + sal_uInt16 nId, const BitmapEx &aBitmap ); + ImageAryData( const ImageAryData& rData ); + ~ImageAryData(); + + bool IsLoadable() { return maBitmapEx.IsEmpty() && !maName.isEmpty(); } + void Load(const OUString &rPrefix); + + ImageAryData& operator=( const ImageAryData& rData ); +}; + +struct ImplImageList +{ + typedef std::unordered_map< OUString, ImageAryData *, OUStringHash > + ImageAryDataNameHash; + + std::vector<ImageAryData *> maImages; + ImageAryDataNameHash maNameHash; + OUString maPrefix; + Size maImageSize; + + ImplImageList(); + ImplImageList( const ImplImageList &aSrc ); + ~ImplImageList(); + + void AddImage( const OUString &aName, + sal_uInt16 nId, const BitmapEx &aBitmapEx ); + void RemoveImage( sal_uInt16 nPos ); +}; + +#endif // INCLUDED_VCL_INC_IMAGE_H + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |