os/textandloc/textrendering/textformatting/tbox/FRMFRAME.CPP
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /*
     2 * Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 *
    16 */
    17 
    18 
    19 #include "FRMFRAME.H"
    20 
    21 const TInt KBorderThicknessInPixels=2;
    22 
    23 /** This constructs a TFrameOverlay, clearing all flags and initializing both 
    24 blob widths to zero. */
    25 EXPORT_C TFrameOverlay::TFrameOverlay()
    26 	:iFlags(0),iVisibleBlobWidth(0),iActiveBlobWidth(0)
    27 	{
    28     }
    29 
    30 /** Sets the visible and active blob widths to the same value in pixels.
    31 @param aWidth The visible and active blob width in pixels. */
    32 EXPORT_C void TFrameOverlay::SetBlobWidthInPixels(const TInt aWidth)
    33     {
    34 	SetVisibleBlobWidthInPixels(aWidth);
    35 	SetActiveBlobWidthInPixels(aWidth);
    36     }
    37 
    38 /** Sets the visible blob width in pixels.
    39 @param aWidth The visible blob width in pixels. */
    40 EXPORT_C void TFrameOverlay::SetVisibleBlobWidthInPixels(const TInt aWidth)
    41     {
    42 	iVisibleBlobWidth=aWidth;
    43     }
    44 
    45 /** Sets the active blob width in pixels. The active blob width should normally
    46 be at least as large as the visible blob width.
    47 @param aWidth The active blob width in pixels. */
    48 EXPORT_C void TFrameOverlay::SetActiveBlobWidthInPixels(const TInt aWidth)
    49 	{
    50 	iActiveBlobWidth=aWidth;
    51 	}
    52 
    53 /** Sets the flags which control how the frame is drawn. Adds the flags
    54 specified to the existing flag settings, which are preserved. For a description
    55 of the available flags, see the TFrameOverlayFlags enum.
    56 @param aFlag Flags to add to the existing settings. */
    57 EXPORT_C void TFrameOverlay::SetFlags(TInt aFlag)
    58     {
    59 	iFlags|=aFlag;
    60     }
    61 
    62 /** Clears the flags specified from the frame's flag settings. For a description 
    63 of the available flags, see the TFrameOverlayFlags enum.
    64 @param aFlag Flags to clear from the existing flag settings. */
    65 EXPORT_C void TFrameOverlay::ClearFlags(TInt aFlag)
    66     {
    67 	iFlags&=(~aFlag);
    68     }
    69 
    70  
    71 
    72 EXPORT_C void TFrameOverlay::SetRect(const TRect& aRect)
    73 /** Sets the picture frame rectangle.
    74 
    75 @param aRect The picture frame rectangle. */
    76     {
    77 	iRect=aRect;
    78     }
    79 
    80 /** Draws the picture frame and blobs to a graphics context using the frame's
    81 flag settings. If drawn, the frame is represented by a dotted line. The
    82 operation uses a draw mode of CGraphicsContext::EDrawModeNOTSCREEN so that the
    83 colour of each pixel which is drawn over is inverted. The frame's coordinates
    84 are set using SetRect().
    85 @param aGc The graphics context to draw to. */
    86 EXPORT_C void TFrameOverlay::XorDraw(CGraphicsContext& aGc) const
    87     {
    88 	TRect rect=iRect;
    89 	TInt blobWidth=VisibleBlobWidth();
    90 	if (iFlags&EFrameOverlayFlagBlobsInternal)
    91 		rect.Shrink(blobWidth,blobWidth);
    92 	TPoint tl=rect.iTl;
    93 	TPoint br=rect.iBr;
    94 	aGc.SetDrawMode(CGraphicsContext::EDrawModeNOTSCREEN);
    95 	aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
    96 
    97 	if (iFlags&EFrameOverlayFlagShowBorder)
    98 		{
    99 		rect.Grow(blobWidth,blobWidth);
   100 		DrawDottedRectangle(aGc, rect);
   101 		}
   102 
   103 	if (blobWidth > 0)
   104 		{
   105 		TInt width=br.iX-tl.iX;
   106 		TInt height=br.iY-tl.iY;
   107 
   108 		aGc.SetPenStyle(CGraphicsContext::ESolidPen);
   109 		if (!(iFlags&EFrameOverlayFlagTopBlobsDimmed) && !(iFlags&EFrameOverlayFlagLeftBlobsDimmed))
   110 			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   111 		aGc.DrawRect(TRect(tl-TPoint(blobWidth,blobWidth),tl));
   112 		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   113 
   114 		if (DrawTopAndBottom())
   115 			{
   116 			if (!(iFlags&EFrameOverlayFlagTopBlobsDimmed))
   117 				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   118     		aGc.DrawRect(TRect(tl+TPoint((width-blobWidth)/2,-blobWidth),tl+TPoint((width+blobWidth)/2,0)));
   119 			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   120 			}
   121 
   122 		if (!(iFlags&EFrameOverlayFlagTopBlobsDimmed) && !(iFlags&EFrameOverlayFlagRightBlobsDimmed))
   123 			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   124 
   125 		aGc.DrawRect(TRect(TPoint(br.iX,tl.iY-blobWidth),TPoint(br.iX+blobWidth,tl.iY)));
   126 		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   127 
   128 		if (DrawLeftAndRight())
   129 			{
   130  			if (!(iFlags&EFrameOverlayFlagRightBlobsDimmed))
   131 				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   132    			aGc.DrawRect(TRect(br-TPoint(0,(height+blobWidth)/2),br+TPoint(blobWidth,-(height-blobWidth)/2)));
   133 			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   134 			}
   135 
   136 		if (!(iFlags&EFrameOverlayFlagRightBlobsDimmed) && !(iFlags&EFrameOverlayFlagBottomBlobsDimmed))
   137 			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   138 		aGc.DrawRect(TRect(br,br+TPoint(blobWidth,blobWidth)));
   139 		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   140 
   141 		if (DrawTopAndBottom())
   142 			{
   143  			if (!(iFlags&EFrameOverlayFlagBottomBlobsDimmed))
   144 				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   145     		aGc.DrawRect(TRect(br-TPoint((width+blobWidth)/2,0),br-TPoint((width-blobWidth)/2,-blobWidth)));
   146 			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   147 			}
   148 
   149 		if (!(iFlags&EFrameOverlayFlagBottomBlobsDimmed) && !(iFlags&EFrameOverlayFlagLeftBlobsDimmed))
   150 			aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   151 		aGc.DrawRect(TRect(TPoint(tl.iX-blobWidth,br.iY),TPoint(tl.iX,br.iY+blobWidth)));
   152 		aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   153 
   154 		if (DrawLeftAndRight())
   155 			{
   156   			if (!(iFlags&EFrameOverlayFlagLeftBlobsDimmed))
   157 				aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   158    			aGc.DrawRect(TRect(tl+TPoint(-blobWidth,(height-blobWidth)/2),tl+TPoint(0,(height+blobWidth)/2)));
   159 			aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
   160 			}
   161 		}
   162 
   163 	aGc.SetDrawMode(CGraphicsContext::EDrawModePEN);
   164     }
   165 
   166 /** Gets the active region in which a pixel position is located.
   167 
   168 Note: Adjacent active regions overlap at the corners of the picture frame, so
   169 that a pixel position may be located within more than one active region.
   170 
   171 @param aPos A pixel position.
   172 @return The active area(s) within which the position specified is located. Zero
   173 if not located within any active area. For details, see the TEdges enumeration,
   174 described below. */
   175 EXPORT_C TInt TFrameOverlay::XyPosToEdges(const TPoint& aPos) const
   176     {
   177 	TInt visibleBlobWidth=VisibleBlobWidth();
   178 	TInt marginWidth=ActiveMarginWidth();
   179 	TInt edgesTouched=ENoEdges;
   180 	TRect frameOuterRect=iRect;
   181 	TRect frameInnerRect=iRect;
   182 	frameOuterRect.Grow(marginWidth,marginWidth);
   183 	frameInnerRect.Shrink(marginWidth,marginWidth);
   184 	if (iFlags&EFrameOverlayFlagBlobsInternal)
   185 		frameInnerRect.Shrink(visibleBlobWidth,visibleBlobWidth);
   186 	else
   187 		frameOuterRect.Grow(visibleBlobWidth,visibleBlobWidth);
   188 	TRect rightRect(TPoint(frameInnerRect.iBr.iX,frameOuterRect.iTl.iY),frameOuterRect.iBr);
   189 	TRect leftRect(frameOuterRect.iTl,TPoint(frameInnerRect.iTl.iX,frameOuterRect.iBr.iY));
   190 	if (rightRect.Contains(aPos))
   191 		edgesTouched|=EEdgeRight;
   192 	else if (leftRect.Contains(aPos))
   193 		edgesTouched|=EEdgeLeft;
   194 	TRect topRect(frameOuterRect.iTl,TPoint(frameOuterRect.iBr.iX,frameInnerRect.iTl.iY));
   195 	TRect bottomRect(TPoint(frameOuterRect.iTl.iX,frameInnerRect.iBr.iY),frameOuterRect.iBr);
   196 	if (topRect.Contains(aPos))
   197 		edgesTouched|=EEdgeTop;
   198 	else if (bottomRect.Contains(aPos))
   199 		edgesTouched|=EEdgeBottom;
   200 	return(edgesTouched);
   201     }
   202 
   203 
   204 TInt TFrameOverlay::VisibleBlobWidth()	const
   205 	{
   206 	if (iFlags&EFrameOverlayFlagBlobsInternal)
   207 		return Min(Min(iRect.Width(),iRect.Height())/3,(TInt) iVisibleBlobWidth);
   208 	else
   209 		return iVisibleBlobWidth;
   210 	}
   211 
   212 TInt TFrameOverlay::ActiveMarginWidth() const
   213 	{
   214 	TInt margin=(iActiveBlobWidth-VisibleBlobWidth())/2;
   215 	if (iFlags&EFrameOverlayFlagBlobsInternal)
   216 		return Min(Min(iRect.Width(),iRect.Height())/3-VisibleBlobWidth(),margin);
   217 	else
   218 		return Min(Min(iRect.Width(),iRect.Height())/3,margin);
   219 
   220 	}
   221 
   222 TBool TFrameOverlay::DrawLeftAndRight() const
   223 	{
   224 	if (iFlags&EFrameOverlayFlagBlobsInternal)
   225 		return (iRect.Height()>3*iVisibleBlobWidth);
   226 	else
   227 		return (iRect.Height()>iVisibleBlobWidth);
   228 	}
   229 
   230 TBool TFrameOverlay::DrawTopAndBottom() const
   231 	{
   232 	if (iFlags&EFrameOverlayFlagBlobsInternal)
   233 		return (iRect.Width()>3*iVisibleBlobWidth);
   234 	else
   235 		return (iRect.Width()>iVisibleBlobWidth);
   236 	}
   237 
   238 void TFrameOverlay::DrawDottedRectangle(CGraphicsContext& aGc,const TRect& aRect) const
   239 	{
   240 	TInt dashWidth=KBorderThicknessInPixels; 
   241 	TInt dashLength=KBorderThicknessInPixels;
   242 	TInt horizontalDashes=(aRect.Width()+dashLength-dashWidth)/(2*dashLength);
   243 	TInt verticalDashes=(aRect.Height()+dashLength-dashWidth)/(2*dashLength);
   244 	aGc.SetPenStyle(CGraphicsContext::ENullPen);
   245 	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
   246 	TPoint move(2*dashLength,0);
   247 	TRect drawRect(aRect.iTl,TSize(dashLength,dashWidth));
   248 
   249 	{for (TInt ii=0;ii<horizontalDashes;ii++)
   250 		{
   251  		aGc.DrawRect(drawRect);
   252  		drawRect.Move(move);
   253 		}
   254 	}
   255 
   256 	move.SetXY(0,2*dashLength);
   257 	drawRect.SetRect(TPoint(aRect.iBr.iX-dashWidth,aRect.iTl.iY),TSize(dashWidth,dashLength));
   258 
   259 	{for (TInt ii=0;ii<verticalDashes;ii++)
   260 		{
   261  		aGc.DrawRect(drawRect);
   262  		drawRect.Move(move);
   263 		}
   264 	}
   265 
   266 	move.SetXY(-2*dashLength,0);
   267 	drawRect.SetRect(TPoint(aRect.iBr.iX-dashLength,aRect.iBr.iY-dashWidth),TSize(dashLength,dashWidth));
   268 
   269 	{for (TInt ii=0;ii<horizontalDashes;ii++)
   270 		{
   271  		aGc.DrawRect(drawRect);
   272  		drawRect.Move(move);
   273 		}
   274 	}
   275 
   276 	move.SetXY(0,-2*dashLength);
   277 	drawRect.SetRect(TPoint(aRect.iTl.iX,aRect.iBr.iY-dashLength),TSize(dashWidth,dashLength));
   278 
   279 	{for (TInt ii=0;ii<verticalDashes;ii++)
   280 		{
   281  		aGc.DrawRect(drawRect);
   282  		drawRect.Move(move);
   283 		}
   284 	}
   285 
   286 	}
   287 
   288 
   289