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 } |