summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basebmp/source/bitmapdevice.cxx41
-rw-r--r--basebmp/test/basictest.cxx24
-rw-r--r--basebmp/test/bmpmasktest.cxx15
-rw-r--r--basebmp/test/bmptest.cxx12
-rw-r--r--basebmp/test/cliptest.cxx12
-rw-r--r--basebmp/test/filltest.cxx6
-rw-r--r--basebmp/test/linetest.cxx12
-rw-r--r--basebmp/test/masktest.cxx9
-rw-r--r--basebmp/test/polytest.cxx6
-rw-r--r--include/basebmp/bitmapdevice.hxx10
-rw-r--r--vcl/headless/svpbmp.cxx6
-rw-r--r--vcl/headless/svpframe.cxx3
-rw-r--r--vcl/headless/svptext.cxx10
-rw-r--r--vcl/headless/svpvd.cxx8
-rw-r--r--vcl/unx/gtk/window/gtksalframe.cxx5
15 files changed, 119 insertions, 60 deletions
diff --git a/basebmp/source/bitmapdevice.cxx b/basebmp/source/bitmapdevice.cxx
index 12def64d0eb5..34cf2c882ff8 100644
--- a/basebmp/source/bitmapdevice.cxx
+++ b/basebmp/source/bitmapdevice.cxx
@@ -1933,14 +1933,12 @@ inline sal_uInt32 nextPow2( sal_uInt32 x )
return ++x;
}
-
-
-
namespace
{
BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector& rSize,
bool bTopDown,
Format nScanlineFormat,
+ sal_Int32 nScanlineStride,
boost::shared_array< sal_uInt8 > pMem,
PaletteMemorySharedVector pPal,
const basegfx::B2IBox* pSubset,
@@ -1960,15 +1958,6 @@ BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector&
rSize.getX() << " for depth " << nBitsPerPixel);
return BitmapDeviceSharedPtr();
}
- // round up to full 8 bit, divide by 8
- sal_Int32 nScanlineStride = (rSize.getX()*nBitsPerPixel + 7) >> 3;
-
- // rounded up to next full power-of-two number of bytes
- const sal_uInt32 bytesPerPixel = nextPow2(
- (bitsPerPixel[nScanlineFormat] + 7) >> 3);
-
- // now make nScanlineStride a multiple of bytesPerPixel
- nScanlineStride = (nScanlineStride + bytesPerPixel - 1) / bytesPerPixel * bytesPerPixel;
// factor in bottom-up scanline order case
nScanlineStride *= bTopDown ? 1 : -1;
@@ -2130,13 +2119,14 @@ BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector&
BitmapDeviceSharedPtr createBitmapDeviceImpl( const basegfx::B2IVector& rSize,
bool bTopDown,
Format nScanlineFormat,
+ sal_Int32 nScanlineStride,
boost::shared_array< sal_uInt8 > pMem,
PaletteMemorySharedVector pPal,
const basegfx::B2IBox* pSubset,
const IBitmapDeviceDamageTrackerSharedPtr& rDamage,
bool bBlack = true)
{
- BitmapDeviceSharedPtr result( createBitmapDeviceImplInner( rSize, bTopDown, nScanlineFormat, pMem, pPal, pSubset, rDamage, bBlack ) );
+ BitmapDeviceSharedPtr result( createBitmapDeviceImplInner( rSize, bTopDown, nScanlineFormat, nScanlineStride, pMem, pPal, pSubset, rDamage, bBlack ) );
#ifdef SAL_LOG_INFO
std::ostringstream subset;
@@ -2156,14 +2146,30 @@ BitmapDeviceSharedPtr createBitmapDeviceImpl( const basegfx::B2IVector&
}
} // namespace
+sal_Int32 getBitmapDeviceStrideForWidth(Format nScanlineFormat, sal_Int32 nWidth)
+{
+ sal_uInt8 nBitsPerPixel = bitsPerPixel[nScanlineFormat];
+ // round up to full 8 bit, divide by 8
+ sal_Int32 nScanlineStride = (nWidth*nBitsPerPixel + 7) >> 3;
+
+ // rounded up to next full power-of-two number of bytes
+ const sal_uInt32 bytesPerPixel = nextPow2(
+ (bitsPerPixel[nScanlineFormat] + 7) >> 3);
+
+ // now make nScanlineStride a multiple of bytesPerPixel
+ nScanlineStride = (nScanlineStride + bytesPerPixel - 1) / bytesPerPixel * bytesPerPixel;
+ return nScanlineStride;
+}
BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown,
- Format nScanlineFormat )
+ Format nScanlineFormat,
+ sal_Int32 nScanlineStride )
{
return createBitmapDeviceImpl( rSize,
bTopDown,
nScanlineFormat,
+ nScanlineStride,
boost::shared_array< sal_uInt8 >(),
PaletteMemorySharedVector(),
NULL,
@@ -2173,11 +2179,13 @@ BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown,
Format nScanlineFormat,
+ sal_Int32 nScanlineStride,
const PaletteMemorySharedVector& rPalette )
{
return createBitmapDeviceImpl( rSize,
bTopDown,
nScanlineFormat,
+ nScanlineStride,
boost::shared_array< sal_uInt8 >(),
rPalette,
NULL,
@@ -2187,12 +2195,14 @@ BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize
BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown,
Format nScanlineFormat,
+ sal_Int32 nScanlineStride,
const RawMemorySharedArray& rMem,
const PaletteMemorySharedVector& rPalette )
{
return createBitmapDeviceImpl( rSize,
bTopDown,
nScanlineFormat,
+ nScanlineStride,
rMem,
rPalette,
NULL,
@@ -2205,6 +2215,7 @@ BitmapDeviceSharedPtr createClipDevice( const basegfx::B2IVector& rSize )
createBitmapDeviceImpl( rSize,
false, /* bTopDown */
basebmp::FORMAT_ONE_BIT_MSB_GREY,
+ getBitmapDeviceStrideForWidth(basebmp::FORMAT_ONE_BIT_MSB_GREY, rSize.getX()),
boost::shared_array< sal_uInt8 >(),
PaletteMemorySharedVector(),
NULL,
@@ -2220,6 +2231,7 @@ BitmapDeviceSharedPtr subsetBitmapDevice( const BitmapDeviceSharedPtr& rProto,
return createBitmapDeviceImpl( rProto->getSize(),
rProto->isTopDown(),
rProto->getScanlineFormat(),
+ rProto->getScanlineStride(),
rProto->getBuffer(),
rProto->getPalette(),
&rSubset,
@@ -2232,6 +2244,7 @@ BitmapDeviceSharedPtr cloneBitmapDevice( const basegfx::B2IVector& rSize,
return createBitmapDeviceImpl( rSize,
rProto->isTopDown(),
rProto->getScanlineFormat(),
+ rProto->getScanlineStride(),
boost::shared_array< sal_uInt8 >(),
rProto->getPalette(),
NULL,
diff --git a/basebmp/test/basictest.cxx b/basebmp/test/basictest.cxx
index 4290ed7a865a..59d7e773a538 100644
--- a/basebmp/test/basictest.cxx
+++ b/basebmp/test/basictest.cxx
@@ -83,7 +83,8 @@ public:
basegfx::B2ISize aSize2(aSize);
BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL ));
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX())));
CPPUNIT_ASSERT_MESSAGE("right size",
pDevice->getSize() == aSize2 );
CPPUNIT_ASSERT_MESSAGE("Top down format",
@@ -106,7 +107,8 @@ public:
basegfx::B2ISize aSize2(3,3);
BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL ));
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX())));
BitmapDeviceSharedPtr pClone( cloneBitmapDevice(
aSize2,
@@ -121,7 +123,8 @@ public:
const basegfx::B2ISize aSize(64,64);
BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL ));
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX())));
const basegfx::B2IPoint aPt(3,3);
CPPUNIT_ASSERT_MESSAGE("getPixelData for virgin device",
@@ -168,7 +171,8 @@ public:
{
pDevice = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_LSB_PAL );
+ FORMAT_ONE_BIT_LSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_LSB_PAL, aSize.getX()));
pDevice->setPixel( aPt2, aCol, DrawMode_PAINT );
CPPUNIT_ASSERT_MESSAGE("get/setPixel roundtrip #4",
@@ -193,7 +197,8 @@ public:
{
pDevice = createBitmapDevice( aSize,
true,
- FORMAT_EIGHT_BIT_GREY );
+ FORMAT_EIGHT_BIT_GREY,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_EIGHT_BIT_GREY, aSize.getX()));
const Color aCol4(0x010101);
pDevice->setPixel( aPt, aCol4, DrawMode_PAINT );
@@ -215,7 +220,8 @@ public:
{
pDevice = createBitmapDevice( aSize,
true,
- FORMAT_SIXTEEN_BIT_LSB_TC_MASK );
+ FORMAT_SIXTEEN_BIT_LSB_TC_MASK,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_SIXTEEN_BIT_LSB_TC_MASK, aSize.getX()));
const Color aCol7(0);
pDevice->clear( aCol7 );
@@ -239,7 +245,8 @@ public:
{
pDevice = createBitmapDevice( aSize,
true,
- FORMAT_TWENTYFOUR_BIT_TC_MASK );
+ FORMAT_TWENTYFOUR_BIT_TC_MASK,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_TWENTYFOUR_BIT_TC_MASK, aSize.getX()));
const Color aCol4(0x01010101);
pDevice->setPixel( aPt, aCol4, DrawMode_PAINT );
@@ -266,7 +273,8 @@ public:
{
pDevice = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX()));
const Color aCol4(0x01010101);
pDevice->setPixel( aPt, aCol4, DrawMode_PAINT );
diff --git a/basebmp/test/bmpmasktest.cxx b/basebmp/test/bmpmasktest.cxx
index 610707a069ae..c9df8b20977d 100644
--- a/basebmp/test/bmpmasktest.cxx
+++ b/basebmp/test/bmpmasktest.cxx
@@ -93,21 +93,26 @@ public:
const basegfx::B2ISize aSize(10,10);
mpDevice1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpDevice32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX()));
mpMaskBmp1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_GREY );
+ FORMAT_ONE_BIT_MSB_GREY,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_GREY, aSize.getX()));
mpBmp1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpBmp32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX()));
OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
diff --git a/basebmp/test/bmptest.cxx b/basebmp/test/bmptest.cxx
index 1f051aed1034..30644fb74930 100644
--- a/basebmp/test/bmptest.cxx
+++ b/basebmp/test/bmptest.cxx
@@ -148,19 +148,23 @@ public:
void setUp() SAL_OVERRIDE
{
const basegfx::B2ISize aSize(10,10);
+ sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX());
mpDevice1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL, nStride );
+ nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX());
mpDevice32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, nStride );
+ nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX());
mpBmp1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL, nStride );
+ nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX());
mpBmp32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, nStride );
OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
diff --git a/basebmp/test/cliptest.cxx b/basebmp/test/cliptest.cxx
index 8526964a08ac..13ad48c37a43 100644
--- a/basebmp/test/cliptest.cxx
+++ b/basebmp/test/cliptest.cxx
@@ -154,9 +154,10 @@ private:
void implTestMaskColorClip(const BitmapDeviceSharedPtr& rDevice)
{
+ sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_EIGHT_BIT_GREY, rDevice->getSize().getX());
BitmapDeviceSharedPtr pBmp( createBitmapDevice( rDevice->getSize(),
true,
- FORMAT_EIGHT_BIT_GREY ));
+ FORMAT_EIGHT_BIT_GREY, nStride ));
OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
@@ -188,15 +189,18 @@ public:
void setUp() SAL_OVERRIDE
{
const basegfx::B2ISize aSize(11,11);
+ sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_GREY, aSize.getX());
mpClipMask = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_GREY );
+ FORMAT_ONE_BIT_MSB_GREY, nStride );
+ nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX());
mpDevice1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL, nStride );
+ nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX());
mpDevice32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, nStride );
OUString aSvg( "m 0 0 h5 l5 5 v5 h-5 l-5-5 z" );
basegfx::B2DPolyPolygon aPoly;
diff --git a/basebmp/test/filltest.cxx b/basebmp/test/filltest.cxx
index 067ec24cb471..875a27dac2e5 100644
--- a/basebmp/test/filltest.cxx
+++ b/basebmp/test/filltest.cxx
@@ -211,10 +211,12 @@ public:
const basegfx::B2ISize aSize(11,11);
mpDevice1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpDevice32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX()));
}
void testRectFill()
diff --git a/basebmp/test/linetest.cxx b/basebmp/test/linetest.cxx
index f6a39099087c..731158e693f6 100644
--- a/basebmp/test/linetest.cxx
+++ b/basebmp/test/linetest.cxx
@@ -151,10 +151,12 @@ public:
const basegfx::B2ISize aSize(11,11);
mpDevice1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()) );
mpDevice32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX()) );
}
void testCornerCases()
@@ -163,7 +165,8 @@ public:
BitmapDeviceSharedPtr pDevice = createBitmapDevice(
aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()) );
const basegfx::B2IPoint aPt1(0,0);
const basegfx::B2IPoint aPt2(10,10);
@@ -179,7 +182,8 @@ public:
pDevice = createBitmapDevice(
aSize2,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
CPPUNIT_ASSERT_MESSAGE("only pixel cleared",
pDevice->getPixelData(aPt1) == 0);
diff --git a/basebmp/test/masktest.cxx b/basebmp/test/masktest.cxx
index 90a345c62e8b..94c11307def7 100644
--- a/basebmp/test/masktest.cxx
+++ b/basebmp/test/masktest.cxx
@@ -104,14 +104,17 @@ public:
const basegfx::B2ISize aSize(10,10);
mpDevice1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()) );
mpDevice32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX()) );
mpMask = createBitmapDevice( aSize,
true,
- FORMAT_EIGHT_BIT_GREY );
+ FORMAT_EIGHT_BIT_GREY,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_EIGHT_BIT_GREY, aSize.getX()) );
OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
diff --git a/basebmp/test/polytest.cxx b/basebmp/test/polytest.cxx
index a0371ebe21cc..60746d753756 100644
--- a/basebmp/test/polytest.cxx
+++ b/basebmp/test/polytest.cxx
@@ -296,10 +296,12 @@ public:
const basegfx::B2ISize aSize(10,10);
mpDevice1bpp = createBitmapDevice( aSize,
true,
- FORMAT_ONE_BIT_MSB_PAL );
+ FORMAT_ONE_BIT_MSB_PAL,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpDevice32bpp = createBitmapDevice( aSize,
true,
- FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
+ FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA,
+ basebmp::getBitmapDeviceStrideForWidth(FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, aSize.getX()));
}
void testEmpty()
diff --git a/include/basebmp/bitmapdevice.hxx b/include/basebmp/bitmapdevice.hxx
index 48c6d474c809..595374183697 100644
--- a/include/basebmp/bitmapdevice.hxx
+++ b/include/basebmp/bitmapdevice.hxx
@@ -659,11 +659,17 @@ private:
std::unique_ptr< ImplBitmapDevice > mpImpl;
};
+/** Function to calculate a suitable BitmapDevice Scanline Stride for a given scanline format and width
+ * you can provide this value or any larger value.
+ */
+sal_Int32 BASEBMP_DLLPUBLIC getBitmapDeviceStrideForWidth(Format nScanlineFormat, sal_Int32 nWidth);
+
/** Function to create a BitmapDevice for given scanline format
*/
BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown,
- Format nScanlineFormat );
+ Format nScanlineFormat,
+ sal_Int32 nScanlineStride );
/** Function to create a BitmapDevice for given scanline format
with the given palette
@@ -675,6 +681,7 @@ BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVe
BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown,
Format nScanlineFormat,
+ sal_Int32 nScanlineStride,
const PaletteMemorySharedVector& rPalette );
/** Function to create a BitmapDevice for given scanline format
@@ -686,6 +693,7 @@ BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVe
BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown,
Format nScanlineFormat,
+ sal_Int32 nScanlineStride,
const RawMemorySharedArray& rMem,
const PaletteMemorySharedVector& rPalette );
diff --git a/vcl/headless/svpbmp.cxx b/vcl/headless/svpbmp.cxx
index bc2b2b90d8b8..cedb9751a025 100644
--- a/vcl/headless/svpbmp.cxx
+++ b/vcl/headless/svpbmp.cxx
@@ -52,8 +52,9 @@ bool SvpSalBitmap::Create( const Size& rSize,
aSize.setX( 1 );
if( aSize.getY() == 0 )
aSize.setY( 1 );
+ sal_Int32 nStride = getBitmapDeviceStrideForWidth(nFormat, aSize.getX());
if( nBitCount > 8 )
- m_aBitmap = createBitmapDevice( aSize, false, nFormat );
+ m_aBitmap = createBitmapDevice( aSize, false, nFormat, nStride );
else
{
// prepare palette
@@ -66,7 +67,7 @@ bool SvpSalBitmap::Create( const Size& rSize,
const BitmapColor& rCol = rPalette[i];
(*pPalette)[i] = basebmp::Color( rCol.GetRed(), rCol.GetGreen(), rCol.GetBlue() );
}
- m_aBitmap = createBitmapDevice( aSize, false, nFormat,
+ m_aBitmap = createBitmapDevice( aSize, false, nFormat, nStride,
basebmp::RawMemorySharedArray(),
basebmp::PaletteMemorySharedVector( pPalette )
);
@@ -326,6 +327,7 @@ void SvpSalBitmap::ReleaseBuffer( BitmapBuffer* pBuffer, BitmapAccessMode nMode
m_aBitmap = basebmp::createBitmapDevice( m_aBitmap->getSize(),
m_aBitmap->isTopDown(),
m_aBitmap->getScanlineFormat(),
+ m_aBitmap->getScanlineStride(),
m_aBitmap->getBuffer(),
pPal );
}
diff --git a/vcl/headless/svpframe.cxx b/vcl/headless/svpframe.cxx
index 86915bfd6a18..7e91e1dcf49f 100644
--- a/vcl/headless/svpframe.cxx
+++ b/vcl/headless/svpframe.cxx
@@ -295,7 +295,8 @@ void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_u
aFrameSize.setX( 1 );
if( aFrameSize.getY() == 0 )
aFrameSize.setY( 1 );
- m_aFrame = createBitmapDevice( aFrameSize, m_bTopDown, m_nScanlineFormat );
+ sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(m_nScanlineFormat, aFrameSize.getX());
+ m_aFrame = createBitmapDevice( aFrameSize, m_bTopDown, m_nScanlineFormat, nStride );
if (m_bDamageTracking)
m_aFrame->setDamageTracker(
basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx
index b075399d27e2..ef6e1ab2679a 100644
--- a/vcl/headless/svptext.cxx
+++ b/vcl/headless/svptext.cxx
@@ -151,13 +151,13 @@ BitmapDeviceSharedPtr SvpGlyphPeer::GetGlyphBmp( ServerFont& rServerFont,
}
// construct alpha mask from raw bitmap
- const B2IVector aSize(
- pGcpHelper->maRawBitmap.mnScanlineSize,
- pGcpHelper->maRawBitmap.mnHeight );
- if( aSize.getX() && aSize.getY() )
+ if (pGcpHelper->maRawBitmap.mnScanlineSize && pGcpHelper->maRawBitmap.mnHeight)
{
+ const B2IVector aSize(
+ pGcpHelper->maRawBitmap.mnScanlineSize,
+ pGcpHelper->maRawBitmap.mnHeight );
static PaletteMemorySharedVector aDummyPAL;
- pGcpHelper->maBitmapDev = createBitmapDevice( aSize, true, nBmpFormat, pGcpHelper->maRawBitmap.mpBits, aDummyPAL );
+ pGcpHelper->maBitmapDev = createBitmapDevice( aSize, true, nBmpFormat, aSize.getX(), pGcpHelper->maRawBitmap.mpBits, aDummyPAL );
}
rGlyphData.ExtDataRef().meInfo = nBmpFormat;
diff --git a/vcl/headless/svpvd.cxx b/vcl/headless/svpvd.cxx
index e2f9042d9edb..84701eb6c459 100644
--- a/vcl/headless/svpvd.cxx
+++ b/vcl/headless/svpvd.cxx
@@ -69,19 +69,21 @@ bool SvpSalVirtualDevice::SetSizeUsingBuffer( long nNewDX, long nNewDY,
SvpSalInstance* pInst = SvpSalInstance::s_pDefaultInstance;
assert( pInst );
basebmp::Format nFormat = pInst->getFormatForBitCount( m_nBitCount );
+ sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(nFormat, aDevSize.getX());
if ( m_nBitCount == 1 )
{
std::vector< basebmp::Color > aDevPal(2);
aDevPal.push_back( basebmp::Color( 0, 0, 0 ) );
aDevPal.push_back( basebmp::Color( 0xff, 0xff, 0xff ) );
- m_aDevice = createBitmapDevice( aDevSize, bTopDown, nFormat, PaletteMemorySharedVector( new std::vector< basebmp::Color >(aDevPal) ) );
+ m_aDevice = createBitmapDevice( aDevSize, bTopDown, nFormat, nStride,
+ PaletteMemorySharedVector( new std::vector< basebmp::Color >(aDevPal) ) );
}
else
{
m_aDevice = pBuffer ?
- createBitmapDevice( aDevSize, bTopDown, nFormat, pBuffer, PaletteMemorySharedVector() )
- : createBitmapDevice( aDevSize, bTopDown, nFormat );
+ createBitmapDevice( aDevSize, bTopDown, nFormat, nStride, pBuffer, PaletteMemorySharedVector() )
+ : createBitmapDevice( aDevSize, bTopDown, nFormat, nStride );
}
// update device in existing graphics
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 82c70e7cdd19..812ff5053a11 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -1965,8 +1965,9 @@ void GtkSalFrame::AllocateFrame()
aFrameSize.setX( 1 );
if( aFrameSize.getY() == 0 )
aFrameSize.setY( 1 );
- m_aFrame = basebmp::createBitmapDevice( aFrameSize, true,
- basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK );
+ sal_Int32 nStride(basebmp::getBitmapDeviceStrideForWidth(basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK, aFrameSize.getX()));
+ m_aFrame = basebmp::createBitmapDevice(aFrameSize, true,
+ basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK, nStride);
m_aFrame->setDamageTracker(
basebmp::IBitmapDeviceDamageTrackerSharedPtr(new DamageTracker(*this)) );
fprintf( stderr, "allocated m_aFrame size of %dx%d \n",