office-gobmx/vcl/source/image/Image.cxx
Noel Grandin 40dde4385c loplugin:ostr in vcl
Change-Id: I5b6ee5bda0c5ff69d297f7f8e87d4c3f3d21791c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167470
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Jenkins
2024-05-10 18:44:00 +02:00

165 lines
4.9 KiB
C++

/* -*- 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/settings.hxx>
#include <vcl/outdev.hxx>
#include <vcl/graph.hxx>
#include <vcl/graphicfilter.hxx>
#include <vcl/image.hxx>
#include <sal/types.h>
#include <image.h>
#include <bitmap/BitmapColorizeFilter.hxx>
using namespace css;
Image::Image()
{
}
Image::Image(const BitmapEx& rBitmapEx)
{
ImplInit(rBitmapEx);
}
Image::Image(uno::Reference<graphic::XGraphic> const & rxGraphic)
{
if (rxGraphic.is())
{
const Graphic aGraphic(rxGraphic);
OUString aPath;
if (aGraphic.getOriginURL().startsWith("private:graphicrepository/", &aPath))
mpImplData = std::make_shared<ImplImage>(aPath);
else if (aGraphic.GetType() == GraphicType::GdiMetafile)
mpImplData = std::make_shared<ImplImage>(aGraphic.GetGDIMetaFile());
else
ImplInit(aGraphic.GetBitmapEx());
}
}
Image::Image(const OUString & rFileUrl)
{
OUString sImageName;
if (rFileUrl.startsWith("private:graphicrepository/", &sImageName))
mpImplData = std::make_shared<ImplImage>(sImageName);
else
{
Graphic aGraphic;
if (ERRCODE_NONE == GraphicFilter::LoadGraphic(rFileUrl, u"" IMP_PNG ""_ustr, aGraphic))
ImplInit(aGraphic.GetBitmapEx());
}
}
Image::Image(StockImage, const OUString & rFileUrl)
: mpImplData(std::make_shared<ImplImage>(rFileUrl))
{
}
void Image::ImplInit(const BitmapEx& rBitmapEx)
{
if (!rBitmapEx.IsEmpty())
mpImplData = std::make_shared<ImplImage>(rBitmapEx);
}
OUString Image::GetStock() const
{
if (mpImplData)
return mpImplData->getStock();
return OUString();
}
Size Image::GetSizePixel() const
{
if (mpImplData)
return mpImplData->getSizePixel();
else
return Size();
}
BitmapEx Image::GetBitmapEx() const
{
if (mpImplData)
return mpImplData->getBitmapEx();
else
return BitmapEx();
}
bool Image::operator==(const Image& rImage) const
{
bool bRet = false;
if (rImage.mpImplData == mpImplData)
bRet = true;
else if (!rImage.mpImplData || !mpImplData)
bRet = false;
else
bRet = rImage.mpImplData->isEqual(*mpImplData);
return bRet;
}
void Image::Draw(OutputDevice* pOutDev, const Point& rPos, DrawImageFlags nStyle, const Size* pSize)
{
if (!mpImplData || (!pOutDev->IsDeviceOutputNecessary() && pOutDev->GetConnectMetaFile() == nullptr))
return;
Size aOutSize = pSize ? *pSize : pOutDev->PixelToLogic(mpImplData->getSizePixel());
BitmapEx aRenderBmp = mpImplData->getBitmapExForHiDPI(bool(nStyle & DrawImageFlags::Disable), pOutDev->GetGraphics());
if (!(nStyle & DrawImageFlags::Disable) &&
(nStyle & (DrawImageFlags::ColorTransform | DrawImageFlags::Highlight |
DrawImageFlags::Deactive | DrawImageFlags::SemiTransparent)))
{
BitmapEx aTempBitmapEx(aRenderBmp);
if (nStyle & (DrawImageFlags::Highlight | DrawImageFlags::Deactive))
{
const StyleSettings& rSettings = pOutDev->GetSettings().GetStyleSettings();
Color aColor;
if (nStyle & DrawImageFlags::Highlight)
aColor = rSettings.GetHighlightColor();
else
aColor = rSettings.GetDeactiveColor();
BitmapFilter::Filter(aTempBitmapEx, BitmapColorizeFilter(aColor));
}
if (nStyle & DrawImageFlags::SemiTransparent)
{
if (aTempBitmapEx.IsAlpha())
{
Bitmap aAlphaBmp(aTempBitmapEx.GetAlphaMask().GetBitmap());
aAlphaBmp.Adjust(50);
aTempBitmapEx = BitmapEx(aTempBitmapEx.GetBitmap(), AlphaMask(aAlphaBmp));
}
else
{
sal_uInt8 cErase = 128;
aTempBitmapEx = BitmapEx(aTempBitmapEx.GetBitmap(), AlphaMask(aTempBitmapEx.GetSizePixel(), &cErase));
}
}
aRenderBmp = aTempBitmapEx;
}
pOutDev->DrawBitmapEx(rPos, aOutSize, aRenderBmp);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */