textrendering/textformatting/tbox/FRMFRAME.CPP
changeset 32 8b9155204a54
parent 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/textformatting/tbox/FRMFRAME.CPP	Fri Jun 04 10:37:54 2010 +0100
@@ -0,0 +1,289 @@
+/*
+* Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#include "FRMFRAME.H"
+
+const TInt KBorderThicknessInPixels=2;
+
+/** This constructs a TFrameOverlay, clearing all flags and initializing both 
+blob widths to zero. */
+EXPORT_C TFrameOverlay::TFrameOverlay()
+	:iFlags(0),iVisibleBlobWidth(0),iActiveBlobWidth(0)
+	{
+    }
+
+/** Sets the visible and active blob widths to the same value in pixels.
+@param aWidth The visible and active blob width in pixels. */
+EXPORT_C void TFrameOverlay::SetBlobWidthInPixels(const TInt aWidth)
+    {
+	SetVisibleBlobWidthInPixels(aWidth);
+	SetActiveBlobWidthInPixels(aWidth);
+    }
+
+/** Sets the visible blob width in pixels.
+@param aWidth The visible blob width in pixels. */
+EXPORT_C void TFrameOverlay::SetVisibleBlobWidthInPixels(const TInt aWidth)
+    {
+	iVisibleBlobWidth=aWidth;
+    }
+
+/** Sets the active blob width in pixels. The active blob width should normally
+be at least as large as the visible blob width.
+@param aWidth The active blob width in pixels. */
+EXPORT_C void TFrameOverlay::SetActiveBlobWidthInPixels(const TInt aWidth)
+	{
+	iActiveBlobWidth=aWidth;
+	}
+
+/** Sets the flags which control how the frame is drawn. Adds the flags
+specified to the existing flag settings, which are preserved. For a description
+of the available flags, see the TFrameOverlayFlags enum.
+@param aFlag Flags to add to the existing settings. */
+EXPORT_C void TFrameOverlay::SetFlags(TInt aFlag)
+    {
+	iFlags|=aFlag;
+    }
+
+/** Clears the flags specified from the frame's flag settings. For a description 
+of the available flags, see the TFrameOverlayFlags enum.
+@param aFlag Flags to clear from the existing flag settings. */
+EXPORT_C void TFrameOverlay::ClearFlags(TInt aFlag)
+    {
+	iFlags&=(~aFlag);
+    }
+
+ 
+
+EXPORT_C void TFrameOverlay::SetRect(const TRect& aRect)
+/** Sets the picture frame rectangle.
+
+@param aRect The picture frame rectangle. */
+    {
+	iRect=aRect;
+    }
+
+/** Draws the picture frame and blobs to a graphics context using the frame's
+flag settings. If drawn, the frame is represented by a dotted line. The
+operation uses a draw mode of CGraphicsContext::EDrawModeNOTSCREEN so that the
+colour of each pixel which is drawn over is inverted. The frame's coordinates
+are set using SetRect().
+@param aGc The graphics context to draw to. */
+EXPORT_C void TFrameOverlay::XorDraw(CGraphicsContext& aGc) const
+    {
+	TRect rect=iRect;
+	TInt blobWidth=VisibleBlobWidth();
+	if (iFlags&EFrameOverlayFlagBlobsInternal)
+		rect.Shrink(blobWidth,blobWidth);
+	TPoint tl=rect.iTl;
+	TPoint br=rect.iBr;
+	aGc.SetDrawMode(CGraphicsContext::EDrawModeNOTSCREEN);
+	aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+
+	if (iFlags&EFrameOverlayFlagShowBorder)
+		{
+		rect.Grow(blobWidth,blobWidth);
+		DrawDottedRectangle(aGc, rect);
+		}
+
+	if (blobWidth > 0)
+		{
+		TInt width=br.iX-tl.iX;
+		TInt height=br.iY-tl.iY;
+
+		aGc.SetPenStyle(CGraphicsContext::ESolidPen);
+		if (!(iFlags&EFrameOverlayFlagTopBlobsDimmed) && !(iFlags&EFrameOverlayFlagLeftBlobsDimmed))
+			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+		aGc.DrawRect(TRect(tl-TPoint(blobWidth,blobWidth),tl));
+		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+
+		if (DrawTopAndBottom())
+			{
+			if (!(iFlags&EFrameOverlayFlagTopBlobsDimmed))
+				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+    		aGc.DrawRect(TRect(tl+TPoint((width-blobWidth)/2,-blobWidth),tl+TPoint((width+blobWidth)/2,0)));
+			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+			}
+
+		if (!(iFlags&EFrameOverlayFlagTopBlobsDimmed) && !(iFlags&EFrameOverlayFlagRightBlobsDimmed))
+			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+
+		aGc.DrawRect(TRect(TPoint(br.iX,tl.iY-blobWidth),TPoint(br.iX+blobWidth,tl.iY)));
+		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+
+		if (DrawLeftAndRight())
+			{
+ 			if (!(iFlags&EFrameOverlayFlagRightBlobsDimmed))
+				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+   			aGc.DrawRect(TRect(br-TPoint(0,(height+blobWidth)/2),br+TPoint(blobWidth,-(height-blobWidth)/2)));
+			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+			}
+
+		if (!(iFlags&EFrameOverlayFlagRightBlobsDimmed) && !(iFlags&EFrameOverlayFlagBottomBlobsDimmed))
+			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+		aGc.DrawRect(TRect(br,br+TPoint(blobWidth,blobWidth)));
+		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+
+		if (DrawTopAndBottom())
+			{
+ 			if (!(iFlags&EFrameOverlayFlagBottomBlobsDimmed))
+				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+    		aGc.DrawRect(TRect(br-TPoint((width+blobWidth)/2,0),br-TPoint((width-blobWidth)/2,-blobWidth)));
+			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+			}
+
+		if (!(iFlags&EFrameOverlayFlagBottomBlobsDimmed) && !(iFlags&EFrameOverlayFlagLeftBlobsDimmed))
+			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+		aGc.DrawRect(TRect(TPoint(tl.iX-blobWidth,br.iY),TPoint(tl.iX,br.iY+blobWidth)));
+		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+
+		if (DrawLeftAndRight())
+			{
+  			if (!(iFlags&EFrameOverlayFlagLeftBlobsDimmed))
+				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+   			aGc.DrawRect(TRect(tl+TPoint(-blobWidth,(height-blobWidth)/2),tl+TPoint(0,(height+blobWidth)/2)));
+			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+			}
+		}
+
+	aGc.SetDrawMode(CGraphicsContext::EDrawModePEN);
+    }
+
+/** Gets the active region in which a pixel position is located.
+
+Note: Adjacent active regions overlap at the corners of the picture frame, so
+that a pixel position may be located within more than one active region.
+
+@param aPos A pixel position.
+@return The active area(s) within which the position specified is located. Zero
+if not located within any active area. For details, see the TEdges enumeration,
+described below. */
+EXPORT_C TInt TFrameOverlay::XyPosToEdges(const TPoint& aPos) const
+    {
+	TInt visibleBlobWidth=VisibleBlobWidth();
+	TInt marginWidth=ActiveMarginWidth();
+	TInt edgesTouched=ENoEdges;
+	TRect frameOuterRect=iRect;
+	TRect frameInnerRect=iRect;
+	frameOuterRect.Grow(marginWidth,marginWidth);
+	frameInnerRect.Shrink(marginWidth,marginWidth);
+	if (iFlags&EFrameOverlayFlagBlobsInternal)
+		frameInnerRect.Shrink(visibleBlobWidth,visibleBlobWidth);
+	else
+		frameOuterRect.Grow(visibleBlobWidth,visibleBlobWidth);
+	TRect rightRect(TPoint(frameInnerRect.iBr.iX,frameOuterRect.iTl.iY),frameOuterRect.iBr);
+	TRect leftRect(frameOuterRect.iTl,TPoint(frameInnerRect.iTl.iX,frameOuterRect.iBr.iY));
+	if (rightRect.Contains(aPos))
+		edgesTouched|=EEdgeRight;
+	else if (leftRect.Contains(aPos))
+		edgesTouched|=EEdgeLeft;
+	TRect topRect(frameOuterRect.iTl,TPoint(frameOuterRect.iBr.iX,frameInnerRect.iTl.iY));
+	TRect bottomRect(TPoint(frameOuterRect.iTl.iX,frameInnerRect.iBr.iY),frameOuterRect.iBr);
+	if (topRect.Contains(aPos))
+		edgesTouched|=EEdgeTop;
+	else if (bottomRect.Contains(aPos))
+		edgesTouched|=EEdgeBottom;
+	return(edgesTouched);
+    }
+
+
+TInt TFrameOverlay::VisibleBlobWidth()	const
+	{
+	if (iFlags&EFrameOverlayFlagBlobsInternal)
+		return Min(Min(iRect.Width(),iRect.Height())/3,(TInt) iVisibleBlobWidth);
+	else
+		return iVisibleBlobWidth;
+	}
+
+TInt TFrameOverlay::ActiveMarginWidth() const
+	{
+	TInt margin=(iActiveBlobWidth-VisibleBlobWidth())/2;
+	if (iFlags&EFrameOverlayFlagBlobsInternal)
+		return Min(Min(iRect.Width(),iRect.Height())/3-VisibleBlobWidth(),margin);
+	else
+		return Min(Min(iRect.Width(),iRect.Height())/3,margin);
+
+	}
+
+TBool TFrameOverlay::DrawLeftAndRight() const
+	{
+	if (iFlags&EFrameOverlayFlagBlobsInternal)
+		return (iRect.Height()>3*iVisibleBlobWidth);
+	else
+		return (iRect.Height()>iVisibleBlobWidth);
+	}
+
+TBool TFrameOverlay::DrawTopAndBottom() const
+	{
+	if (iFlags&EFrameOverlayFlagBlobsInternal)
+		return (iRect.Width()>3*iVisibleBlobWidth);
+	else
+		return (iRect.Width()>iVisibleBlobWidth);
+	}
+
+void TFrameOverlay::DrawDottedRectangle(CGraphicsContext& aGc,const TRect& aRect) const
+	{
+	TInt dashWidth=KBorderThicknessInPixels; 
+	TInt dashLength=KBorderThicknessInPixels;
+	TInt horizontalDashes=(aRect.Width()+dashLength-dashWidth)/(2*dashLength);
+	TInt verticalDashes=(aRect.Height()+dashLength-dashWidth)/(2*dashLength);
+	aGc.SetPenStyle(CGraphicsContext::ENullPen);
+	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	TPoint move(2*dashLength,0);
+	TRect drawRect(aRect.iTl,TSize(dashLength,dashWidth));
+
+	{for (TInt ii=0;ii<horizontalDashes;ii++)
+		{
+ 		aGc.DrawRect(drawRect);
+ 		drawRect.Move(move);
+		}
+	}
+
+	move.SetXY(0,2*dashLength);
+	drawRect.SetRect(TPoint(aRect.iBr.iX-dashWidth,aRect.iTl.iY),TSize(dashWidth,dashLength));
+
+	{for (TInt ii=0;ii<verticalDashes;ii++)
+		{
+ 		aGc.DrawRect(drawRect);
+ 		drawRect.Move(move);
+		}
+	}
+
+	move.SetXY(-2*dashLength,0);
+	drawRect.SetRect(TPoint(aRect.iBr.iX-dashLength,aRect.iBr.iY-dashWidth),TSize(dashLength,dashWidth));
+
+	{for (TInt ii=0;ii<horizontalDashes;ii++)
+		{
+ 		aGc.DrawRect(drawRect);
+ 		drawRect.Move(move);
+		}
+	}
+
+	move.SetXY(0,-2*dashLength);
+	drawRect.SetRect(TPoint(aRect.iTl.iX,aRect.iBr.iY-dashLength),TSize(dashWidth,dashLength));
+
+	{for (TInt ii=0;ii<verticalDashes;ii++)
+		{
+ 		aGc.DrawRect(drawRect);
+ 		drawRect.Move(move);
+		}
+	}
+
+	}
+
+
+