tdf#119282 Area tab, Pattern color change
regression from
commit ccd316d1cb
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
This commit is contained in:
@@ -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>
|
||||
@@ -74,7 +75,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();
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
@@ -1442,7 +1443,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);
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -994,6 +994,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: */
|
||||
|
Reference in New Issue
Block a user