diff options
Diffstat (limited to 'vcl/source/rendercontext/drawmode.cxx')
-rw-r--r-- | vcl/source/rendercontext/drawmode.cxx | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/vcl/source/rendercontext/drawmode.cxx b/vcl/source/rendercontext/drawmode.cxx new file mode 100644 index 0000000000..fd3f29ac27 --- /dev/null +++ b/vcl/source/rendercontext/drawmode.cxx @@ -0,0 +1,283 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * 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/BitmapMonochromeFilter.hxx> +#include <vcl/bitmap/BitmapTypes.hxx> +#include <vcl/rendercontext/DrawModeFlags.hxx> +#include <vcl/settings.hxx> +#include <vcl/virdev.hxx> + +#include <drawmode.hxx> + +namespace vcl::drawmode +{ +Color GetLineColor(Color const& rColor, DrawModeFlags nDrawMode, + StyleSettings const& rStyleSettings) +{ + Color aColor(rColor); + + if (nDrawMode + & (DrawModeFlags::BlackLine | DrawModeFlags::WhiteLine | DrawModeFlags::GrayLine + | DrawModeFlags::SettingsLine)) + { + if (!aColor.IsTransparent()) + { + if (nDrawMode & DrawModeFlags::BlackLine) + { + aColor = COL_BLACK; + } + else if (nDrawMode & DrawModeFlags::WhiteLine) + { + aColor = COL_WHITE; + } + else if (nDrawMode & DrawModeFlags::GrayLine) + { + const sal_uInt8 cLum = aColor.GetLuminance(); + aColor = Color(cLum, cLum, cLum); + } + else if (nDrawMode & DrawModeFlags::SettingsLine) + { + if (nDrawMode & DrawModeFlags::SettingsForSelection) + aColor = rStyleSettings.GetHighlightColor(); + else + aColor = rStyleSettings.GetWindowTextColor(); + } + } + } + + return aColor; +} + +Color GetFillColor(Color const& rColor, DrawModeFlags nDrawMode, + StyleSettings const& rStyleSettings) +{ + Color aColor(rColor); + + if (nDrawMode + & (DrawModeFlags::BlackFill | DrawModeFlags::WhiteFill | DrawModeFlags::GrayFill + | DrawModeFlags::NoFill | DrawModeFlags::SettingsFill)) + { + if (!aColor.IsTransparent()) + { + if (nDrawMode & DrawModeFlags::BlackFill) + { + aColor = COL_BLACK; + } + else if (nDrawMode & DrawModeFlags::WhiteFill) + { + aColor = COL_WHITE; + } + else if (nDrawMode & DrawModeFlags::GrayFill) + { + const sal_uInt8 cLum = aColor.GetLuminance(); + aColor = Color(cLum, cLum, cLum); + } + else if (nDrawMode & DrawModeFlags::NoFill) + { + aColor = COL_TRANSPARENT; + } + else if (nDrawMode & DrawModeFlags::SettingsFill) + { + if (nDrawMode & DrawModeFlags::SettingsForSelection) + aColor = rStyleSettings.GetHighlightColor(); + else + aColor = rStyleSettings.GetWindowColor(); + } + } + } + + return aColor; +} + +Color GetHatchColor(Color const& rColor, DrawModeFlags nDrawMode, + StyleSettings const& rStyleSettings) +{ + Color aColor(rColor); + + if (nDrawMode & DrawModeFlags::BlackLine) + { + aColor = COL_BLACK; + } + else if (nDrawMode & DrawModeFlags::WhiteLine) + { + aColor = COL_WHITE; + } + else if (nDrawMode & DrawModeFlags::GrayLine) + { + const sal_uInt8 cLum = aColor.GetLuminance(); + aColor = Color(cLum, cLum, cLum); + } + else if (nDrawMode & DrawModeFlags::SettingsLine) + { + if (nDrawMode & DrawModeFlags::SettingsForSelection) + aColor = rStyleSettings.GetHighlightColor(); + else + aColor = rStyleSettings.GetWindowTextColor(); + } + + return aColor; +} + +Color GetTextColor(Color const& rColor, DrawModeFlags nDrawMode, + StyleSettings const& rStyleSettings) +{ + Color aColor(rColor); + + if (nDrawMode + & (DrawModeFlags::BlackText | DrawModeFlags::WhiteText | DrawModeFlags::GrayText + | DrawModeFlags::SettingsText)) + { + if (nDrawMode & DrawModeFlags::BlackText) + { + aColor = COL_BLACK; + } + else if (nDrawMode & DrawModeFlags::WhiteText) + { + aColor = COL_WHITE; + } + else if (nDrawMode & DrawModeFlags::GrayText) + { + const sal_uInt8 cLum = aColor.GetLuminance(); + aColor = Color(cLum, cLum, cLum); + } + else if (nDrawMode & DrawModeFlags::SettingsText) + { + if (nDrawMode & DrawModeFlags::SettingsForSelection) + aColor = rStyleSettings.GetHighlightTextColor(); + else + aColor = rStyleSettings.GetWindowTextColor(); + } + } + + return aColor; +} + +vcl::Font GetFont(vcl::Font const& rFont, DrawModeFlags nDrawMode, + StyleSettings const& rStyleSettings) +{ + vcl::Font aFont(rFont); + + if (nDrawMode + & (DrawModeFlags::BlackText | DrawModeFlags::WhiteText | DrawModeFlags::GrayText + | DrawModeFlags::SettingsText | DrawModeFlags::BlackFill | DrawModeFlags::WhiteFill + | DrawModeFlags::GrayFill | DrawModeFlags::NoFill | DrawModeFlags::SettingsFill)) + { + Color aTextColor(aFont.GetColor()); + + if (nDrawMode & DrawModeFlags::BlackText) + { + aTextColor = COL_BLACK; + } + else if (nDrawMode & DrawModeFlags::WhiteText) + { + aTextColor = COL_WHITE; + } + else if (nDrawMode & DrawModeFlags::GrayText) + { + const sal_uInt8 cLum = aTextColor.GetLuminance(); + aTextColor = Color(cLum, cLum, cLum); + } + else if (nDrawMode & DrawModeFlags::SettingsText) + { + if (nDrawMode & DrawModeFlags::SettingsForSelection) + aTextColor = rStyleSettings.GetHighlightTextColor(); + else + aTextColor = rStyleSettings.GetWindowTextColor(); + } + + aFont.SetColor(aTextColor); + + if (!aFont.IsTransparent()) + { + Color aTextFillColor(aFont.GetFillColor()); + + if (nDrawMode & DrawModeFlags::BlackFill) + { + aTextFillColor = COL_BLACK; + } + else if (nDrawMode & DrawModeFlags::WhiteFill) + { + aTextFillColor = COL_WHITE; + } + else if (nDrawMode & DrawModeFlags::GrayFill) + { + const sal_uInt8 cLum = aTextFillColor.GetLuminance(); + aTextFillColor = Color(cLum, cLum, cLum); + } + else if (nDrawMode & DrawModeFlags::SettingsFill) + { + if (nDrawMode & DrawModeFlags::SettingsForSelection) + aTextFillColor = rStyleSettings.GetHighlightColor(); + else + aTextFillColor = rStyleSettings.GetWindowColor(); + } + else if (nDrawMode & DrawModeFlags::NoFill) + { + aTextFillColor = COL_TRANSPARENT; + } + + aFont.SetFillColor(aTextFillColor); + } + } + + return aFont; +} + +BitmapEx GetBitmapEx(BitmapEx const& rBitmapEx, DrawModeFlags nDrawMode) +{ + BitmapEx aBmpEx(rBitmapEx); + + if (nDrawMode & (DrawModeFlags::BlackBitmap | DrawModeFlags::WhiteBitmap)) + { + Bitmap aColorBmp(aBmpEx.GetSizePixel(), vcl::PixelFormat::N8_BPP, + &Bitmap::GetGreyPalette(256)); + sal_uInt8 cCmpVal; + + if (nDrawMode & DrawModeFlags::BlackBitmap) + cCmpVal = 0; + else + cCmpVal = 255; + + aColorBmp.Erase(Color(cCmpVal, cCmpVal, cCmpVal)); + + if (aBmpEx.IsAlpha()) + { + // Create one-bit mask out of alpha channel, by thresholding it at alpha=0.5. As + // DRAWMODE_BLACK/WHITEBITMAP requires monochrome output, having alpha-induced + // grey levels is not acceptable + BitmapEx aMaskEx(aBmpEx.GetAlphaMask().GetBitmap()); + aMaskEx.Invert(); // convert to transparency + BitmapFilter::Filter(aMaskEx, BitmapMonochromeFilter(129)); + aMaskEx.Invert(); // convert to alpha + aBmpEx = BitmapEx(aColorBmp, aMaskEx.GetBitmap()); + } + else + { + aBmpEx = BitmapEx(aColorBmp); + } + } + + if (nDrawMode & DrawModeFlags::GrayBitmap && !aBmpEx.IsEmpty()) + aBmpEx.Convert(BmpConversion::N8BitGreys); + + return aBmpEx; +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |