// ----------------------------------------------------------------------------- // Blit // // Blits given image to gc. // // ----------------------------------------------------------------------------- // inline static TBool Blit( 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() ) { if( (aDrawParam&KAknsDrawParamPrepareOnly) ) { return ETrue; } TRgb color = KRgbWhite; color.SetAlpha(0x00); aGc.SetPenColor(color); aGc.SetBrushColor(color); aGc.SetPenStyle(CGraphicsContext::ESolidPen); aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); aGc.SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); TRect layoutRect( aTrgRect ); if( aLayout ) { layoutRect = aLayout->iRect; } layoutRect.Move( -aPADelta ); TRect drawRect = aTrgRect; drawRect.Intersection( layoutRect ); aGc.Clear(drawRect); return ETrue; } TRect layoutRect( aTrgRect ); const TAknsImageAttributeData* attr = NULL; if( aLayout ) { layoutRect = aLayout->iRect; if( aLayout->iAttr.iAttributes != EAknsImageAttributeNone ) { attr = &(aLayout->iAttr); } } layoutRect.Move( -aPADelta ); TRect drawRect(aTrgRect); drawRect.Intersection( layoutRect ); return DrawPartialCachedImage( aSkin, aGc, layoutRect, drawRect, aImgData, aIID, attr, aDrawParam ); }
void CListBoxHighLightControl::Draw(CBitmapContext& gc) const { gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); if (iPainter) gc.SetBrushColor( iPainter->GetHightLightClock() ); gc.Clear(Rect()); }
void CBitmapAnimator::RenderMask(CBitmapContext& aBitmapContext, TInt aFrame) const { aBitmapContext.Reset(); const CAnimationFrame& nextFrame = *iFrameArray[aFrame]; if (aFrame == 0) { aBitmapContext.SetBrushColor(KRgbBlack); aBitmapContext.Clear(iMaxSize); } else { const CAnimationFrame& currentFrame = *iFrameArray[aFrame - 1]; if (currentFrame.FrameInfo().iFlags & TFrameInfo::ERestoreToBackground) { aBitmapContext.SetBrushColor(KRgbBlack); aBitmapContext.Clear(currentFrame.FrameInfo().iFrameCoordsInPixels); } } const TBool useMask = nextFrame.FrameInfo().iFlags&TFrameInfo::ETransparencyPossible || nextFrame.FrameInfo().iFlags&TFrameInfo::EAlphaChannel; if (useMask) { aBitmapContext.SetDrawMode(CGraphicsContext::EDrawModeOR); aBitmapContext.BitBlt(nextFrame.FrameInfo().iFrameCoordsInPixels.iTl, nextFrame.Mask(), nextFrame.FrameInfo().iOverallSizeInPixels); } else { aBitmapContext.SetBrushColor(KRgbWhite); if (nextFrame.FrameInfo().iOverallSizeInPixels != nextFrame.FrameInfo().iFrameSizeInPixels) { // If the frame size smaller than the overall size, the mask shall not take effect later in CBasicAnimation::Draw(). aBitmapContext.Clear(nextFrame.FrameInfo().iOverallSizeInPixels); } else { aBitmapContext.Clear(nextFrame.FrameInfo().iFrameCoordsInPixels); } } }
void tst_NativeImageHandleProvider::bitmap() { #if defined(Q_OS_SYMBIAN) && !defined(QT_NO_OPENVG) QPixmap tmp(10, 20); if (tmp.pixmapData()->classId() == QPixmapData::OpenVGClass) { BitmapProvider prov; // This should fail because of null ptr. QPixmap pm = pixmapFromNativeImageHandleProvider(&prov); QVERIFY(pm.isNull()); pm = QPixmap(); QCOMPARE(prov.refCount, 0); prov.bmp = new CFbsBitmap; QCOMPARE(prov.bmp->Create(TSize(prov.w, prov.h), EColor16MAP), KErrNone); CFbsBitmapDevice *bitmapDevice = CFbsBitmapDevice::NewL(prov.bmp); CBitmapContext *bitmapContext = 0; QCOMPARE(bitmapDevice->CreateBitmapContext(bitmapContext), KErrNone); TRgb symbianColor = TRgb(255, 200, 100); bitmapContext->SetBrushColor(symbianColor); bitmapContext->Clear(); delete bitmapContext; delete bitmapDevice; pm = pixmapFromNativeImageHandleProvider(&prov); QVERIFY(!pm.isNull()); QCOMPARE(pm.width(), prov.w); QCOMPARE(pm.height(), prov.h); QVERIFY(prov.refCount == 1); QImage img = pm.toImage(); QVERIFY(prov.refCount == 1); QRgb pix = img.pixel(QPoint(1, 2)); QCOMPARE(qRed(pix), symbianColor.Red()); QCOMPARE(qGreen(pix), symbianColor.Green()); QCOMPARE(qBlue(pix), symbianColor.Blue()); pm = QPixmap(); // should result in calling release QCOMPARE(prov.refCount, 0); delete prov.bmp; } else { QSKIP("Not openvg", SkipSingle); } #else QSKIP("Not applicable", SkipSingle); #endif }
TBool CAknAnimationData::ExecutePendingAnimationStep(CBitmapContext& aGc, TAnimMultiStep* aStep) { TBool done = EFalse; switch (aStep->iDrawStep.Type()) { case EAnimDrawLine: { TAnimLineDrawStep* step = (aStep->iDrawStep.LineDrawStep()); if (aStep->iSubStep == step->iSteps -1) { done = ETrue; } { TInt diffX = step->iEndX - step->iStartX; TInt diffY = step->iEndY - step->iStartY; TInt startX = step->iStartX + (diffX * aStep->iSubStep / step->iSteps); TInt startY = step->iStartY + (diffY * aStep->iSubStep / step->iSteps); TInt endX = step->iStartX + (diffX * (aStep->iSubStep+1)/ step->iSteps); TInt endY = step->iStartY + (diffY * (aStep->iSubStep+1) / step->iSteps); aGc.SetBrushColor(iDrawColor); aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); aGc.Clear(TRect(TPoint(startX,startY),TPoint(endX+1, endY+1))); } } break; case EAnimRevealPartNewViewFromLeft: { TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); TPoint offset((step->iWidth * aStep->iSubStep) / step->iSteps, 0); TSize size((step->iWidth / step->iSteps)+1, step->iHeight); aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); if (aStep->iSubStep == step->iSteps-1) done = ETrue; } break; case EAnimRevealPartNewViewFromRight: { TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); TInt thisStep = (step->iSteps - aStep->iSubStep) - 1; TPoint offset((step->iWidth * thisStep) / step->iSteps, 0); TSize size((step->iWidth / step->iSteps)+1, step->iHeight); aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); if (aStep->iSubStep == step->iSteps-1) done = ETrue; } break; case EAnimRevealPartNewViewFromTop: { TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); TPoint offset(0,(step->iHeight * aStep->iSubStep) / step->iSteps); TSize size(step->iWidth,(step->iHeight / step->iSteps)+1); aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); if (aStep->iSubStep == step->iSteps-1) done = ETrue; } break; case EAnimRevealPartNewViewFromBottom: { TAnimBlitStep* step = (aStep->iDrawStep.BlitStep()); TInt thisStep = (step->iSteps - aStep->iSubStep) - 1; TPoint offset(0,(step->iHeight * thisStep) / step->iSteps); TSize size(step->iWidth,(step->iHeight / step->iSteps)+1); aGc.BitBlt(TPoint(step->iDestX, step->iDestY) + offset, iViewBitmap, TRect(TPoint(step->iSrcX, step->iSrcY) + offset, size)); if (aStep->iSubStep == step->iSteps-1) done = ETrue; } break; case EAnimBlitSlideNewView: // Slide the bitmap between two screen positions { TAnimSlideStep* step = (aStep->iDrawStep.SlideStep()); TSize bitmapSize(step->iWidth, step->iHeight); TInt slideDifferenceX = step->iSlideToX - step->iSlideFromX; TInt slideDifferenceY = step->iSlideToY - step->iSlideFromY; TInt slidePosX = step->iSlideFromX + ((slideDifferenceX * aStep->iSubStep) / step->iSteps); TInt slidePosY = step->iSlideFromY + ((slideDifferenceY * aStep->iSubStep) / step->iSteps); aGc.BitBlt(TPoint(slidePosX, slidePosY), iViewBitmap, TRect(TPoint(step->iSrcX, step->iSrcY), bitmapSize)); if (aStep->iSubStep == step->iSteps) done = ETrue; } break; case EAnimBlitSlideNewViewClearBehind: // Slide the bitmap between two screen positions, clearing the screen behind it { TAnimSlideStep* step = (aStep->iDrawStep.SlideStep()); TSize bitmapSize(step->iWidth, step->iHeight); TInt slideDifferenceX = step->iSlideToX - step->iSlideFromX; TInt slideDifferenceY = step->iSlideToY - step->iSlideFromY; if (aStep->iSubStep > 0) { // This is not the first step, so clear over the area of the previous step TInt slidePosX = step->iSlideFromX + ((slideDifferenceX * (aStep->iSubStep-1)) / step->iSteps); TInt slidePosY = step->iSlideFromY + ((slideDifferenceY * (aStep->iSubStep-1)) / step->iSteps); aGc.Clear(TRect(TPoint(slidePosX, slidePosY), bitmapSize)); } TInt slidePosX = step->iSlideFromX + ((slideDifferenceX * aStep->iSubStep) / step->iSteps); TInt slidePosY = step->iSlideFromY + ((slideDifferenceY * aStep->iSubStep) / step->iSteps); aGc.BitBlt(TPoint(slidePosX, slidePosY), iViewBitmap, TRect(TPoint(step->iSrcX, step->iSrcY), bitmapSize)); if (aStep->iSubStep == step->iSteps) done = ETrue; } break; default: done = DrawUserAnimationStep(aGc, *aStep); break; } aStep->iSubStep++; return done; }
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; }