Kaydet (Commit) efe28833 authored tarafından Caolán McNamara's avatar Caolán McNamara

make ScanlineStride an argument to createBitmapDevice

so we could create bitmap devices that have the same stride that cairo expects,
provide getBitmapDeviceStrideForWidth to get a default value

Change-Id: I7ecc6f54a734b3f6bed59c699ac3b482c4ad7c47
üst 28f909df
...@@ -1933,14 +1933,12 @@ inline sal_uInt32 nextPow2( sal_uInt32 x ) ...@@ -1933,14 +1933,12 @@ inline sal_uInt32 nextPow2( sal_uInt32 x )
return ++x; return ++x;
} }
namespace namespace
{ {
BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector& rSize, BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat, Format nScanlineFormat,
sal_Int32 nScanlineStride,
boost::shared_array< sal_uInt8 > pMem, boost::shared_array< sal_uInt8 > pMem,
PaletteMemorySharedVector pPal, PaletteMemorySharedVector pPal,
const basegfx::B2IBox* pSubset, const basegfx::B2IBox* pSubset,
...@@ -1960,15 +1958,6 @@ BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector& ...@@ -1960,15 +1958,6 @@ BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector&
rSize.getX() << " for depth " << nBitsPerPixel); rSize.getX() << " for depth " << nBitsPerPixel);
return BitmapDeviceSharedPtr(); 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 // factor in bottom-up scanline order case
nScanlineStride *= bTopDown ? 1 : -1; nScanlineStride *= bTopDown ? 1 : -1;
...@@ -2130,13 +2119,14 @@ BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector& ...@@ -2130,13 +2119,14 @@ BitmapDeviceSharedPtr createBitmapDeviceImplInner( const basegfx::B2IVector&
BitmapDeviceSharedPtr createBitmapDeviceImpl( const basegfx::B2IVector& rSize, BitmapDeviceSharedPtr createBitmapDeviceImpl( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat, Format nScanlineFormat,
sal_Int32 nScanlineStride,
boost::shared_array< sal_uInt8 > pMem, boost::shared_array< sal_uInt8 > pMem,
PaletteMemorySharedVector pPal, PaletteMemorySharedVector pPal,
const basegfx::B2IBox* pSubset, const basegfx::B2IBox* pSubset,
const IBitmapDeviceDamageTrackerSharedPtr& rDamage, const IBitmapDeviceDamageTrackerSharedPtr& rDamage,
bool bBlack = true) 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 #ifdef SAL_LOG_INFO
std::ostringstream subset; std::ostringstream subset;
...@@ -2156,14 +2146,30 @@ BitmapDeviceSharedPtr createBitmapDeviceImpl( const basegfx::B2IVector& ...@@ -2156,14 +2146,30 @@ BitmapDeviceSharedPtr createBitmapDeviceImpl( const basegfx::B2IVector&
} }
} // namespace } // 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, BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat ) Format nScanlineFormat,
sal_Int32 nScanlineStride )
{ {
return createBitmapDeviceImpl( rSize, return createBitmapDeviceImpl( rSize,
bTopDown, bTopDown,
nScanlineFormat, nScanlineFormat,
nScanlineStride,
boost::shared_array< sal_uInt8 >(), boost::shared_array< sal_uInt8 >(),
PaletteMemorySharedVector(), PaletteMemorySharedVector(),
NULL, NULL,
...@@ -2173,11 +2179,13 @@ BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize, ...@@ -2173,11 +2179,13 @@ BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize, BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat, Format nScanlineFormat,
sal_Int32 nScanlineStride,
const PaletteMemorySharedVector& rPalette ) const PaletteMemorySharedVector& rPalette )
{ {
return createBitmapDeviceImpl( rSize, return createBitmapDeviceImpl( rSize,
bTopDown, bTopDown,
nScanlineFormat, nScanlineFormat,
nScanlineStride,
boost::shared_array< sal_uInt8 >(), boost::shared_array< sal_uInt8 >(),
rPalette, rPalette,
NULL, NULL,
...@@ -2187,12 +2195,14 @@ BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize ...@@ -2187,12 +2195,14 @@ BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize
BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize, BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat, Format nScanlineFormat,
sal_Int32 nScanlineStride,
const RawMemorySharedArray& rMem, const RawMemorySharedArray& rMem,
const PaletteMemorySharedVector& rPalette ) const PaletteMemorySharedVector& rPalette )
{ {
return createBitmapDeviceImpl( rSize, return createBitmapDeviceImpl( rSize,
bTopDown, bTopDown,
nScanlineFormat, nScanlineFormat,
nScanlineStride,
rMem, rMem,
rPalette, rPalette,
NULL, NULL,
...@@ -2205,6 +2215,7 @@ BitmapDeviceSharedPtr createClipDevice( const basegfx::B2IVector& rSize ) ...@@ -2205,6 +2215,7 @@ BitmapDeviceSharedPtr createClipDevice( const basegfx::B2IVector& rSize )
createBitmapDeviceImpl( rSize, createBitmapDeviceImpl( rSize,
false, /* bTopDown */ false, /* bTopDown */
basebmp::FORMAT_ONE_BIT_MSB_GREY, basebmp::FORMAT_ONE_BIT_MSB_GREY,
getBitmapDeviceStrideForWidth(basebmp::FORMAT_ONE_BIT_MSB_GREY, rSize.getX()),
boost::shared_array< sal_uInt8 >(), boost::shared_array< sal_uInt8 >(),
PaletteMemorySharedVector(), PaletteMemorySharedVector(),
NULL, NULL,
...@@ -2220,6 +2231,7 @@ BitmapDeviceSharedPtr subsetBitmapDevice( const BitmapDeviceSharedPtr& rProto, ...@@ -2220,6 +2231,7 @@ BitmapDeviceSharedPtr subsetBitmapDevice( const BitmapDeviceSharedPtr& rProto,
return createBitmapDeviceImpl( rProto->getSize(), return createBitmapDeviceImpl( rProto->getSize(),
rProto->isTopDown(), rProto->isTopDown(),
rProto->getScanlineFormat(), rProto->getScanlineFormat(),
rProto->getScanlineStride(),
rProto->getBuffer(), rProto->getBuffer(),
rProto->getPalette(), rProto->getPalette(),
&rSubset, &rSubset,
...@@ -2232,6 +2244,7 @@ BitmapDeviceSharedPtr cloneBitmapDevice( const basegfx::B2IVector& rSize, ...@@ -2232,6 +2244,7 @@ BitmapDeviceSharedPtr cloneBitmapDevice( const basegfx::B2IVector& rSize,
return createBitmapDeviceImpl( rSize, return createBitmapDeviceImpl( rSize,
rProto->isTopDown(), rProto->isTopDown(),
rProto->getScanlineFormat(), rProto->getScanlineFormat(),
rProto->getScanlineStride(),
boost::shared_array< sal_uInt8 >(), boost::shared_array< sal_uInt8 >(),
rProto->getPalette(), rProto->getPalette(),
NULL, NULL,
......
...@@ -83,7 +83,8 @@ public: ...@@ -83,7 +83,8 @@ public:
basegfx::B2ISize aSize2(aSize); basegfx::B2ISize aSize2(aSize);
BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize, BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize,
true, 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", CPPUNIT_ASSERT_MESSAGE("right size",
pDevice->getSize() == aSize2 ); pDevice->getSize() == aSize2 );
CPPUNIT_ASSERT_MESSAGE("Top down format", CPPUNIT_ASSERT_MESSAGE("Top down format",
...@@ -106,7 +107,8 @@ public: ...@@ -106,7 +107,8 @@ public:
basegfx::B2ISize aSize2(3,3); basegfx::B2ISize aSize2(3,3);
BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize, BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_PAL )); FORMAT_ONE_BIT_MSB_PAL,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX())));
BitmapDeviceSharedPtr pClone( cloneBitmapDevice( BitmapDeviceSharedPtr pClone( cloneBitmapDevice(
aSize2, aSize2,
...@@ -121,7 +123,8 @@ public: ...@@ -121,7 +123,8 @@ public:
const basegfx::B2ISize aSize(64,64); const basegfx::B2ISize aSize(64,64);
BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize, BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize,
true, 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); const basegfx::B2IPoint aPt(3,3);
CPPUNIT_ASSERT_MESSAGE("getPixelData for virgin device", CPPUNIT_ASSERT_MESSAGE("getPixelData for virgin device",
...@@ -168,7 +171,8 @@ public: ...@@ -168,7 +171,8 @@ public:
{ {
pDevice = createBitmapDevice( aSize, pDevice = createBitmapDevice( aSize,
true, 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 ); pDevice->setPixel( aPt2, aCol, DrawMode_PAINT );
CPPUNIT_ASSERT_MESSAGE("get/setPixel roundtrip #4", CPPUNIT_ASSERT_MESSAGE("get/setPixel roundtrip #4",
...@@ -193,7 +197,8 @@ public: ...@@ -193,7 +197,8 @@ public:
{ {
pDevice = createBitmapDevice( aSize, pDevice = createBitmapDevice( aSize,
true, true,
FORMAT_EIGHT_BIT_GREY ); FORMAT_EIGHT_BIT_GREY,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_EIGHT_BIT_GREY, aSize.getX()));
const Color aCol4(0x010101); const Color aCol4(0x010101);
pDevice->setPixel( aPt, aCol4, DrawMode_PAINT ); pDevice->setPixel( aPt, aCol4, DrawMode_PAINT );
...@@ -215,7 +220,8 @@ public: ...@@ -215,7 +220,8 @@ public:
{ {
pDevice = createBitmapDevice( aSize, pDevice = createBitmapDevice( aSize,
true, 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); const Color aCol7(0);
pDevice->clear( aCol7 ); pDevice->clear( aCol7 );
...@@ -239,7 +245,8 @@ public: ...@@ -239,7 +245,8 @@ public:
{ {
pDevice = createBitmapDevice( aSize, pDevice = createBitmapDevice( aSize,
true, true,
FORMAT_TWENTYFOUR_BIT_TC_MASK ); FORMAT_TWENTYFOUR_BIT_TC_MASK,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_TWENTYFOUR_BIT_TC_MASK, aSize.getX()));
const Color aCol4(0x01010101); const Color aCol4(0x01010101);
pDevice->setPixel( aPt, aCol4, DrawMode_PAINT ); pDevice->setPixel( aPt, aCol4, DrawMode_PAINT );
...@@ -266,7 +273,8 @@ public: ...@@ -266,7 +273,8 @@ public:
{ {
pDevice = createBitmapDevice( aSize, pDevice = createBitmapDevice( aSize,
true, 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); const Color aCol4(0x01010101);
pDevice->setPixel( aPt, aCol4, DrawMode_PAINT ); pDevice->setPixel( aPt, aCol4, DrawMode_PAINT );
......
...@@ -93,21 +93,26 @@ public: ...@@ -93,21 +93,26 @@ public:
const basegfx::B2ISize aSize(10,10); const basegfx::B2ISize aSize(10,10);
mpDevice1bpp = createBitmapDevice( aSize, mpDevice1bpp = createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_PAL ); FORMAT_ONE_BIT_MSB_PAL,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpDevice32bpp = createBitmapDevice( aSize, mpDevice32bpp = createBitmapDevice( aSize,
true, 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, mpMaskBmp1bpp = createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_GREY ); FORMAT_ONE_BIT_MSB_GREY,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_GREY, aSize.getX()));
mpBmp1bpp = createBitmapDevice( aSize, mpBmp1bpp = createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_PAL ); FORMAT_ONE_BIT_MSB_PAL,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpBmp32bpp = createBitmapDevice( aSize, mpBmp32bpp = createBitmapDevice( aSize,
true, 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" ); OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
......
...@@ -148,19 +148,23 @@ public: ...@@ -148,19 +148,23 @@ public:
void setUp() SAL_OVERRIDE void setUp() SAL_OVERRIDE
{ {
const basegfx::B2ISize aSize(10,10); const basegfx::B2ISize aSize(10,10);
sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX());
mpDevice1bpp = createBitmapDevice( aSize, mpDevice1bpp = createBitmapDevice( aSize,
true, 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, mpDevice32bpp = createBitmapDevice( aSize,
true, 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, mpBmp1bpp = createBitmapDevice( aSize,
true, 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, mpBmp32bpp = createBitmapDevice( aSize,
true, true,
FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA ); FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA, nStride );
OUString aSvg( "m 0 0h5v10h5v-5h-10z" ); OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
......
...@@ -154,9 +154,10 @@ private: ...@@ -154,9 +154,10 @@ private:
void implTestMaskColorClip(const BitmapDeviceSharedPtr& rDevice) void implTestMaskColorClip(const BitmapDeviceSharedPtr& rDevice)
{ {
sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_EIGHT_BIT_GREY, rDevice->getSize().getX());
BitmapDeviceSharedPtr pBmp( createBitmapDevice( rDevice->getSize(), BitmapDeviceSharedPtr pBmp( createBitmapDevice( rDevice->getSize(),
true, true,
FORMAT_EIGHT_BIT_GREY )); FORMAT_EIGHT_BIT_GREY, nStride ));
OUString aSvg( "m 0 0h5v10h5v-5h-10z" ); OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
...@@ -188,15 +189,18 @@ public: ...@@ -188,15 +189,18 @@ public:
void setUp() SAL_OVERRIDE void setUp() SAL_OVERRIDE
{ {
const basegfx::B2ISize aSize(11,11); const basegfx::B2ISize aSize(11,11);
sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_GREY, aSize.getX());
mpClipMask = createBitmapDevice( aSize, mpClipMask = createBitmapDevice( aSize,
true, 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, mpDevice1bpp = createBitmapDevice( aSize,
true, 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, mpDevice32bpp = createBitmapDevice( aSize,
true, 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" ); OUString aSvg( "m 0 0 h5 l5 5 v5 h-5 l-5-5 z" );
basegfx::B2DPolyPolygon aPoly; basegfx::B2DPolyPolygon aPoly;
......
...@@ -211,10 +211,12 @@ public: ...@@ -211,10 +211,12 @@ public:
const basegfx::B2ISize aSize(11,11); const basegfx::B2ISize aSize(11,11);
mpDevice1bpp = createBitmapDevice( aSize, mpDevice1bpp = createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_PAL ); FORMAT_ONE_BIT_MSB_PAL,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpDevice32bpp = createBitmapDevice( aSize, mpDevice32bpp = createBitmapDevice( aSize,
true, 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() void testRectFill()
......
...@@ -151,10 +151,12 @@ public: ...@@ -151,10 +151,12 @@ public:
const basegfx::B2ISize aSize(11,11); const basegfx::B2ISize aSize(11,11);
mpDevice1bpp = createBitmapDevice( aSize, mpDevice1bpp = createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_PAL ); FORMAT_ONE_BIT_MSB_PAL,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()) );
mpDevice32bpp = createBitmapDevice( aSize, mpDevice32bpp = createBitmapDevice( aSize,
true, 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() void testCornerCases()
...@@ -163,7 +165,8 @@ public: ...@@ -163,7 +165,8 @@ public:
BitmapDeviceSharedPtr pDevice = createBitmapDevice( BitmapDeviceSharedPtr pDevice = createBitmapDevice(
aSize, aSize,
true, 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 aPt1(0,0);
const basegfx::B2IPoint aPt2(10,10); const basegfx::B2IPoint aPt2(10,10);
...@@ -179,7 +182,8 @@ public: ...@@ -179,7 +182,8 @@ public:
pDevice = createBitmapDevice( pDevice = createBitmapDevice(
aSize2, aSize2,
true, 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", CPPUNIT_ASSERT_MESSAGE("only pixel cleared",
pDevice->getPixelData(aPt1) == 0); pDevice->getPixelData(aPt1) == 0);
......
...@@ -104,14 +104,17 @@ public: ...@@ -104,14 +104,17 @@ public:
const basegfx::B2ISize aSize(10,10); const basegfx::B2ISize aSize(10,10);
mpDevice1bpp = createBitmapDevice( aSize, mpDevice1bpp = createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_PAL ); FORMAT_ONE_BIT_MSB_PAL,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()) );
mpDevice32bpp = createBitmapDevice( aSize, mpDevice32bpp = createBitmapDevice( aSize,
true, 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, mpMask = createBitmapDevice( aSize,
true, true,
FORMAT_EIGHT_BIT_GREY ); FORMAT_EIGHT_BIT_GREY,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_EIGHT_BIT_GREY, aSize.getX()) );
OUString aSvg( "m 0 0h5v10h5v-5h-10z" ); OUString aSvg( "m 0 0h5v10h5v-5h-10z" );
......
...@@ -296,10 +296,12 @@ public: ...@@ -296,10 +296,12 @@ public:
const basegfx::B2ISize aSize(10,10); const basegfx::B2ISize aSize(10,10);
mpDevice1bpp = createBitmapDevice( aSize, mpDevice1bpp = createBitmapDevice( aSize,
true, true,
FORMAT_ONE_BIT_MSB_PAL ); FORMAT_ONE_BIT_MSB_PAL,
basebmp::getBitmapDeviceStrideForWidth(FORMAT_ONE_BIT_MSB_PAL, aSize.getX()));
mpDevice32bpp = createBitmapDevice( aSize, mpDevice32bpp = createBitmapDevice( aSize,
true, 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() void testEmpty()
......
...@@ -659,11 +659,17 @@ private: ...@@ -659,11 +659,17 @@ private:
std::unique_ptr< ImplBitmapDevice > mpImpl; 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 /** Function to create a BitmapDevice for given scanline format
*/ */
BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize, BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat ); Format nScanlineFormat,
sal_Int32 nScanlineStride );
/** Function to create a BitmapDevice for given scanline format /** Function to create a BitmapDevice for given scanline format
with the given palette with the given palette
...@@ -675,6 +681,7 @@ BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVe ...@@ -675,6 +681,7 @@ BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVe
BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize, BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat, Format nScanlineFormat,
sal_Int32 nScanlineStride,
const PaletteMemorySharedVector& rPalette ); const PaletteMemorySharedVector& rPalette );
/** Function to create a BitmapDevice for given scanline format /** Function to create a BitmapDevice for given scanline format
...@@ -686,6 +693,7 @@ BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVe ...@@ -686,6 +693,7 @@ BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVe
BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize, BitmapDeviceSharedPtr BASEBMP_DLLPUBLIC createBitmapDevice( const basegfx::B2IVector& rSize,
bool bTopDown, bool bTopDown,
Format nScanlineFormat, Format nScanlineFormat,
sal_Int32 nScanlineStride,
const RawMemorySharedArray& rMem, const RawMemorySharedArray& rMem,
const PaletteMemorySharedVector& rPalette ); const PaletteMemorySharedVector& rPalette );
......
...@@ -52,8 +52,9 @@ bool SvpSalBitmap::Create( const Size& rSize, ...@@ -52,8 +52,9 @@ bool SvpSalBitmap::Create( const Size& rSize,
aSize.setX( 1 ); aSize.setX( 1 );
if( aSize.getY() == 0 ) if( aSize.getY() == 0 )
aSize.setY( 1 ); aSize.setY( 1 );
sal_Int32 nStride = getBitmapDeviceStrideForWidth(nFormat, aSize.getX());
if( nBitCount > 8 ) if( nBitCount > 8 )
m_aBitmap = createBitmapDevice( aSize, false, nFormat ); m_aBitmap = createBitmapDevice( aSize, false, nFormat, nStride );
else else
{ {
// prepare palette // prepare palette
...@@ -66,7 +67,7 @@ bool SvpSalBitmap::Create( const Size& rSize, ...@@ -66,7 +67,7 @@ bool SvpSalBitmap::Create( const Size& rSize,
const BitmapColor& rCol = rPalette[i]; const BitmapColor& rCol = rPalette[i];
(*pPalette)[i] = basebmp::Color( rCol.GetRed(), rCol.GetGreen(), rCol.GetBlue() ); (*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::RawMemorySharedArray(),
basebmp::PaletteMemorySharedVector( pPalette ) basebmp::PaletteMemorySharedVector( pPalette )
); );
...@@ -326,6 +327,7 @@ void SvpSalBitmap::ReleaseBuffer( BitmapBuffer* pBuffer, BitmapAccessMode nMode ...@@ -326,6 +327,7 @@ void SvpSalBitmap::ReleaseBuffer( BitmapBuffer* pBuffer, BitmapAccessMode nMode
m_aBitmap = basebmp::createBitmapDevice( m_aBitmap->getSize(), m_aBitmap = basebmp::createBitmapDevice( m_aBitmap->getSize(),
m_aBitmap->isTopDown(), m_aBitmap->isTopDown(),
m_aBitmap->getScanlineFormat(), m_aBitmap->getScanlineFormat(),
m_aBitmap->getScanlineStride(),
m_aBitmap->getBuffer(), m_aBitmap->getBuffer(),
pPal ); pPal );
} }
......
...@@ -295,7 +295,8 @@ void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_u ...@@ -295,7 +295,8 @@ void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_u
aFrameSize.setX( 1 ); aFrameSize.setX( 1 );
if( aFrameSize.getY() == 0 ) if( aFrameSize.getY() == 0 )
aFrameSize.setY( 1 ); 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) if (m_bDamageTracking)
m_aFrame->setDamageTracker( m_aFrame->setDamageTracker(
basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) ); basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
......
...@@ -151,13 +151,13 @@ BitmapDeviceSharedPtr SvpGlyphPeer::GetGlyphBmp( ServerFont& rServerFont, ...@@ -151,13 +151,13 @@ BitmapDeviceSharedPtr SvpGlyphPeer::GetGlyphBmp( ServerFont& rServerFont,
} }
// construct alpha mask from raw bitmap // construct alpha mask from raw bitmap
const B2IVector aSize( if (pGcpHelper->maRawBitmap.mnScanlineSize && pGcpHelper->maRawBitmap.mnHeight)
pGcpHelper->maRawBitmap.mnScanlineSize,
pGcpHelper->maRawBitmap.mnHeight );
if( aSize.getX() && aSize.getY() )
{ {
const B2IVector aSize(
pGcpHelper->maRawBitmap.mnScanlineSize,
pGcpHelper->maRawBitmap.mnHeight );
static PaletteMemorySharedVector aDummyPAL; 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; rGlyphData.ExtDataRef().meInfo = nBmpFormat;
......
...@@ -69,19 +69,21 @@ bool SvpSalVirtualDevice::SetSizeUsingBuffer( long nNewDX, long nNewDY, ...@@ -69,19 +69,21 @@ bool SvpSalVirtualDevice::SetSizeUsingBuffer( long nNewDX, long nNewDY,
SvpSalInstance* pInst = SvpSalInstance::s_pDefaultInstance; SvpSalInstance* pInst = SvpSalInstance::s_pDefaultInstance;
assert( pInst ); assert( pInst );
basebmp::Format nFormat = pInst->getFormatForBitCount( m_nBitCount ); basebmp::Format nFormat = pInst->getFormatForBitCount( m_nBitCount );
sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(nFormat, aDevSize.getX());
if ( m_nBitCount == 1 ) if ( m_nBitCount == 1 )
{ {
std::vector< basebmp::Color > aDevPal(2); std::vector< basebmp::Color > aDevPal(2);
aDevPal.push_back( basebmp::Color( 0, 0, 0 ) ); aDevPal.push_back( basebmp::Color( 0, 0, 0 ) );
aDevPal.push_back( basebmp::Color( 0xff, 0xff, 0xff ) ); 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 else
{ {
m_aDevice = pBuffer ? m_aDevice = pBuffer ?
createBitmapDevice( aDevSize, bTopDown, nFormat, pBuffer, PaletteMemorySharedVector() ) createBitmapDevice( aDevSize, bTopDown, nFormat, nStride, pBuffer, PaletteMemorySharedVector() )
: createBitmapDevice( aDevSize, bTopDown, nFormat ); : createBitmapDevice( aDevSize, bTopDown, nFormat, nStride );
} }
// update device in existing graphics // update device in existing graphics
......
...@@ -1965,8 +1965,9 @@ void GtkSalFrame::AllocateFrame() ...@@ -1965,8 +1965,9 @@ void GtkSalFrame::AllocateFrame()
aFrameSize.setX( 1 ); aFrameSize.setX( 1 );
if( aFrameSize.getY() == 0 ) if( aFrameSize.getY() == 0 )
aFrameSize.setY( 1 ); aFrameSize.setY( 1 );
m_aFrame = basebmp::createBitmapDevice( aFrameSize, true, sal_Int32 nStride(basebmp::getBitmapDeviceStrideForWidth(basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK, aFrameSize.getX()));
basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK ); m_aFrame = basebmp::createBitmapDevice(aFrameSize, true,
basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK, nStride);
m_aFrame->setDamageTracker( m_aFrame->setDamageTracker(
basebmp::IBitmapDeviceDamageTrackerSharedPtr(new DamageTracker(*this)) ); basebmp::IBitmapDeviceDamageTrackerSharedPtr(new DamageTracker(*this)) );
fprintf( stderr, "allocated m_aFrame size of %dx%d \n", fprintf( stderr, "allocated m_aFrame size of %dx%d \n",
......
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