--- /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);
+ }
+ }
+
+ }
+
+
+