244 lines
7.6 KiB
C++
244 lines
7.6 KiB
C++
/*************************************************************************
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: baseprimitive2d.hxx,v $
|
|
*
|
|
* $Revision: 1.8 $
|
|
*
|
|
* last change: $Author: aw $ $Date: 2008-05-27 14:11:16 $
|
|
*
|
|
* The Contents of this file are made available subject to
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
|
*
|
|
*
|
|
* GNU Lesser General Public License Version 2.1
|
|
* =============================================
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*
|
|
************************************************************************/
|
|
|
|
#include "precompiled_sd.hxx"
|
|
|
|
#include "SlsFramePainter.hxx"
|
|
#include <vcl/outdev.hxx>
|
|
|
|
|
|
namespace sd { namespace slidesorter { namespace view {
|
|
|
|
FramePainter::FramePainter (const BitmapEx& rShadowBitmap)
|
|
: maShadowTopLeft(rShadowBitmap,-1,-1),
|
|
maShadowTop(rShadowBitmap,0,-1),
|
|
maShadowTopRight(rShadowBitmap,+1,-1),
|
|
maShadowLeft(rShadowBitmap,-1,0),
|
|
maShadowRight(rShadowBitmap,+1,0),
|
|
maShadowBottomLeft(rShadowBitmap,-1,+1),
|
|
maShadowBottom(rShadowBitmap,0,+1),
|
|
maShadowBottomRight(rShadowBitmap,+1,+1),
|
|
maShadowCenter(rShadowBitmap,0,0),
|
|
mbIsValid(false)
|
|
{
|
|
if (rShadowBitmap.GetSizePixel().Width() == rShadowBitmap.GetSizePixel().Height()
|
|
&& (rShadowBitmap.GetSizePixel().Width()-1)%2 == 0
|
|
&& ((rShadowBitmap.GetSizePixel().Width()-1)/2)%2 == 1)
|
|
{
|
|
mbIsValid = true;
|
|
}
|
|
else
|
|
{
|
|
OSL_ASSERT(rShadowBitmap.GetSizePixel().Width() == rShadowBitmap.GetSizePixel().Height());
|
|
OSL_ASSERT((rShadowBitmap.GetSizePixel().Width()-1)%2 == 0);
|
|
OSL_ASSERT(((rShadowBitmap.GetSizePixel().Width()-1)/2)%2 == 1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
FramePainter::~FramePainter (void)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
void FramePainter::PaintFrame (
|
|
OutputDevice& rDevice,
|
|
const Rectangle aBox) const
|
|
{
|
|
if ( ! mbIsValid)
|
|
return;
|
|
|
|
// Paint the shadow.
|
|
maShadowTopLeft.PaintCorner(rDevice, aBox.TopLeft());
|
|
maShadowTopRight.PaintCorner(rDevice, aBox.TopRight());
|
|
maShadowBottomLeft.PaintCorner(rDevice, aBox.BottomLeft());
|
|
maShadowBottomRight.PaintCorner(rDevice, aBox.BottomRight());
|
|
maShadowLeft.PaintSide(rDevice,
|
|
aBox.TopLeft(), aBox.BottomLeft(),
|
|
maShadowTopLeft, maShadowBottomLeft);
|
|
maShadowRight.PaintSide(rDevice,
|
|
aBox.TopRight(), aBox.BottomRight(),
|
|
maShadowTopRight, maShadowBottomRight);
|
|
maShadowTop.PaintSide(rDevice,
|
|
aBox.TopLeft(), aBox.TopRight(),
|
|
maShadowTopLeft, maShadowTopRight);
|
|
maShadowBottom.PaintSide(rDevice,
|
|
aBox.BottomLeft(), aBox.BottomRight(),
|
|
maShadowBottomLeft, maShadowBottomRight);
|
|
maShadowCenter.PaintCenter(rDevice,aBox);
|
|
}
|
|
|
|
|
|
|
|
|
|
//===== FramePainter::OffsetBitmap ============================================
|
|
|
|
FramePainter::OffsetBitmap::OffsetBitmap (
|
|
const BitmapEx& rBitmap,
|
|
const sal_Int32 nHorizontalPosition,
|
|
const sal_Int32 nVerticalPosition)
|
|
: maBitmap(),
|
|
maOffset()
|
|
{
|
|
OSL_ASSERT(nHorizontalPosition>=-1 && nHorizontalPosition<=+1);
|
|
OSL_ASSERT(nVerticalPosition>=-1 && nVerticalPosition<=+1);
|
|
|
|
const sal_Int32 nS (1);
|
|
const sal_Int32 nC (::std::max<sal_Int32>(0,(rBitmap.GetSizePixel().Width()-nS)/2));
|
|
const sal_Int32 nO (nC/2);
|
|
|
|
const Point aOrigin(
|
|
nHorizontalPosition<0 ? 0 : (nHorizontalPosition == 0 ? nC : nC+nS),
|
|
nVerticalPosition<0 ? 0 : (nVerticalPosition == 0 ? nC : nC+nS));
|
|
const Size aSize(
|
|
nHorizontalPosition==0 ? nS : nC,
|
|
nVerticalPosition==0 ? nS : nC);
|
|
maBitmap = BitmapEx(rBitmap, aOrigin, aSize);
|
|
if (maBitmap.IsEmpty())
|
|
return;
|
|
maOffset = Point(
|
|
nHorizontalPosition<0 ? -nO : nHorizontalPosition>0 ? -nO : 0,
|
|
nVerticalPosition<0 ? -nO : nVerticalPosition>0 ? -nO : 0);
|
|
|
|
// Enlarge the side bitmaps so that painting the frame requires less
|
|
// paint calls.
|
|
const sal_Int32 nSideBitmapSize (64);
|
|
if (nHorizontalPosition == 0 && nVerticalPosition == 0)
|
|
{
|
|
maBitmap.Scale(Size(nSideBitmapSize,nSideBitmapSize), BMP_SCALE_FAST);
|
|
}
|
|
else if (nHorizontalPosition == 0)
|
|
{
|
|
maBitmap.Scale(Size(nSideBitmapSize,aSize.Height()), BMP_SCALE_FAST);
|
|
}
|
|
else if (nVerticalPosition == 0)
|
|
{
|
|
maBitmap.Scale(Size(maBitmap.GetSizePixel().Width(), nSideBitmapSize), BMP_SCALE_FAST);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void FramePainter::OffsetBitmap::PaintCorner (
|
|
OutputDevice& rDevice,
|
|
const Point& rAnchor) const
|
|
{
|
|
if ( ! maBitmap.IsEmpty())
|
|
rDevice.DrawBitmapEx(rAnchor+maOffset, maBitmap);
|
|
}
|
|
|
|
|
|
|
|
|
|
void FramePainter::OffsetBitmap::PaintSide (
|
|
OutputDevice& rDevice,
|
|
const Point& rAnchor1,
|
|
const Point& rAnchor2,
|
|
const OffsetBitmap& rCornerBitmap1,
|
|
const OffsetBitmap& rCornerBitmap2) const
|
|
{
|
|
if (maBitmap.IsEmpty())
|
|
return;
|
|
|
|
const Size aBitmapSize (maBitmap.GetSizePixel());
|
|
if (rAnchor1.Y() == rAnchor2.Y())
|
|
{
|
|
// Side is horizontal.
|
|
const sal_Int32 nY (rAnchor1.Y() + maOffset.Y());
|
|
const sal_Int32 nLeft (
|
|
rAnchor1.X()
|
|
+ rCornerBitmap1.maBitmap.GetSizePixel().Width()
|
|
+ rCornerBitmap1.maOffset.X());
|
|
const sal_Int32 nRight (
|
|
rAnchor2.X()
|
|
+ rCornerBitmap2.maOffset.X()\
|
|
- 1);
|
|
for (sal_Int32 nX=nLeft; nX<=nRight; nX+=aBitmapSize.Width())
|
|
rDevice.DrawBitmapEx(
|
|
Point(nX,nY),
|
|
Size(std::min(aBitmapSize.Width(), nRight-nX+1),aBitmapSize.Height()),
|
|
maBitmap);
|
|
}
|
|
else if (rAnchor1.X() == rAnchor2.X())
|
|
{
|
|
// Side is vertical.
|
|
const sal_Int32 nX (rAnchor1.X() + maOffset.X());
|
|
const sal_Int32 nTop (
|
|
rAnchor1.Y()
|
|
+ rCornerBitmap1.maBitmap.GetSizePixel().Height()
|
|
+ rCornerBitmap1.maOffset.Y());
|
|
const sal_Int32 nBottom (
|
|
rAnchor2.Y()
|
|
+ rCornerBitmap2.maOffset.Y()
|
|
- 1);
|
|
for (sal_Int32 nY=nTop; nY<=nBottom; nY+=aBitmapSize.Height())
|
|
rDevice.DrawBitmapEx(
|
|
Point(nX,nY),
|
|
Size(aBitmapSize.Width(), std::min(aBitmapSize.Height(), nBottom-nY+1)),
|
|
maBitmap);
|
|
}
|
|
else
|
|
{
|
|
// Diagonal sides indicatee an error.
|
|
OSL_ASSERT(false);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void FramePainter::OffsetBitmap::PaintCenter (
|
|
OutputDevice& rDevice,
|
|
const Rectangle& rBox) const
|
|
{
|
|
const Size aBitmapSize (maBitmap.GetSizePixel());
|
|
for (sal_Int32 nY=rBox.Top(); nY<=rBox.Bottom(); nY+=aBitmapSize.Height())
|
|
for (sal_Int32 nX=rBox.Left(); nX<=rBox.Right(); nX+=aBitmapSize.Width())
|
|
rDevice.DrawBitmapEx(
|
|
Point(nX,nY),
|
|
Size(
|
|
::std::min(aBitmapSize.Width(), rBox.Right()-nX+1),
|
|
std::min(aBitmapSize.Height(), rBox.Bottom()-nY+1)),
|
|
maBitmap);
|
|
}
|
|
|
|
|
|
|
|
} } } // end of namespace sd::slidesorter::view
|