Kaydet (Commit) cd8dd48b authored tarafından Noel Grandin's avatar Noel Grandin

tdf#119282 Area tab, Pattern color change

regression from

    commit ccd316d1
	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/59331Reviewed-by: 's avatarMichael Meeks <michael.meeks@collabora.com>
Tested-by: Jenkins
üst f05f4e04
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <svx/colorbox.hxx> #include <svx/colorbox.hxx>
#include <svx/dialmgr.hxx> #include <svx/dialmgr.hxx>
#include <vcl/bitmapaccess.hxx> #include <vcl/bitmapaccess.hxx>
#include <vcl/BitmapTools.hxx>
#include <vcl/settings.hxx> #include <vcl/settings.hxx>
#include <vcl/weld.hxx> #include <vcl/weld.hxx>
#include <svx/dialogs.hrc> #include <svx/dialogs.hrc>
...@@ -74,7 +75,7 @@ public: ...@@ -74,7 +75,7 @@ public:
{ {
if (!pBmpArray) if (!pBmpArray)
return BitmapEx(); 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; } void SetBmpArray( std::array<sal_uInt8,64> const & pPixel ) { pBmpArray = &pPixel; }
...@@ -296,7 +297,7 @@ IMPL_LINK_NOARG(SvxPatternTabPage, ChangePatternHdl_Impl, ValueSet*, void) ...@@ -296,7 +297,7 @@ IMPL_LINK_NOARG(SvxPatternTabPage, ChangePatternHdl_Impl, ValueSet*, void)
{ {
BitmapColor aBack; BitmapColor aBack;
BitmapColor aFront; BitmapColor aFront;
bool bIs8x8(isHistorical8x8(pGraphicObject->GetGraphic().GetBitmapEx(), aBack, aFront)); bool bIs8x8(vcl::bitmap::isHistorical8x8(pGraphicObject->GetGraphic().GetBitmapEx(), aBack, aFront));
m_pLbColor->SetNoSelection(); m_pLbColor->SetNoSelection();
m_pLbBackgroundColor->SetNoSelection(); m_pLbBackgroundColor->SetNoSelection();
......
...@@ -29,12 +29,6 @@ class SdrModel; ...@@ -29,12 +29,6 @@ class SdrModel;
class BitmapColor; 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 XFillBitmapItem
class SVX_DLLPUBLIC XFillBitmapItem : public NameOrIndex class SVX_DLLPUBLIC XFillBitmapItem : public NameOrIndex
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <basegfx/range/b2drectangle.hxx> #include <basegfx/range/b2drectangle.hxx>
#include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/matrix/b2dhommatrix.hxx>
#include <o3tl/safeint.hxx> #include <o3tl/safeint.hxx>
#include <array>
namespace vcl { namespace vcl {
namespace bitmap { namespace bitmap {
...@@ -113,6 +114,11 @@ VCL_DLLPUBLIC void CanvasCairoExtractBitmapData( BitmapEx const & rBmpEx, 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); 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 }} // end vcl::bitmap
#endif // INCLUDED_VCL_BITMAP_TOOLS_HXX #endif // INCLUDED_VCL_BITMAP_TOOLS_HXX
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include <svx/sdr/contact/objectcontactofobjlistpainter.hxx> #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
#include <svx/sdr/contact/displayinfo.hxx> #include <svx/sdr/contact/displayinfo.hxx>
#include <vcl/bitmapaccess.hxx> #include <vcl/bitmapaccess.hxx>
#include <vcl/BitmapTools.hxx>
#include <svx/xbtmpit.hxx> #include <svx/xbtmpit.hxx>
#define OUTPUT_DRAWMODE_COLOR (DrawModeFlags::Default) #define OUTPUT_DRAWMODE_COLOR (DrawModeFlags::Default)
...@@ -1442,7 +1443,7 @@ void SvxPixelCtl::SetXBitmap(const BitmapEx& rBitmapEx) ...@@ -1442,7 +1443,7 @@ void SvxPixelCtl::SetXBitmap(const BitmapEx& rBitmapEx)
BitmapColor aBack; BitmapColor aBack;
BitmapColor aFront; BitmapColor aFront;
if (isHistorical8x8(rBitmapEx, aBack, aFront)) if (vcl::bitmap::isHistorical8x8(rBitmapEx, aBack, aFront))
{ {
Bitmap aBitmap(rBitmapEx.GetBitmap()); Bitmap aBitmap(rBitmapEx.GetBitmap());
Bitmap::ScopedReadAccess pRead(aBitmap); Bitmap::ScopedReadAccess pRead(aBitmap);
......
...@@ -144,65 +144,6 @@ XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem) ...@@ -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) XFillBitmapItem::XFillBitmapItem(const GraphicObject& rGraphicObject)
: NameOrIndex(XATTR_FILLBITMAP, -1) : NameOrIndex(XATTR_FILLBITMAP, -1)
, maGraphicObject(rGraphicObject) , maGraphicObject(rGraphicObject)
...@@ -224,7 +165,7 @@ bool XFillBitmapItem::operator==(const SfxPoolItem& rItem) const ...@@ -224,7 +165,7 @@ bool XFillBitmapItem::operator==(const SfxPoolItem& rItem) const
bool XFillBitmapItem::isPattern() const bool XFillBitmapItem::isPattern() const
{ {
BitmapColor aBack, aFront; 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 sal_uInt16 XFillBitmapItem::GetVersion(sal_uInt16 /*nFileFormatVersion*/) const
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <svx/xbtmpit.hxx> #include <svx/xbtmpit.hxx>
#include <vcl/settings.hxx> #include <vcl/settings.hxx>
#include <vcl/svapp.hxx> #include <vcl/svapp.hxx>
#include <vcl/BitmapTools.hxx>
#include <o3tl/make_unique.hxx> #include <o3tl/make_unique.hxx>
...@@ -56,28 +57,28 @@ bool XPatternList::Create() ...@@ -56,28 +57,28 @@ bool XPatternList::Create()
// white/white bitmap // white/white bitmap
aStr.append(" 1"); 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())); Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
// black/white bitmap // black/white bitmap
aArray[ 0] = 1; aArray[ 9] = 1; aArray[18] = 1; aArray[27] = 1; aArray[ 0] = 1; aArray[ 9] = 1; aArray[18] = 1; aArray[27] = 1;
aArray[36] = 1; aArray[45] = 1; aArray[54] = 1; aArray[63] = 1; aArray[36] = 1; aArray[45] = 1; aArray[54] = 1; aArray[63] = 1;
aStr[nLen] = '2'; 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())); Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
// lightred/white bitmap // lightred/white bitmap
aArray[ 7] = 1; aArray[14] = 1; aArray[21] = 1; aArray[28] = 1; aArray[ 7] = 1; aArray[14] = 1; aArray[21] = 1; aArray[28] = 1;
aArray[35] = 1; aArray[42] = 1; aArray[49] = 1; aArray[56] = 1; aArray[35] = 1; aArray[42] = 1; aArray[49] = 1; aArray[56] = 1;
aStr[nLen] = '3'; 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())); Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
// lightblue/white bitmap // lightblue/white bitmap
aArray[24] = 1; aArray[25] = 1; aArray[26] = 1; aArray[24] = 1; aArray[25] = 1; aArray[26] = 1;
aArray[29] = 1; aArray[30] = 1; aArray[31] = 1; aArray[29] = 1; aArray[30] = 1; aArray[31] = 1;
aStr[nLen] = '4'; 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())); Insert(o3tl::make_unique<XBitmapEntry>(Graphic(aBitmap), aStr.toString()));
return true; return true;
......
...@@ -994,6 +994,71 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, Bitmap & aBitmap, un ...@@ -994,6 +994,71 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, Bitmap & aBitmap, un
return aRes; 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 }} // end vcl::bitmap
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment