uifw/EikStd/dlgsrc/aknrecordinggc.cpp
branchRCL_3
changeset 56 d48ab3b357f1
parent 55 aecbbf00d063
equal deleted inserted replaced
55:aecbbf00d063 56:d48ab3b357f1
    23 #include <graphics/gdi/gdistructs.h>
    23 #include <graphics/gdi/gdistructs.h>
    24 #endif // SYMBIAN_ENABLE_SPLIT_HEADERS
    24 #endif // SYMBIAN_ENABLE_SPLIT_HEADERS
    25 #include <e32err.h>
    25 #include <e32err.h>
    26 
    26 
    27 #include "aknrecordinggc.h"
    27 #include "aknrecordinggc.h"
       
    28 #include "akntrace.h"
    28 
    29 
    29 #ifdef _DEBUG
    30 #ifdef _DEBUG
    30 _LIT( KOverFlow, "Array overflow" );
    31 _LIT( KOverFlow, "Array overflow" );
    31 _LIT( KBadArgument, "Bad argument");
    32 _LIT( KBadArgument, "Bad argument");
    32 #endif // _DEBUG
    33 #endif // _DEBUG
    62 // CAknRecordingGc::~CAknRecordingGc
    63 // CAknRecordingGc::~CAknRecordingGc
    63 // -----------------------------------------------------------------------------
    64 // -----------------------------------------------------------------------------
    64 //
    65 //
    65 CAknRecordingGc::~CAknRecordingGc()
    66 CAknRecordingGc::~CAknRecordingGc()
    66     {
    67     {
       
    68     _AKNTRACE_FUNC_ENTER;
    67     iLines.ResetAndDestroy();
    69     iLines.ResetAndDestroy();
    68     delete iOffScreenBmp;
    70     delete iOffScreenBmp;
    69     delete iBitGc;
    71     delete iBitGc;
    70     delete iBitmapDevice;
    72     delete iBitmapDevice;
       
    73     _AKNTRACE_FUNC_EXIT;
    71     }
    74     }
    72     
    75     
    73 
    76 
    74 // -----------------------------------------------------------------------------
    77 // -----------------------------------------------------------------------------
    75 // CAknRecordingGc::FlushBuffer
    78 // CAknRecordingGc::FlushBuffer
    76 // -----------------------------------------------------------------------------
    79 // -----------------------------------------------------------------------------
    77 //
    80 //
    78 void CAknRecordingGc::FlushBuffer( const TRect& aRect, TInt aLineToSkip )
    81 void CAknRecordingGc::FlushBuffer( const TRect& aRect, TInt aLineToSkip )
    79     {
    82     {
       
    83     _AKNTRACE_FUNC_ENTER;
       
    84     _AKNTRACE( "The rect of FlushBuffer are ( %d, %d ) ( %d, %d )", 
       
    85     		aRect.iTl.iX, aRect.iTl.iY, 
       
    86     		aRect.iBr.iX, aRect.iBr.iY );
       
    87     _AKNTRACE( "[%s][%s]aLineToSkip: [%d]", "CAknRecordingGc", __FUNCTION__, aLineToSkip );
    80     if ( iLines.Count() == 0 )
    88     if ( iLines.Count() == 0 )
    81         {
    89         {
    82         return;
    90         return;
    83         }
    91         }
    84         
    92         
   165                         break;
   173                         break;
   166 
   174 
   167                     case CBufferItem::EDrawRect:
   175                     case CBufferItem::EDrawRect:
   168                         gc->DrawRect( item->iRect );
   176                         gc->DrawRect( item->iRect );
   169                         break;
   177                         break;
       
   178                         
   170                     case CBufferItem::EClear:
   179                     case CBufferItem::EClear:
   171                         gc->Clear( item->iRect );
   180                         gc->Clear( item->iRect );
       
   181                         break;
       
   182                         
       
   183                     case CBufferItem::EDrawLine:
       
   184                         // EDrawLine is used for separator line only and it
       
   185                         // should be skipped for the last visible item.
       
   186                         if ( i < iLines.Count() - 1 )
       
   187                             {
       
   188                             gc->DrawLine( item->iRect.iTl, item->iRect.iBr );
       
   189                             }
       
   190                         break;
       
   191                         
       
   192                     case CBufferItem::EUseBrushPattern:
       
   193                         gc->UseBrushPattern( item->iBitmap );
       
   194                         break;
       
   195                         
       
   196                     case CBufferItem::EDiscardBrushPattern:
       
   197                         gc->DiscardBrushPattern();
   172                         break;
   198                         break;
   173                     }
   199                     }
   174                 }
   200                 }
   175                 
   201                 
   176             gc->CancelClippingRect();
   202             gc->CancelClippingRect();
   190 
   216 
   191     if ( iUseBitGc )
   217     if ( iUseBitGc )
   192         {
   218         {
   193         iRealGc->BitBlt( TPoint( 0, 0 ), iOffScreenBmp, TRect( 0, 0, 360, 500 ) );
   219         iRealGc->BitBlt( TPoint( 0, 0 ), iOffScreenBmp, TRect( 0, 0, 360, 500 ) );
   194         }
   220         }
       
   221     _AKNTRACE_FUNC_EXIT;
   195     }
   222     }
   196 
   223 
   197 
   224 
   198 // -----------------------------------------------------------------------------
   225 // -----------------------------------------------------------------------------
   199 // CAknRecordingGc::PurgeBuffer
   226 // CAknRecordingGc::PurgeBuffer
   210 // CAknRecordingGc::PrepareForNewLineL
   237 // CAknRecordingGc::PrepareForNewLineL
   211 // -----------------------------------------------------------------------------
   238 // -----------------------------------------------------------------------------
   212 //
   239 //
   213 void CAknRecordingGc::PrepareForNewLineL( const TRect& aRect )
   240 void CAknRecordingGc::PrepareForNewLineL( const TRect& aRect )
   214     {
   241     {
       
   242     _AKNTRACE_FUNC_ENTER;
   215     CLineData* newLine = new ( ELeave ) CLineData;
   243     CLineData* newLine = new ( ELeave ) CLineData;
   216     newLine->iRect = aRect;
   244     newLine->iRect = aRect;
   217     iLines.AppendL( newLine );
   245     iLines.AppendL( newLine );
   218     iCurrentLine = iLines.Count() - 1;
   246     iCurrentLine = iLines.Count() - 1;
       
   247     _AKNTRACE_FUNC_EXIT;
   219     }
   248     }
   220 
   249 
   221 
   250 
   222 // -----------------------------------------------------------------------------
   251 // -----------------------------------------------------------------------------
   223 // CAknRecordingGc::ReplaceLineL
   252 // CAknRecordingGc::ReplaceLineL
   224 // -----------------------------------------------------------------------------
   253 // -----------------------------------------------------------------------------
   225 //
   254 //
   226 void CAknRecordingGc::ReplaceLineL( TInt aLine )
   255 void CAknRecordingGc::ReplaceLineL( TInt aLine )
   227     {
   256     {
       
   257     _AKNTRACE_FUNC_ENTER;
       
   258     _AKNTRACE( "[%s][%s]aLine: [%d].", "CAknRecordingGc", __FUNCTION__, aLine );
   228     if (  aLine < iLines.Count() )
   259     if (  aLine < iLines.Count() )
   229         {
   260         {
   230         TRect rect( iLines[aLine]->iRect );
   261         TRect rect( iLines[aLine]->iRect );
   231         
   262         
   232         delete iLines[aLine];
   263         delete iLines[aLine];
   234         iLines[aLine] = new ( ELeave ) CLineData;
   265         iLines[aLine] = new ( ELeave ) CLineData;
   235         iLines[aLine]->iRect = rect;
   266         iLines[aLine]->iRect = rect;
   236         }
   267         }
   237         
   268         
   238     iCurrentLine = aLine;
   269     iCurrentLine = aLine;
       
   270     _AKNTRACE_FUNC_EXIT;
   239     }
   271     }
   240 
   272 
   241 
   273 
   242 // -----------------------------------------------------------------------------
   274 // -----------------------------------------------------------------------------
   243 // CAknRecordingGc::UseBitGc
   275 // CAknRecordingGc::UseBitGc
   253 // CAknRecordingGc::InsertLineL
   285 // CAknRecordingGc::InsertLineL
   254 // -----------------------------------------------------------------------------
   286 // -----------------------------------------------------------------------------
   255 //
   287 //
   256 void CAknRecordingGc::InsertLineL( TInt aLine, const TRect& aRect )
   288 void CAknRecordingGc::InsertLineL( TInt aLine, const TRect& aRect )
   257     {
   289     {
       
   290     _AKNTRACE_FUNC_ENTER;
       
   291     _AKNTRACE( "[%s][%s]aLine: [%d].", "CAknRecordingGc", __FUNCTION__, aLine );
   258     CLineData* newLine = new ( ELeave ) CLineData;
   292     CLineData* newLine = new ( ELeave ) CLineData;
   259     newLine->iRect = aRect;
   293     newLine->iRect = aRect;
   260     
   294     
   261     iLines.Insert( newLine, aLine );
   295     iLines.Insert( newLine, aLine );
   262     iCurrentLine = aLine;
   296     iCurrentLine = aLine;
       
   297     _AKNTRACE_FUNC_EXIT;
   263     }
   298     }
   264 
   299 
   265 
   300 
   266 // -----------------------------------------------------------------------------
   301 // -----------------------------------------------------------------------------
   267 // CAknRecordingGc::InsertLineL
   302 // CAknRecordingGc::InsertLineL
   312 // CAknRecordingGc::DeleteLine
   347 // CAknRecordingGc::DeleteLine
   313 // -----------------------------------------------------------------------------
   348 // -----------------------------------------------------------------------------
   314 //
   349 //
   315 void CAknRecordingGc::DeleteLine( TInt aLine )
   350 void CAknRecordingGc::DeleteLine( TInt aLine )
   316     {
   351     {
       
   352     _AKNTRACE_FUNC_ENTER;
       
   353     _AKNTRACE( "[%s][%s]aLine: [%d].", "CAknRecordingGc", __FUNCTION__, aLine );
   317     if ( aLine != -1 && aLine < iLines.Count() )
   354     if ( aLine != -1 && aLine < iLines.Count() )
   318         {
   355         {
   319         delete iLines[aLine];
   356         delete iLines[aLine];
   320         iLines.Remove( aLine );
   357         iLines.Remove( aLine );
   321         }
   358         }
       
   359     _AKNTRACE_FUNC_EXIT;
   322     }
   360     }
   323 
   361 
   324 
   362 
   325 // -----------------------------------------------------------------------------
   363 // -----------------------------------------------------------------------------
   326 // CAknRecordingGc::CBufferItem::~CBufferItem()
   364 // CAknRecordingGc::CBufferItem::~CBufferItem()
   579     
   617     
   580 // ---------------------------------------------------------------------------
   618 // ---------------------------------------------------------------------------
   581 // From class CWindowGc
   619 // From class CWindowGc
   582 // ---------------------------------------------------------------------------
   620 // ---------------------------------------------------------------------------
   583 //
   621 //
   584 void CAknRecordingGc::UseBrushPattern( const CFbsBitmap* /*aDevice*/ )
   622 void CAknRecordingGc::UseBrushPattern( const CFbsBitmap* aDevice )
   585     {
   623     {
       
   624     CBufferItem* buffer = BufferItem();
       
   625     buffer->iType = CBufferItem::EUseBrushPattern;
       
   626     
       
   627     CFbsBitmap* bitmap = NULL;
       
   628     TRAP_IGNORE( bitmap = new (ELeave) CFbsBitmap() );
       
   629     bitmap->Duplicate(aDevice->Handle());
       
   630     buffer->iBitmap = bitmap;
   586     }
   631     }
   587     
   632     
   588     
   633     
   589 // ---------------------------------------------------------------------------
   634 // ---------------------------------------------------------------------------
   590 // From class CWindowGc
   635 // From class CWindowGc
   591 // ---------------------------------------------------------------------------
   636 // ---------------------------------------------------------------------------
   592 //
   637 //
   593 void CAknRecordingGc::DiscardBrushPattern()
   638 void CAknRecordingGc::DiscardBrushPattern()
   594     {
   639     {
       
   640     CBufferItem* buffer = BufferItem();
       
   641     buffer->iType = CBufferItem::EDiscardBrushPattern;    
   595     }
   642     }
   596     
   643     
   597     
   644     
   598 // ---------------------------------------------------------------------------
   645 // ---------------------------------------------------------------------------
   599 // From class CWindowGc
   646 // From class CWindowGc
   634     
   681     
   635 // ---------------------------------------------------------------------------
   682 // ---------------------------------------------------------------------------
   636 // From class CWindowGc
   683 // From class CWindowGc
   637 // ---------------------------------------------------------------------------
   684 // ---------------------------------------------------------------------------
   638 //
   685 //
   639 void CAknRecordingGc::DrawLine( const TPoint& /*aPoint1*/, 
   686 void CAknRecordingGc::DrawLine( const TPoint& aPoint1, 
   640     const TPoint& /*aPoint2*/ )
   687     const TPoint& aPoint2 )
   641     {
   688     {
       
   689     _AKNTRACE_FUNC_ENTER;
       
   690     CBufferItem* buffer = BufferItem();
       
   691     buffer->iType = CBufferItem::EDrawLine;
       
   692     buffer->iRect.iTl = aPoint1;
       
   693     buffer->iRect.iBr = aPoint2;
       
   694     _AKNTRACE_FUNC_EXIT;
   642     }
   695     }
   643     
   696     
   644     
   697     
   645 // ---------------------------------------------------------------------------
   698 // ---------------------------------------------------------------------------
   646 // From class CWindowGc
   699 // From class CWindowGc
   893 //
   946 //
   894 void CAknRecordingGc::BitBltMasked( const TPoint& aPoint, 
   947 void CAknRecordingGc::BitBltMasked( const TPoint& aPoint, 
   895     const CFbsBitmap* aBitmap, const TRect& aSourceRect, 
   948     const CFbsBitmap* aBitmap, const TRect& aSourceRect, 
   896     const CFbsBitmap* aMaskBitmap, TBool aInvertMask )
   949     const CFbsBitmap* aMaskBitmap, TBool aInvertMask )
   897     {
   950     {
       
   951     _AKNTRACE_FUNC_ENTER;
   898     if ( !iUseBitGc )
   952     if ( !iUseBitGc )
   899         {
   953         {
   900         CBufferItem* buffer = BufferItem();
   954         CBufferItem* buffer = BufferItem();
   901         buffer->iType = CBufferItem::EBitBltMasked1;
   955         buffer->iType = CBufferItem::EBitBltMasked1;
   902         buffer->iPosition = aPoint;
   956         buffer->iPosition = aPoint;
   917         }
   971         }
   918     else
   972     else
   919         {
   973         {
   920         iBitGc->BitBltMasked( aPoint, aBitmap, aSourceRect, aMaskBitmap, aInvertMask );
   974         iBitGc->BitBltMasked( aPoint, aBitmap, aSourceRect, aMaskBitmap, aInvertMask );
   921         }
   975         }
       
   976     _AKNTRACE_FUNC_EXIT;
   922     }
   977     }
   923     
   978     
   924     
   979     
   925 // ---------------------------------------------------------------------------
   980 // ---------------------------------------------------------------------------
   926 // From class CWindowGc
   981 // From class CWindowGc
  1089 // ---------------------------------------------------------------------------
  1144 // ---------------------------------------------------------------------------
  1090 //
  1145 //
  1091 TInt CAknRecordingGc::APIExtension( TUid aUid, TAny*& /*aOutput*/,
  1146 TInt CAknRecordingGc::APIExtension( TUid aUid, TAny*& /*aOutput*/,
  1092     TAny* aInput )
  1147     TAny* aInput )
  1093     {
  1148     {
       
  1149     _AKNTRACE_FUNC_ENTER;
  1094     if (aUid == KDrawTextInContextUid)
  1150     if (aUid == KDrawTextInContextUid)
  1095         {
  1151         {
  1096         __ASSERT_DEBUG( aInput, User::Panic(KBadArgument, KErrArgument ));
  1152         __ASSERT_DEBUG( aInput, User::Panic(KBadArgument, KErrArgument ));
  1097         TDrawTextInContextInternal* contextParam = 
  1153         TDrawTextInContextInternal* contextParam = 
  1098             static_cast<TDrawTextInContextInternal*>(aInput);
  1154             static_cast<TDrawTextInContextInternal*>(aInput);
  1099         const TTextParameters* params = &contextParam->iParam;
  1155         const TTextParameters* params = &contextParam->iParam;
  1100         __ASSERT_DEBUG( params, User::Panic(KBadArgument, KErrArgument ));
  1156         __ASSERT_DEBUG( params, User::Panic(KBadArgument, KErrArgument ));
  1101         TPtrC textToDraw = contextParam->iText.Mid( params->iStart, 
  1157         TPtrC textToDraw = contextParam->iText.Mid( params->iStart, 
  1102                                                     params->iEnd - params->iStart );
  1158                                                     params->iEnd - params->iStart );
  1103         DrawText(textToDraw, contextParam->iPosition);
  1159         DrawText(textToDraw, contextParam->iPosition);
       
  1160 		_AKNTRACE_FUNC_EXIT;
  1104         return KErrNone;
  1161         return KErrNone;
  1105         }
  1162         }
  1106     else
  1163     else
  1107         {
  1164         {
       
  1165 		_AKNTRACE_FUNC_EXIT;
  1108         return KErrNotSupported;
  1166         return KErrNotSupported;
  1109         }
  1167         }
  1110     }
  1168     }