// ----------------------------------------------------------------------------- // BlitAndClear // // Blits given image to gc and draws the area that is not // covered by the bitmap. // // ----------------------------------------------------------------------------- // inline static TBool BlitAndClear( MAknsSkinInstance* aSkin, CBitmapContext& aGc, const TRect& aTrgRect, CAknsImageItemData* aImgData, const TAknsItemID& aIID, const TAknsBackground* aLayout, const TPoint& aPADelta, const TInt aDrawParam ) { CAknsAppSkinInstance* appInstance = static_cast<CAknsAppSkinInstance*>(aSkin); if ( IsBackgroundItem( aIID,appInstance ) && appInstance && appInstance->AnimBackgroundState() ) { return Blit( aSkin, aGc, aTrgRect, aImgData, aIID, aLayout, aPADelta, aDrawParam ); } if( !(aDrawParam & KAknsDrawParamPrepareOnly) ) { TAknsItemType type = aImgData->Type(); // don't clear if the item is not a masked one if( AknsUtils::IsDerivedType( EAknsITMaskedBitmap, type ) && !(aDrawParam & KAknsDrawParamNoClearUnderImage) ) { TRect layoutRect( aTrgRect ); if( aLayout ) { layoutRect = aLayout->iRect; } layoutRect.Move( -aPADelta ); TRect drawRect(aTrgRect); drawRect.Intersection( layoutRect ); aGc.DrawRect( drawRect ); } } return Blit( aSkin, aGc, aTrgRect, aImgData, aIID, aLayout, aPADelta, aDrawParam ); }
EXPORT_C TBool CAknAnimationData::DrawNextAnimationStep(CBitmapContext& aGc) { if (Count() == 0) { // Call the user animation step TAnimStep step; TAnimMultiStep nullStep(step); nullStep.iDrawStep.SetType(EAnimNullStep); nullStep.iSubStep = (TUint16)iCurrentDrawStep; TBool done = DrawUserAnimationStep(aGc, nullStep); iCurrentDrawStep++; return done; } if (iCurrentDrawStep < Count()) { TInt drawSteps = (*iDrawStepsPerAnimStep)[iCurrentAnimStep]; TInt startingDrawStep = iCurrentDrawStep; TBool repeatAnimStep = EFalse; for (TInt ii=0; ii<drawSteps; ii++) { TAnimStep* drawStep = &(At(iCurrentDrawStep)); switch (drawStep->Type()) { case EAnimBlitPreviousView: { TAnimBlitStep* step = drawStep->BlitStep(); aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iOldBitmap); } break; case EAnimBlitNewView: { TAnimBlitStep* step = drawStep->BlitStep(); aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iViewBitmap); } break; case EAnimBlitPartPreviousView: { TAnimBlitStep* step = drawStep->BlitStep(); aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iOldBitmap, TRect(TPoint(step->iSrcX, step->iSrcY), TSize(step->iWidth, step->iHeight))); } break; case EAnimBlitPartNewView: { TAnimBlitStep* step = drawStep->BlitStep(); aGc.BitBlt(TPoint(step->iDestX, step->iDestY), iViewBitmap, TRect(TPoint(step->iSrcX, step->iSrcY), TSize(step->iWidth, step->iHeight))); } break; case EAnimDrawLine: case EAnimRevealPartNewViewFromLeft: case EAnimRevealPartNewViewFromRight: case EAnimRevealPartNewViewFromTop: case EAnimRevealPartNewViewFromBottom: case EAnimBlitSlideNewView: case EAnimBlitSlideNewViewClearBehind: { // Make this a pending step. Cancel the animation if the append fails TRAPD(err, iPendingSteps->AppendL(TAnimMultiStep(*drawStep))); if (err != KErrNone) return ETrue; } break; case EAnimSetColor: { TAnimSetColorStep* step = drawStep->SetColorStep(); iDrawColor = TRgb(step->iRed, step->iGreen, step->iBlue); } break; case EAnimDrawRect: { TAnimLineDrawStep* step = drawStep->LineDrawStep(); aGc.SetPenColor(iDrawColor); aGc.SetPenStyle(CGraphicsContext::ESolidPen); aGc.DrawRect(TRect(TPoint(step->iStartX, step->iStartY),TPoint(step->iEndX, step->iEndY))); } break; case EAnimDrawFilledRect: { TAnimLineDrawStep* step = drawStep->LineDrawStep(); aGc.SetBrushColor(iDrawColor); aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); aGc.SetPenStyle(CGraphicsContext::ENullPen); aGc.DrawRect(TRect(TPoint(step->iStartX, step->iStartY),TPoint(step->iEndX, step->iEndY))); } break; case EAnimWait: { TAnimWaitStep* step = drawStep->WaitStep(); repeatAnimStep = ETrue; if (step->iSteps > 0) { step->iSteps--; if (step->iSteps == 0) repeatAnimStep = EFalse; } } break; case EAnimWaitUntilComplete: if (iPendingSteps->Count()) repeatAnimStep = ETrue; break; default: // Type is user-defined, so add to the pending steps TRAPD(err, iPendingSteps->AppendL(TAnimMultiStep(*drawStep))); if (err != KErrNone) return ETrue; break; } iCurrentDrawStep++; } // If this step needs to be repeated, reset the draw step counter // otherwise increment the current animation step if (repeatAnimStep) { iCurrentDrawStep = startingDrawStep; } else { iCurrentAnimStep++; } } TInt done = DrawPendingAnimationSteps(aGc); if (iCurrentDrawStep == Count() && done) return ETrue; return EFalse; }
// ----------------------------------------------------------------------------- // AknsDrawUtils::DrawBackground() // (commented in the header). // ----------------------------------------------------------------------------- EXPORT_C TBool AknsDrawUtils::DrawBackground( MAknsSkinInstance* aInstance, MAknsControlContext* aContext, const CCoeControl* aControl, CBitmapContext& aGc, const TPoint& aDstPos, const TRect& aControlRect, const TInt aDrawParam ) { TInt drawParam = aDrawParam; TInt originalParam = aDrawParam; TBool retVal = EFalse; TBool blitFailed = EFalse; TBool blit = EFalse; TBool blitAttempted = EFalse; if ( !&aGc ) { return retVal; } MAknsControlContext* parentContext = GetParentContext( aContext ); if( parentContext ) { retVal = DrawBackground( aInstance, parentContext, aControl, aGc, aDstPos, aControlRect, aDrawParam ); drawParam |= KAknsDrawParamNoClearUnderImage; } else if( drawParam & KAknsDrawParamBottomLevelRGBOnly ) { drawParam |= KAknsDrawParamRGBOnly; } originalParam = drawParam; if( aContext ) { aContext->UpdateContext(); } TAknsBackground* bgLayout = RetrieveBackgroundLayout( aContext ); TAknsItemID imgIID( KAknsIIDNone ); CAknsImageItemData* imgData = RetrieveBackgroundImage( aInstance, bgLayout, imgIID ); // chained background if (imgData && imgData->ParentIID() != KAknsIIDNone) { TAknsItemID parentiid = imgData->ParentIID(); TRect parentDrawRect = imgData->DrawRect(); imgData = RetrieveKnownBackgroundImage( aInstance, parentiid ); if (imgData) { imgData->SetDrawRect(parentDrawRect); drawParam |= KAknsDrawParamChained ; } } TPoint paDelta = GetParentAbsoluteDelta( bgLayout, aControl ); TRect drawRect = aControlRect; drawRect.Move( aDstPos-aControlRect.iTl ); paDelta += aControlRect.iTl-aDstPos; if (!(aDrawParam & KAknsDrawParamPrepareOnly)) { aGc.SetPenStyle(CGraphicsContext::ENullPen); aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); } if ( !(aDrawParam & KAknsDrawParamIgnoreLayerMask)) { if( imgData ) { blitAttempted = ETrue; if( (drawParam&KAknsDrawParamNoClearUnderImage)==0 ) { blit = BlitAndClear( aInstance, aGc, drawRect, imgData, imgIID, bgLayout, paDelta, drawParam ); } else { blit = Blit( aInstance, aGc, drawRect, imgData, imgIID, bgLayout, paDelta, drawParam ); } if ( !blit ) { blitFailed = ETrue; } } else { if( !(drawParam&KAknsDrawParamNoClearUnderImage) && !(drawParam&KAknsDrawParamPrepareOnly) ) { // Clear only if permitted aGc.DrawRect( drawRect ); } } } if( bgLayout ) { if (!(aDrawParam & KAknsDrawParamIgnoreLayerMask) && aContext->IsCompatibleWithType(EAknsControlContextTypeMasked)) { CAknsMaskedLayerBackgroundControlContext* layeredCxt = static_cast<CAknsMaskedLayerBackgroundControlContext*>(aContext); if (layeredCxt->iOffScreenBmp) { CAknsMaskedBitmapItemData* maskedImgData = NULL; TRAPD( err, maskedImgData = CAknsMaskedBitmapItemData::NewL() ); if ( err != KErrNone ) { return EFalse; } maskedImgData->SetBitmap(layeredCxt->iOffScreenBmp); maskedImgData->SetMask(layeredCxt->iLayerMask); TAknsBackground* childLayout = bgLayout->iNext; blitAttempted = ETrue; blit = Blit( aInstance, aGc, drawRect, maskedImgData, KAknsIIDNone, childLayout, paDelta, drawParam ); if ( !blit ) { blitFailed = ETrue; } maskedImgData->SetBitmap(NULL); maskedImgData->SetMask(NULL); delete maskedImgData; if (!(aDrawParam & KAknsDrawParamPrepareOnly)) { aGc.SetPenStyle(CGraphicsContext::ESolidPen); aGc.SetBrushStyle(CGraphicsContext::ENullBrush); } retVal = !blitFailed; return retVal; } } if (!aContext->IsCompatibleWithType(EAknsControlContextTypeFrame)) { // special handling for frames drawParam|=KAknsDrawParamNoClearUnderImage; originalParam|=KAknsDrawParamNoClearUnderImage; } TAknsBackground* nextLayout = bgLayout->iNext; while( nextLayout && ((drawParam & KAknsDrawParamLimitToFirstLevel) == 0) ) { imgData = RetrieveKnownBackgroundImage( aInstance, nextLayout->iImageID ); if (imgData && imgData->ParentIID() != KAknsIIDNone) { TAknsItemID parentiid = imgData->ParentIID(); TRect parentDrawRect = imgData->DrawRect(); imgData = RetrieveKnownBackgroundImage( aInstance, parentiid ); if (imgData) { imgData->SetDrawRect(parentDrawRect); drawParam |= KAknsDrawParamChained ; } } else { drawParam=originalParam; } if( imgData ) { blitAttempted = ETrue; blit = BlitAndClear( aInstance, aGc, drawRect, imgData, nextLayout->iImageID, nextLayout, paDelta, drawParam ); if ( !blit ) { blitFailed = ETrue; } } nextLayout = nextLayout->iNext; } } if (!(aDrawParam & KAknsDrawParamPrepareOnly)) { aGc.SetPenStyle(CGraphicsContext::ESolidPen); aGc.SetBrushStyle(CGraphicsContext::ENullBrush); } // If Blit failed, or was not even attempted => return EFalse if ( blitFailed ) { retVal = EFalse; } else if ( !retVal ) { retVal = blitAttempted; } return retVal; }