summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2018-08-21 16:07:55 +0200
committerCaolán McNamara <caolanm@redhat.com>2018-08-23 16:41:59 +0200
commit7607320e8e68cfeb2ef8933d8a5a7d06f74f16fd (patch)
treeb4b4ae5ea6bd6ec2ce1d252442351a8e2ad2d52f
parent88897b74118fa6d269ce325aca6a4ac3ac1ae3de (diff)
tdf#119282 Area tab, Pattern color change
regression from commit ccd316d1cb310734848bd20244f509024b549b8c use VirtualDevice in createHistorical8x8FromArray Move the code inside vcl so we don't need to expose BitmapWriteAccess. I tried to detect this thing by counting the number of independent colors in the bitmap, but that didn't work. It is used from more than one place, and appears to be very determined that it needs a 2-color palette to work properly. Change-Id: Id11dd9ea78e5e522a6083d6a799e801cac81fd5b Reviewed-on: https://gerrit.libreoffice.org/59331 Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Tested-by: Jenkins (cherry picked from commit cd8dd48bf89d800c012afb04b16281ed8b261de9) Reviewed-on: https://gerrit.libreoffice.org/59416 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--cui/source/tabpages/tppattern.cxx5
-rw-r--r--include/svx/xbtmpit.hxx6
-rw-r--r--include/vcl/BitmapTools.hxx6
-rw-r--r--svx/source/dialog/dlgctrl.cxx3
-rw-r--r--svx/source/xoutdev/xattrbmp.cxx61
-rw-r--r--svx/source/xoutdev/xtabptrn.cxx9
-rw-r--r--vcl/source/bitmap/BitmapTools.cxx65
7 files changed, 82 insertions, 73 deletions
diff --git a/cui/source/tabpages/tppattern.cxx b/cui/source/tabpages/tppattern.cxx
index 8f06c8051fec..7516e6689adf 100644
--- a/cui/source/tabpages/tppattern.cxx
+++ b/cui/source/tabpages/tppattern.cxx
@@ -29,6 +29,7 @@
#include <svx/colorbox.hxx>
#include <svx/dialmgr.hxx>
#include <vcl/bitmapaccess.hxx>
+#include <vcl/BitmapTools.hxx>
#include <vcl/settings.hxx>
#include <vcl/weld.hxx>
#include <svx/dialogs.hrc>
@@ -73,7 +74,7 @@ public:
{
if (!pBmpArray)
return BitmapEx();
- return createHistorical8x8FromArray(*pBmpArray, aPixelColor, aBackgroundColor);
+ return vcl::bitmap::createHistorical8x8FromArray(*pBmpArray, aPixelColor, aBackgroundColor);
}
void SetBmpArray( std::array<sal_uInt8,64> const & pPixel ) { pBmpArray = &pPixel; }
@@ -296,7 +297,7 @@ IMPL_LINK_NOARG(SvxPatternTabPage, ChangePatternHdl_Impl, ValueSet*, void)
{
BitmapColor aBack;
BitmapColor aFront;
- bool bIs8x8(isHistorical8x8(pGraphicObject->GetGraphic().GetBitmapEx(), aBack, aFront));
+ bool bIs8x8(vcl::bitmap::isHistorical8x8(pGraphicObject->GetGraphic().GetBitmapEx(), aBack, aFront));
m_pLbColor->SetNoSelection();
m_pLbBackgroundColor->SetNoSelection();
diff --git a/include/svx/xbtmpit.hxx b/include/svx/xbtmpit.hxx
index 2f8e5f1181ee..218985c077d6 100644
--- a/include/svx/xbtmpit.hxx
+++ b/include/svx/xbtmpit.hxx
@@ -29,12 +29,6 @@ class SdrModel;
class BitmapColor;
-// helper to construct historical 8x8 bitmaps with two colors
-
-BitmapEx SVX_DLLPUBLIC createHistorical8x8FromArray(std::array<sal_uInt8,64> const & pArray, Color aColorPix, Color aColorBack);
-bool SVX_DLLPUBLIC isHistorical8x8(const BitmapEx& rBitmapEx, BitmapColor& o_rBack, BitmapColor& o_rFront);
-
-
// class XFillBitmapItem
class SVX_DLLPUBLIC XFillBitmapItem : public NameOrIndex
diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx
index 2064cb2d01dc..75eb6ed53077 100644
--- a/include/vcl/BitmapTools.hxx
+++ b/include/vcl/BitmapTools.hxx
@@ -23,6 +23,7 @@
#include <basegfx/range/b2drectangle.hxx>
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <o3tl/safeint.hxx>
+#include <array>
namespace vcl {
namespace bitmap {
@@ -113,6 +114,11 @@ VCL_DLLPUBLIC void CanvasCairoExtractBitmapData( BitmapEx const & rBmpEx, Bitmap
VCL_DLLPUBLIC css::uno::Sequence< sal_Int8 > CanvasExtractBitmapData(BitmapEx const & rBitmapEx, const css::geometry::IntegerRectangle2D& rect);
+// helper to construct historical 8x8 bitmaps with two colors
+
+BitmapEx VCL_DLLPUBLIC createHistorical8x8FromArray(std::array<sal_uInt8,64> const & pArray, Color aColorPix, Color aColorBack);
+bool VCL_DLLPUBLIC isHistorical8x8(const BitmapEx& rBitmapEx, BitmapColor& o_rBack, BitmapColor& o_rFront);
+
}} // end vcl::bitmap
#endif // INCLUDED_VCL_BITMAP_TOOLS_HXX
diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx
index 48a24c0372f5..f5ec3b570d93 100644
--- a/svx/source/dialog/dlgctrl.cxx
+++ b/svx/source/dialog/dlgctrl.cxx
@@ -46,6 +46,7 @@
#include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
#include <svx/sdr/contact/displayinfo.hxx>
#include <vcl/bitmapaccess.hxx>
+#include <vcl/BitmapTools.hxx>
#include <svx/xbtmpit.hxx>
#define OUTPUT_DRAWMODE_COLOR (DrawModeFlags::Default)
@@ -1445,7 +1446,7 @@ void SvxPixelCtl::SetXBitmap(const BitmapEx& rBitmapEx)
BitmapColor aBack;
BitmapColor aFront;
- if (isHistorical8x8(rBitmapEx, aBack, aFront))
+ if (vcl::bitmap::isHistorical8x8(rBitmapEx, aBack, aFront))
{
Bitmap aBitmap(rBitmapEx.GetBitmap());
Bitmap::ScopedReadAccess pRead(aBitmap);
diff --git a/svx/source/xoutdev/xattrbmp.cxx b/svx/source/xoutdev/xattrbmp.cxx
index a25c5d41faf4..b20bbf4d5ec8 100644
--- a/svx/source/xoutdev/xattrbmp.cxx
+++ b/svx/source/xoutdev/xattrbmp.cxx
@@ -144,65 +144,6 @@ XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem)
{
}
-BitmapEx createHistorical8x8FromArray(std::array<sal_uInt8,64> const & pArray, Color aColorPix, Color aColorBack)
-{
- vcl::bitmap::RawBitmap aBitmap(Size(8, 8), 24);
-
- for(sal_uInt16 a(0); a < 8; a++)
- {
- for(sal_uInt16 b(0); b < 8; b++)
- {
- if(pArray[(a * 8) + b])
- {
- aBitmap.SetPixel(a, b, aColorBack);
- }
- else
- {
- aBitmap.SetPixel(a, b, aColorPix);
- }
- }
- }
-
- return vcl::bitmap::CreateFromData(std::move(aBitmap));
-}
-
-bool isHistorical8x8(const BitmapEx& rBitmapEx, BitmapColor& o_rBack, BitmapColor& o_rFront)
-{
- bool bRet(false);
-
- if(!rBitmapEx.IsTransparent())
- {
- Bitmap aBitmap(rBitmapEx.GetBitmap());
-
- if(8 == aBitmap.GetSizePixel().Width() && 8 == aBitmap.GetSizePixel().Height())
- {
- if(2 == aBitmap.GetColorCount())
- {
- BitmapReadAccess* pRead = aBitmap.AcquireReadAccess();
-
- if(pRead)
- {
- if(pRead->HasPalette() && 2 == pRead->GetPaletteEntryCount())
- {
- const BitmapPalette& rPalette = pRead->GetPalette();
-
- // #i123564# background and foreground were exchanged; of course
- // rPalette[0] is the background color
- o_rFront = rPalette[1];
- o_rBack = rPalette[0];
-
- bRet = true;
- }
-
- Bitmap::ReleaseAccess(pRead);
- }
- }
- }
- }
-
- return bRet;
-}
-
XFillBitmapItem::XFillBitmapItem(const GraphicObject& rGraphicObject)
: NameOrIndex(XATTR_FILLBITMAP, -1)
, maGraphicObject(rGraphicObject)
@@ -224,7 +165,7 @@ bool XFillBitmapItem::operator==(const SfxPoolItem& rItem) const
bool XFillBitmapItem::isPattern() const
{
BitmapColor aBack, aFront;
- return isHistorical8x8(GetGraphicObject().GetGraphic().GetBitmapEx(), aBack, aFront);
+ return vcl::bitmap::isHistorical8x8(GetGraphicObject().GetGraphic().GetBitmapEx(), aBack, aFront);
}
sal_uInt16 XFillBitmapItem::GetVersion(sal_uInt16 /*nFileFormatVersion*/) const
diff --git a/svx/source/xoutdev/xtabptrn.cxx b/svx/source/xoutdev/xtabptrn.cxx
index ff9fc20f3471..d156b28c5190 100644
--- a/svx/source/xoutdev/xtabptrn.cxx
+++ b/svx/source/xoutdev/xtabptrn.cxx
@@ -29,6 +29,7 @@
#include <svx/xbtmpit.hxx>
#include <vcl/settings.hxx>
#include <vcl/svapp.hxx>
+#include <vcl/BitmapTools.hxx>
#include <o3tl/make_unique.hxx>
@@ -56,28 +57,28 @@ bool XPatternList::Create()
// white/white bitmap
aStr.append(" 1");
- aBitmap = createHistorical8x8FromArray(aArray, COL_WHITE, COL_WHITE);
+ aBitmap = vcl::bitmap::createHistorical8x8FromArray(aArray, COL_WHITE, COL_WHITE);
Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
// black/white bitmap
aArray[ 0] = 1; aArray[ 9] = 1; aArray[18] = 1; aArray[27] = 1;
aArray[36] = 1; aArray[45] = 1; aArray[54] = 1; aArray[63] = 1;
aStr[nLen] = '2';
- aBitmap = createHistorical8x8FromArray(aArray, COL_BLACK, COL_WHITE);
+ aBitmap = vcl::bitmap::createHistorical8x8FromArray(aArray, COL_BLACK, COL_WHITE);
Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
// lightred/white bitmap
aArray[ 7] = 1; aArray[14] = 1; aArray[21] = 1; aArray[28] = 1;
aArray[35] = 1; aArray[42] = 1; aArray[49] = 1; aArray[56] = 1;
aStr[nLen] = '3';
- aBitmap = createHistorical8x8FromArray(aArray, COL_LIGHTRED, COL_WHITE);
+ aBitmap = vcl::bitmap::createHistorical8x8FromArray(aArray, COL_LIGHTRED, COL_WHITE);
Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
// lightblue/white bitmap
aArray[24] = 1; aArray[25] = 1; aArray[26] = 1;
aArray[29] = 1; aArray[30] = 1; aArray[31] = 1;
aStr[nLen] = '4';
- aBitmap = createHistorical8x8FromArray(aArray, COL_LIGHTBLUE, COL_WHITE);
+ aBitmap = vcl::bitmap::createHistorical8x8FromArray(aArray, COL_LIGHTBLUE, COL_WHITE);
Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
return true;
diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx
index 63135baa55ed..14a7a23f5c66 100644
--- a/vcl/source/bitmap/BitmapTools.cxx
+++ b/vcl/source/bitmap/BitmapTools.cxx
@@ -997,6 +997,71 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, Bitmap & aBitmap, un
return aRes;
}
+ BitmapEx createHistorical8x8FromArray(std::array<sal_uInt8,64> const & pArray, Color aColorPix, Color aColorBack)
+ {
+ BitmapPalette aPalette(2);
+
+ aPalette[0] = BitmapColor(aColorBack);
+ aPalette[1] = BitmapColor(aColorPix);
+
+ Bitmap aBitmap(Size(8, 8), 1, &aPalette);
+ BitmapWriteAccess* pContent(aBitmap.AcquireWriteAccess());
+
+ for(sal_uInt16 a(0); a < 8; a++)
+ {
+ for(sal_uInt16 b(0); b < 8; b++)
+ {
+ if(pArray[(a * 8) + b])
+ {
+ pContent->SetPixelIndex(a, b, 1);
+ }
+ else
+ {
+ pContent->SetPixelIndex(a, b, 0);
+ }
+ }
+ }
+
+ return BitmapEx(aBitmap);
+ }
+
+ bool isHistorical8x8(const BitmapEx& rBitmapEx, BitmapColor& o_rBack, BitmapColor& o_rFront)
+ {
+ bool bRet(false);
+
+ if(!rBitmapEx.IsTransparent())
+ {
+ Bitmap aBitmap(rBitmapEx.GetBitmap());
+
+ if(8 == aBitmap.GetSizePixel().Width() && 8 == aBitmap.GetSizePixel().Height())
+ {
+ if(2 == aBitmap.GetColorCount())
+ {
+ BitmapReadAccess* pRead = aBitmap.AcquireReadAccess();
+
+ if(pRead)
+ {
+ if(pRead->HasPalette() && 2 == pRead->GetPaletteEntryCount())
+ {
+ const BitmapPalette& rPalette = pRead->GetPalette();
+
+ // #i123564# background and foreground were exchanged; of course
+ // rPalette[0] is the background color
+ o_rFront = rPalette[1];
+ o_rBack = rPalette[0];
+
+ bRet = true;
+ }
+
+ Bitmap::ReleaseAccess(pRead);
+ }
+ }
+ }
+ }
+
+ return bRet;
+ }
+
}} // end vcl::bitmap
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */