summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basebmp/inc/basebmp/bitmapdevice.hxx22
-rw-r--r--basebmp/inc/basebmp/clippedlinerenderer.hxx2
-rw-r--r--basebmp/source/bitmapdevice.cxx35
-rw-r--r--basebmp/test/basictest.cxx16
-rw-r--r--basebmp/test/polytest.cxx2
-rw-r--r--basegfx/inc/basegfx/tools/rectcliptools.hxx14
-rw-r--r--basegfx/test/basegfx2d.cxx126
7 files changed, 177 insertions, 40 deletions
diff --git a/basebmp/inc/basebmp/bitmapdevice.hxx b/basebmp/inc/basebmp/bitmapdevice.hxx
index 1e6d73b92923..f97ec4fc8778 100644
--- a/basebmp/inc/basebmp/bitmapdevice.hxx
+++ b/basebmp/inc/basebmp/bitmapdevice.hxx
@@ -664,8 +664,8 @@ private:
/** Factory method to create a BitmapDevice for given scanline format
*/
BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
- bool bTopDown,
- sal_Int32 nScanlineFormat );
+ bool bTopDown,
+ sal_Int32 nScanlineFormat );
/** Factory method to create a BitmapDevice for given scanline format
with the given palette
@@ -675,9 +675,9 @@ BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVe
format.
*/
BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
- bool bTopDown,
- sal_Int32 nScanlineFormat,
- const PaletteMemorySharedVector& rPalette );
+ bool bTopDown,
+ sal_Int32 nScanlineFormat,
+ const PaletteMemorySharedVector& rPalette );
/** Factory method to create a BitmapDevice for given scanline format
from the given piece of raw memory and palette
@@ -686,10 +686,10 @@ BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVe
image of the specified area and format.
*/
BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr createBitmapDevice( const basegfx::B2IVector& rSize,
- bool bTopDown,
- sal_Int32 nScanlineFormat,
- const RawMemorySharedArray& rMem,
- const PaletteMemorySharedVector& rPalette );
+ bool bTopDown,
+ sal_Int32 nScanlineFormat,
+ const RawMemorySharedArray& rMem,
+ const PaletteMemorySharedVector& rPalette );
/** Factory method to retrieve a subsetted BitmapDevice to the same
@@ -709,8 +709,8 @@ BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr subsetBitmapDevice( const BitmapDeviceSh
copied, only the size can be varied. Note that the prototype's
bitmap content is <em>not</em> copied, only a palette (if any).
*/
-BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr cloneBitmapDevice( const basegfx::B2IVector& rSize,
- const BitmapDeviceSharedPtr& rProto );
+BASEBMP_DLLPUBLIC BitmapDeviceSharedPtr cloneBitmapDevice( const basegfx::B2IVector& rSize,
+ const BitmapDeviceSharedPtr& rProto );
}
diff --git a/basebmp/inc/basebmp/clippedlinerenderer.hxx b/basebmp/inc/basebmp/clippedlinerenderer.hxx
index 2fbf2f7acfe0..9969b968ff8a 100644
--- a/basebmp/inc/basebmp/clippedlinerenderer.hxx
+++ b/basebmp/inc/basebmp/clippedlinerenderer.hxx
@@ -200,7 +200,7 @@ inline bool prepareClip( sal_Int32 a1,
template< class Iterator, class Accessor >
void renderClippedLine( basegfx::B2IPoint aPt1,
basegfx::B2IPoint aPt2,
- const basegfx::B2IBox& rClipRect,
+ const basegfx::B2IBox& rClipRect,
typename Accessor::value_type color,
Iterator begin,
Accessor acc,
diff --git a/basebmp/source/bitmapdevice.cxx b/basebmp/source/bitmapdevice.cxx
index 5ac1550df157..c307a4ac55e2 100644
--- a/basebmp/source/bitmapdevice.cxx
+++ b/basebmp/source/bitmapdevice.cxx
@@ -1047,23 +1047,11 @@ struct ImplBitmapDevice
maBounds.getWidth()/getHeight() yield the true size of the
device (i.e. the rectangle given by maBounds covers the device
- area under the excluding-bottommost-and-rightmost-pixels fill
- rule)
+ area under the including-the-bottommost-and-rightmost-pixels
+ fill rule)
*/
basegfx::B2IBox maBounds;
- /** Bounds of the device.
-
- maBounds.getWidth()/getHeight() yield the true size of the
- device minus 1 (i.e. the rectangle given by maBounds covers
- the device area under the
- including-the-bottommost-and-rightmost-pixels fill rule).
-
- The member is used to clip line stroking against the device
- bounds.
- */
- basegfx::B2IBox maLineClipRect;
-
/// Scanline format, as provided at the constructor
sal_Int32 mnScanlineFormat;
@@ -1102,7 +1090,6 @@ BitmapDevice::BitmapDevice( const basegfx::B2IBox& rBounds,
mpImpl->mpMem = rMem;
mpImpl->mpPalette = rPalette;
mpImpl->maBounds = rBounds;
- mpImpl->maLineClipRect = rBounds;
mpImpl->mnScanlineFormat = nScanlineFormat;
mpImpl->mnScanlineStride = nScanlineStride;
mpImpl->mpFirstScanline = pFirstScanline;
@@ -1170,7 +1157,7 @@ void BitmapDevice::setPixel( const basegfx::B2IPoint& rPt,
Color lineColor,
DrawMode drawMode )
{
- if( mpImpl->maLineClipRect.isInside(rPt) )
+ if( mpImpl->maBounds.isInside(rPt) )
setPixel_i(rPt,lineColor,drawMode);
}
@@ -1185,7 +1172,7 @@ void BitmapDevice::setPixel( const basegfx::B2IPoint& rPt,
return;
}
- if( mpImpl->maLineClipRect.isInside(rPt) )
+ if( mpImpl->maBounds.isInside(rPt) )
{
if( isCompatibleClipMask( rClip ) )
setPixel_i(rPt,lineColor,drawMode,rClip);
@@ -1196,7 +1183,7 @@ void BitmapDevice::setPixel( const basegfx::B2IPoint& rPt,
Color BitmapDevice::getPixel( const basegfx::B2IPoint& rPt )
{
- if( mpImpl->maLineClipRect.isInside(rPt) )
+ if( mpImpl->maBounds.isInside(rPt) )
return getPixel_i(rPt);
return Color();
@@ -1204,7 +1191,7 @@ Color BitmapDevice::getPixel( const basegfx::B2IPoint& rPt )
sal_uInt32 BitmapDevice::getPixelData( const basegfx::B2IPoint& rPt )
{
- if( mpImpl->maLineClipRect.isInside(rPt) )
+ if( mpImpl->maBounds.isInside(rPt) )
return getPixelData_i(rPt);
return 0;
@@ -1217,7 +1204,7 @@ void BitmapDevice::drawLine( const basegfx::B2IPoint& rPt1,
{
drawLine_i( rPt1,
rPt2,
- mpImpl->maLineClipRect,
+ mpImpl->maBounds,
lineColor,
drawMode );
}
@@ -1237,7 +1224,7 @@ void BitmapDevice::drawLine( const basegfx::B2IPoint& rPt1,
if( isCompatibleClipMask( rClip ) )
drawLine_i( rPt1,
rPt2,
- mpImpl->maLineClipRect,
+ mpImpl->maBounds,
lineColor,
drawMode,
rClip );
@@ -1253,7 +1240,7 @@ void BitmapDevice::drawPolygon( const basegfx::B2DPolygon& rPoly,
const sal_uInt32 numVertices( rPoly.count() );
if( numVertices )
drawPolygon_i( rPoly,
- mpImpl->maLineClipRect,
+ mpImpl->maBounds,
lineColor, drawMode );
}
@@ -1273,7 +1260,7 @@ void BitmapDevice::drawPolygon( const basegfx::B2DPolygon& rPoly,
{
if( isCompatibleClipMask( rClip ) )
drawPolygon_i( rPoly,
- mpImpl->maLineClipRect,
+ mpImpl->maBounds,
lineColor, drawMode, rClip );
else
getGenericRenderer()->drawPolygon( rPoly, lineColor,
@@ -1858,6 +1845,8 @@ BitmapDeviceSharedPtr createBitmapDeviceImpl( const basegfx::B2IVector&
const basegfx::B2IBox* pSubset,
const IBitmapDeviceDamageTrackerSharedPtr& rDamage )
{
+ OSL_ASSERT(rSize.getX() > 0 && rSize.getY() > 0);
+
if( nScanlineFormat <= Format::NONE ||
nScanlineFormat > Format::MAX )
return BitmapDeviceSharedPtr();
diff --git a/basebmp/test/basictest.cxx b/basebmp/test/basictest.cxx
index 246a25a5e7a1..63292729d419 100644
--- a/basebmp/test/basictest.cxx
+++ b/basebmp/test/basictest.cxx
@@ -116,6 +116,21 @@ public:
(*pDevice->getPalette())[1] == Color(0xFFFFFFFF) );
}
+ void testClone()
+ {
+ const basegfx::B2ISize aSize(101,101);
+ basegfx::B2ISize aSize2(3,3);
+ BitmapDeviceSharedPtr pDevice( createBitmapDevice( aSize,
+ true,
+ Format::ONE_BIT_MSB_PAL ));
+
+ BitmapDeviceSharedPtr pClone( cloneBitmapDevice(
+ aSize2,
+ pDevice ));
+ CPPUNIT_ASSERT_MESSAGE("right size",
+ pClone->getSize() == aSize2 );
+ }
+
void testPixelFuncs()
{
// 1bpp
@@ -288,6 +303,7 @@ public:
CPPUNIT_TEST_SUITE(BasicTest);
CPPUNIT_TEST(colorTest);
CPPUNIT_TEST(testConstruction);
+ CPPUNIT_TEST(testClone);
CPPUNIT_TEST(testPixelFuncs);
CPPUNIT_TEST_SUITE_END();
};
diff --git a/basebmp/test/polytest.cxx b/basebmp/test/polytest.cxx
index 177557cec565..8cc51d4921ee 100644
--- a/basebmp/test/polytest.cxx
+++ b/basebmp/test/polytest.cxx
@@ -192,6 +192,8 @@ private:
BitmapDeviceSharedPtr pClippedDevice(
subsetBitmapDevice( rDevice,
basegfx::B2IBox(3,3,5,8) ));
+ CPPUNIT_ASSERT_MESSAGE("size of subsetted device is not (2,5)",
+ pClippedDevice->getSize() == basegfx::B2IVector(2,5));
rDevice->clear(aBgCol);
pClippedDevice->fillPolyPolygon(
diff --git a/basegfx/inc/basegfx/tools/rectcliptools.hxx b/basegfx/inc/basegfx/tools/rectcliptools.hxx
index 7e2ff80876ca..c9b36eb3e46d 100644
--- a/basegfx/inc/basegfx/tools/rectcliptools.hxx
+++ b/basegfx/inc/basegfx/tools/rectcliptools.hxx
@@ -30,6 +30,7 @@
#define _BGFX_TOOLS_RECTCLIPTOOLS_HXX
#include <sal/types.h>
+#include <basegfx/range/b2ibox.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -65,6 +66,19 @@ namespace basegfx
return clip;
}
+ /// Cohen-Sutherland mask calculation - overload for boxes.
+ template< class Point > inline
+ sal_uInt32 getCohenSutherlandClipFlags( const Point& rP,
+ const B2IBox& rB )
+ {
+ // maxY | minY | maxX | minX
+ sal_uInt32 clip = (rP.getX() < rB.getMinX()) << 0;
+ clip |= (rP.getX() >= rB.getMaxX()) << 1;
+ clip |= (rP.getY() < rB.getMinY()) << 2;
+ clip |= (rP.getY() >= rB.getMaxY()) << 3;
+ return clip;
+ }
+
/** Determine number of clip planes hit by given clip mask
This method returns the number of one bits in the four
diff --git a/basegfx/test/basegfx2d.cxx b/basegfx/test/basegfx2d.cxx
index 18a046ac93c0..9aceb8323f94 100644
--- a/basegfx/test/basegfx2d.cxx
+++ b/basegfx/test/basegfx2d.cxx
@@ -56,6 +56,7 @@
#include <basegfx/color/bcolortools.hxx>
#include <basegfx/tools/debugplotter.hxx>
+#include <basegfx/tools/rectcliptools.hxx>
#include <iostream>
#include <fstream>
@@ -1263,15 +1264,24 @@ public:
// check overlap
Type aRange2(0,1);
- CPPUNIT_ASSERT_MESSAGE("box overlapping *includes* upper bound", aRange.overlaps(aRange2));
- CPPUNIT_ASSERT_MESSAGE("box overlapping *includes* upper bound, but only barely", !aRange.overlapsMore(aRange2));
+ CPPUNIT_ASSERT_MESSAGE("range overlapping *includes* upper bound", aRange.overlaps(aRange2));
+ CPPUNIT_ASSERT_MESSAGE("range overlapping *includes* upper bound, but only barely", !aRange.overlapsMore(aRange2));
Type aRange3(0,2);
- CPPUNIT_ASSERT_MESSAGE("box overlapping is fully overlapping now", aRange.overlapsMore(aRange3));
+ CPPUNIT_ASSERT_MESSAGE("range overlapping is fully overlapping now", aRange.overlapsMore(aRange3));
+
+ // check intersect
+ Type aRange4(3,4);
+ aRange.intersect(aRange4);
+ CPPUNIT_ASSERT_MESSAGE("range intersection is yielding empty range!", !aRange.isEmpty());
+
+ Type aRange5(5,6);
+ aRange.intersect(aRange5);
+ CPPUNIT_ASSERT_MESSAGE("range intersection is yielding nonempty range!", aRange.isEmpty());
// just so that this compiles -
- Type aRange4( aRange );
- (void)aRange4;
+ Type aRange6( aRange );
+ (void)aRange6;
}
void check()
@@ -1333,6 +1343,19 @@ public:
B1IBox aBox3(0,2);
CPPUNIT_ASSERT_MESSAGE("box overlapping then includes upper bound-1", aBox.overlaps(aBox3));
+
+ // check intersect
+ B1IBox aBox4(4,5);
+ aBox.intersect(aBox4);
+ CPPUNIT_ASSERT_MESSAGE("box intersection is yielding nonempty box!", aBox.isEmpty());
+
+ B1IBox aBox5(2,5);
+ aBox5.intersect(aBox4);
+ CPPUNIT_ASSERT_MESSAGE("box intersection is yielding empty box!", !aBox5.isEmpty());
+
+ // just so that this compiles -
+ B1IBox aBox6( aBox );
+ (void)aBox6;
}
// Change the following lines only, if you add, remove or rename
@@ -1345,6 +1368,97 @@ public:
}; // class b1ibox
+class b2Xrange : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ template<class Type> void implCheck()
+ {
+ // cohen sutherland clipping
+ Type aRange(0,0,10,10);
+
+ CPPUNIT_ASSERT_MESSAGE("(0,0) is outside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(0,0),aRange) == 0);
+ CPPUNIT_ASSERT_MESSAGE("(-1,-1) is inside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(-1,-1),aRange) ==
+ (tools::RectClipFlags::LEFT|tools::RectClipFlags::TOP));
+ CPPUNIT_ASSERT_MESSAGE("(10,10) is outside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(10,10),aRange) == 0);
+ CPPUNIT_ASSERT_MESSAGE("(11,11) is inside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(11,11),aRange) ==
+ (tools::RectClipFlags::RIGHT|tools::RectClipFlags::BOTTOM));
+
+ // just so that this compiles -
+ Type aRange1( aRange );
+ (void)aRange1;
+ }
+
+ void check()
+ {
+ implCheck<B2DRange>();
+ implCheck<B2IRange>();
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ SAL_CPPUNIT_TEST_SUITE(b2Xrange);
+ CPPUNIT_TEST(check);
+ SAL_CPPUNIT_TEST_SUITE_END();
+}; // class b2Xrange
+
+
+class b2ibox : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void TestBox()
+ {
+ // cohen sutherland clipping
+ B2IBox aBox(0,0,10,10);
+
+ CPPUNIT_ASSERT_MESSAGE("(0,0) is outside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(0,0),aBox) == 0);
+ CPPUNIT_ASSERT_MESSAGE("(-1,-1) is inside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(-1,-1),aBox) ==
+ (tools::RectClipFlags::LEFT|tools::RectClipFlags::TOP));
+ CPPUNIT_ASSERT_MESSAGE("(9,9) is outside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(9,9),aBox) == 0);
+ CPPUNIT_ASSERT_MESSAGE("(10,10) is inside range!",
+ tools::getCohenSutherlandClipFlags(B2IPoint(10,10),aBox) ==
+ (tools::RectClipFlags::RIGHT|tools::RectClipFlags::BOTTOM));
+
+ // just so that this compiles -
+ B2IBox aBox1( aBox );
+ (void)aBox1;
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+ SAL_CPPUNIT_TEST_SUITE(b2ibox);
+ CPPUNIT_TEST(TestBox);
+ SAL_CPPUNIT_TEST_SUITE_END();
+}; // class b2ibox
+
+
class b2dtuple : public CppUnit::TestFixture
{
public:
@@ -1588,6 +1702,8 @@ CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dpolypolygon);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dquadraticbezier);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b1Xrange);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b1ibox);
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2Xrange);
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2ibox);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dtuple);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::b2dvector);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx2d::bcolor);