void CMMABitmapWindow::SetDestinationBitmapL(CFbsBitmap* aBitmap) { CFbsBitmap* bitmap = new(ELeave)CFbsBitmap(); CleanupStack::PushL(bitmap); User::LeaveIfError(bitmap->Duplicate(aBitmap->Handle())); // create context for bitmap CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aBitmap); CleanupStack::PushL(bitmapDevice); CGraphicsContext* bitmapContext = NULL; User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext)); CleanupStack::Pop(bitmapDevice); // bitmapDevice CleanupStack::Pop(bitmap); // bitmap delete iBitmap; iBitmap = bitmap; delete iBitmapDevice; iBitmapDevice = bitmapDevice; delete iBitmapContext; iBitmapContext = bitmapContext; if (iDrawRect.IsEmpty()) { iDrawRect.SetSize(iBitmap->SizeInPixels()); } }
/** Create a checked board @param aPixelFormat The pixel format for create the target bitmap @param aSize The size of the bitmap @param aChecksPerAxis Number of checks on X and Y. */ CFbsBitmap* CTe_graphicsperformanceSuiteStepBase::CreateCheckedBoardL(TDisplayMode aDisplayMode, TSize aSize, TSize aChecksPerAxis) const { CFbsBitmap* bitmap = new (ELeave) CFbsBitmap; CleanupStack::PushL(bitmap); bitmap->Create(aSize, aDisplayMode); CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bitmap); CleanupStack::PushL(bitmapDevice); CFbsBitGc* bitGc = NULL; User::LeaveIfError(bitmapDevice->CreateContext(bitGc)); CleanupStack::PushL(bitGc); bitGc->Clear(); bitGc->SetBrushStyle(CGraphicsContext::ESolidBrush); bitGc->SetPenStyle(CGraphicsContext::ENullPen); TPoint point(0,0); const TSize checkerSize((TReal)aSize.iWidth/aChecksPerAxis.iWidth,(TReal)aSize.iHeight/aChecksPerAxis.iHeight); TInt brushColour = 0; for(point.iY = 0; point.iY < aSize.iHeight; point.iY += checkerSize.iHeight) { for(point.iX = 0; point.iX < aSize.iWidth; point.iX += checkerSize.iWidth) { bitGc->SetBrushColor(KColor16Table[brushColour++ & 0x0F]); TRect rect(point, checkerSize); bitGc->DrawRect(rect); } } CleanupStack::PopAndDestroy(2, bitmapDevice); CleanupStack::Pop(bitmap); return bitmap; }
/** Copy a bitmap into another bitmap (generally in a different displaymode) tiles destination bitmap with source */ void CTe_graphicsperformanceSuiteStepBase::CopyBitmapL(CFbsBitmap* aDst, CFbsBitmap* aSrc) { TSize srcSize = aSrc->SizeInPixels(); TSize dstSize = aDst->SizeInPixels(); CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(aDst); CleanupStack::PushL(dev); CFbsBitGc* gc = NULL; if ( 0 == dev->CreateContext(gc) ) { CleanupStack::PushL(gc); TPoint point; gc->SetBrushColor(TRANSPARENT_BLACK); gc->SetBrushStyle(CGraphicsContext::ENullBrush); gc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); gc->Clear(); gc->SetDrawMode(CGraphicsContext::EDrawModePEN); for(point.iY=0; point.iY<dstSize.iHeight; point.iY+=srcSize.iHeight) { for(point.iX=0; point.iX<dstSize.iWidth; point.iX+=srcSize.iWidth) { gc->BitBlt(point, aSrc); } } CleanupStack::PopAndDestroy(gc); } CleanupStack::PopAndDestroy(dev); }
/** Draws a stretched bitmap with or without a mask. @param aUseMask set to ETrue to use a alpha mask. Normally used for 16MU display modes that do not store the alpha. @param aSrcMode is the source display mode @param aDstMode is the destination display mode @param aSession is the windows server session @param aWindow is a reference to the window @param aGc is the graphics context of the window @param aNumIterations is the number of iterations to run the test */ void CAlphaBlendTest::DoDrawBitmapL(TBool aUseMask, TDisplayMode aSrcMode, TDisplayMode aDstMode, RWsSession& aSession, RWindow& aWindow, CWindowGc* aGc, TInt aNumIterations) { const TSize bitmapSize = aWindow.Size(); // Construct target bitmap. CFbsBitmap* bitmapTarget = CreateSoftwareBitmapLC(bitmapSize, aDstMode); CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bitmapTarget); CleanupStack::PushL(bitmapDevice); // Construct GC. CFbsBitGc* bitmapGc = NULL; User::LeaveIfError(bitmapDevice->CreateContext(bitmapGc)); CleanupStack::PushL(bitmapGc); // Construct source bitmap. TSize smallerSize(bitmapSize.iWidth/2, bitmapSize.iHeight/2); CFbsBitmap* source = CreateSoftwareBitmapLC(smallerSize, aSrcMode); VerticalGradientAlphaL(source, TRgb(0x00000000), TRgb(0xffffffff)); CFbsBitmap* sourceAlpha = CreateSoftwareBitmapLC(smallerSize, EGray256); // match size to src VerticalGradientAlphaL(sourceAlpha, TRgb(0x01010101), TRgb(0xfefefefe)); bitmapGc->SetBrushStyle(CGraphicsContext::ENullBrush); bitmapGc->SetBrushColor(TRANSPARENT_BLACK); bitmapGc->Clear(); bitmapGc->SetDrawMode(CGraphicsContext::EDrawModePEN); aGc->Activate(aWindow); TPoint point(0,0); bitmapGc->BitBlt(point, bitmapTarget); aGc->Deactivate(); aSession.Flush(); TBuf <20> testName; if (!aUseMask) { testName=_L("DrawBitmap"); iProfiler->InitResults(); for(int i=0; i<aNumIterations; i++) { bitmapGc->DrawBitmap(TRect(point, bitmapSize), source); iProfiler->MarkResultSetL(); } } else { testName=_L("DrawBitmapMasked"); iProfiler->InitResults(); for(int i=0; i<aNumIterations; i++) { bitmapGc->DrawBitmapMasked(TRect(point, bitmapSize), source,TRect(point, smallerSize), sourceAlpha, EFalse); iProfiler->MarkResultSetL(); } } INFO_PRINTF4(_L("%S(Stretched) with src = %S, dst = %S"), &testName, &ColorModeName(aSrcMode), &ColorModeName(aDstMode)); iProfiler->ResultsAnalysis(testName, 0, aSrcMode, aDstMode, aNumIterations); // copy up to screen for sanity check BitBlt(aSession, aWindow, aGc, *bitmapTarget); CleanupStack::PopAndDestroy(5, bitmapTarget); }
CFbsBitmap* AknBitmapMirrorUtils::CreateBitmapL(CFbsBitmap* aSourceBitmap, TInt aMirrorDirection) { User::LeaveIfNull(aSourceBitmap); CFbsBitmap* destinationBitmap = new (ELeave) CFbsBitmap(); CleanupStack::PushL(destinationBitmap); TSize sourceBitmapSize = aSourceBitmap->SizeInPixels(); TRect sourceRect = TRect(TPoint(0,0), sourceBitmapSize); TSize destinationBitmapSize(sourceRect.Width(), sourceRect.Height()); User::LeaveIfError(destinationBitmap->Create(destinationBitmapSize, aSourceBitmap->DisplayMode())); CFbsBitmapDevice* destinationDevice = CFbsBitmapDevice::NewL( destinationBitmap ); CleanupStack::PushL(destinationDevice); CFbsBitGc* destinationGc; User::LeaveIfError( destinationDevice->CreateContext( destinationGc ) ); switch (aMirrorDirection) { case EAknVerticalMirroring: { TRect sourceBitmapBlittingRect( sourceRect.iTl.iX,sourceRect.iTl.iY,sourceRect.iBr.iX,sourceRect.iTl.iY + 1 ); for ( TInt yPos=destinationBitmapSize.iHeight-1; yPos >= 0; yPos-- ) { destinationGc->BitBlt( TPoint(0,yPos), aSourceBitmap, sourceBitmapBlittingRect ); sourceBitmapBlittingRect.iTl.iY++; sourceBitmapBlittingRect.iBr.iY++; } break; } case EAknHorizontalMirroring: { TRect sourceBitmapBlittingRect( sourceRect.iTl.iX,sourceRect.iTl.iY,sourceRect.iTl.iX + 1,sourceRect.iBr.iY ); for ( TInt xPos=destinationBitmapSize.iWidth-1; xPos >= 0; xPos-- ) { destinationGc->BitBlt( TPoint(xPos,0), aSourceBitmap, sourceBitmapBlittingRect ); sourceBitmapBlittingRect.iTl.iX++; sourceBitmapBlittingRect.iBr.iX++; } break; } default: { destinationGc->BitBlt( TPoint(0,0), aSourceBitmap, sourceRect ); break; } } delete destinationGc; CleanupStack::Pop(2); // destinationBitmap, destinationDevice delete destinationDevice; return destinationBitmap; }
// ============================================================================ // CIconConverter::DoProcessMaskL() // process the bitmap mask // // @since 3.1 // ============================================================================ void CIconConverter::DoProcessMaskL() { // we use white to mean transparent at this stage, simply for efficiency // since all the canvases we will copy in to begin as white if ( iOriginalBitmapMask->Handle() == 0 ) { // Create a mask that shows the whole bitmap as an icon // (all black) User::LeaveIfError( iOriginalBitmapMask->Create( iOriginalBitmap->SizeInPixels(), EGray2 ) ); CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( iOriginalBitmapMask ); CleanupStack::PushL( device ); CFbsBitGc* gc; User::LeaveIfError( device->CreateContext( gc ) ); gc->SetBrushStyle( CGraphicsContext::ESolidBrush ); gc->SetDrawMode( CGraphicsContext::EDrawModePEN ); gc->SetBrushColor( KRgbBlack ); // Create a big black image gc->Clear(); delete gc; CleanupStack::PopAndDestroy( device ); } else { // Invert the mask obtained from the PNG CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( iOriginalBitmapMask ); CleanupStack::PushL(device); CFbsBitGc* gc; User::LeaveIfError( device->CreateContext( gc ) ); gc->SetDrawMode( CGraphicsContext::EDrawModeNOTSCREEN ); gc->Clear(); delete gc; CleanupStack::PopAndDestroy( device ); } // Scale the icon to the sizes required iCurrentSizeIndex = 0; DoIconScalingL(); }
/** Alpha blends two bitmaps together @param aDisplayMode1 is the source display mode @param aDisplayMode2 is the destination display mode @param aSession is the windows server session @param aWindow is a reference to the window @param aGc is the graphics context of the window @param aNumIterations is the number of iterations to run the test */ void CAlphaBlendTest::DoAlphaBlendBitmapsBitmapTestL(TDisplayMode aSrcMode, TDisplayMode aDstMode, RWsSession& aSession, RWindow& aWindow, CWindowGc* aGc, TInt aNumIterations) { const TSize bitmapSize = aWindow.Size(); CFbsBitmap* bitmapTarget = CreateSoftwareBitmapLC(bitmapSize, aDstMode); CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bitmapTarget); CleanupStack::PushL(bitmapDevice); CFbsBitGc* bitmapGc=NULL; User::LeaveIfError(bitmapDevice->CreateContext(bitmapGc)); CleanupStack::PushL(bitmapGc); CFbsBitmap* sourceUnder = CreateSoftwareBitmapLC(bitmapSize, aDstMode); CFbsBitmap* sourceOver = CreateSoftwareBitmapLC(bitmapSize, aSrcMode); CFbsBitmap* sourceAlpha = CreateSoftwareBitmapLC(bitmapSize, EGray256); VerticalGradientAlphaL(sourceAlpha, TRgb(0x01010101), TRgb(0xfefefefe)); VerticalGradientAlphaL(sourceUnder, TRgb(0xff000000), TRgb(0x00ffffff)); VerticalGradientAlphaL(sourceOver, TRgb(0x00ffffff), TRgb(0xff000000)); RDebug::Printf("DABBBT 2"); TPoint point(0,0); TRect rect(bitmapSize); bitmapGc->SetBrushStyle(CGraphicsContext::ENullBrush); bitmapGc->SetBrushColor(TRANSPARENT_BLACK); bitmapGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); bitmapGc->Clear(); bitmapGc->SetDrawMode(CGraphicsContext::EDrawModePEN); bitmapGc->AlphaBlendBitmaps(point, sourceUnder, sourceOver, rect, point, sourceAlpha, point); aGc->Activate(aWindow); aGc->BitBlt(point, bitmapTarget); aGc->Deactivate(); aSession.Flush(); iProfiler->InitResults(); // blend sourceUnder with sourceOver using alpha mask for(TInt i=0; i<aNumIterations; i++) { bitmapGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); bitmapGc->Clear(); bitmapGc->SetDrawMode(CGraphicsContext::EDrawModePEN); bitmapGc->AlphaBlendBitmaps(point, sourceUnder, sourceOver, rect, point, sourceAlpha, point); iProfiler->MarkResultSetL(); } iProfiler->ResultsAnalysis(_L("DoAlphaBlendBitmapsBitmapTestL"), 0, aSrcMode, aDstMode, aNumIterations); // copy up to screen for sanity check BitBlt(aSession, aWindow, aGc, *bitmapTarget); CleanupStack::PopAndDestroy(6, bitmapTarget); // sourceAlpha, sourceOver, sourceUnder, bitmapGc, bitmapDevice, bitmapTarget }
void CTap2MenuAppUi::CopyBitmapL(CFbsBitmap *aSource, CFbsBitmap *aTarget) { if(aSource != NULL && aTarget != NULL) { if(aSource->SizeInPixels() != aTarget->SizeInPixels() || aSource->DisplayMode() != aTarget->DisplayMode()) {User::Leave(KErrArgument);} CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(aTarget); CleanupStack::PushL(device); CFbsBitGc* gc = NULL; User::LeaveIfError(device->CreateContext(gc)); CleanupStack::PushL(gc); gc->BitBlt(TPoint(0, 0), aSource); CleanupStack::PopAndDestroy(gc); CleanupStack::PopAndDestroy(device); } }
void AknBitmapMirrorUtils::LoadPartialBitmapL(CFbsBitmap* aBitmap, const TDesC& aFileName,TInt32 aId, TRect aRect, TBool aMirrorHorizontally) { CFbsBitmap* destinationBitmap = aBitmap; User::LeaveIfNull(destinationBitmap); CFbsBitmap* sourceBitmap = new (ELeave) CFbsBitmap(); CleanupStack::PushL(sourceBitmap); User::LeaveIfError(sourceBitmap->Load(aFileName, aId, ETrue)); TSize sourceBitmapSize = sourceBitmap->SizeInPixels(); TRect sourceRect = TRect(aRect); if (sourceRect == KWholeBitmapRect) { sourceRect.iTl.iX = 0; sourceRect.iTl.iY = 0; sourceRect.iBr.iX = sourceBitmapSize.iWidth; sourceRect.iBr.iY = sourceBitmapSize.iHeight; } TSize destinationBitmapSize(sourceRect.Width(), sourceRect.Height()); User::LeaveIfError(destinationBitmap->Create(destinationBitmapSize, sourceBitmap->DisplayMode())); CFbsBitmapDevice* destinationDevice = CFbsBitmapDevice::NewL( destinationBitmap ); CleanupStack::PushL(destinationDevice); CFbsBitGc* destinationGc; User::LeaveIfError( destinationDevice->CreateContext( destinationGc ) ); if (aMirrorHorizontally) { TRect sourceBitmapBlittingRect( sourceRect.iTl.iX,sourceRect.iTl.iY,sourceRect.iTl.iX + 1,sourceRect.iBr.iY ); for ( TInt xPos=destinationBitmapSize.iWidth-1; xPos >= 0; xPos-- ) { destinationGc->BitBlt( TPoint(xPos,0), sourceBitmap, sourceBitmapBlittingRect ); sourceBitmapBlittingRect.iTl.iX++; sourceBitmapBlittingRect.iBr.iX++; } } else { destinationGc->BitBlt( TPoint(0,0), sourceBitmap, sourceRect ); } delete destinationGc; CleanupStack::PopAndDestroy(2); // sourceBitmap, destinationDevice }
/** Copy a source bitmap into a new bitmap with the specified display mode */ CFbsBitmap* CTe_graphicsperformanceSuiteStepBase::CopyIntoNewBitmapL(CFbsBitmap* aSrc, TDisplayMode aDisplayMode) { CFbsBitmap* dstBmp = new(ELeave) CFbsBitmap; CleanupStack::PushL(dstBmp); TInt ret=dstBmp->Create(aSrc->SizeInPixels(), aDisplayMode); User::LeaveIfError(ret); CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(dstBmp); CleanupStack::PushL(bitmapDevice); CFbsBitGc* gc; ret = bitmapDevice->CreateContext(gc); User::LeaveIfError(ret); CleanupStack::PushL(gc); gc->BitBlt(TPoint(0,0), aSrc); CleanupStack::PopAndDestroy(2, bitmapDevice); // gc, bitmapDevice CleanupStack::Pop(dstBmp); return dstBmp; }
void CTestCamSnapshot::DoStartSnapshotL() { CFbsBitmap* snapshot = new(ELeave) CFbsBitmap; CleanupStack::PushL(snapshot); User::LeaveIfError(snapshot->Create(iSnapshotImageRect.Size(), iSnapshotImage->DisplayMode())); CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(snapshot); CleanupStack::PushL(dev); CFbsBitGc* gc = NULL; User::LeaveIfError(dev->CreateContext(gc)); CleanupStack::Pop(dev); CleanupStack::Pop(snapshot); iSnapshot = snapshot; iSnapshotDev = dev; iSnapshotGc = gc; iSnapshotActive = ETrue; }
// ============================================================================ // CIconConverter::DoIconStoreL() // Store icon and mask files // // @since 3.1 // ============================================================================ void CIconConverter::DoIconStoreL() { // Store the icon and its mask in temporary files until we are ready // to create the final icon // Icon is stored at index n, mask at index n+1 TInt iconIndex = iCurrentSizeIndex * 2; TFileName iconFile = *iTempPath; GetTempIconName( iconIndex++, iconFile ); TFileName maskFile = *iTempPath; GetTempIconName( iconIndex, maskFile ); // invert the masks before saving CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( iTempBitmapMask ); CleanupStack::PushL( device ); CFbsBitGc* gc; User::LeaveIfError( device->CreateContext( gc ) ); gc->SetDrawMode( CGraphicsContext::EDrawModeNOTSCREEN ); gc->Clear(); delete gc; CleanupStack::PopAndDestroy( device ); // save the bitmaps User::LeaveIfError( iTempBitmap->Save( iconFile ) ); User::LeaveIfError( iTempBitmapMask->Save( maskFile ) ); if ( ++iCurrentSizeIndex < iIconSizes->Count() ) { // do the next icon size DoIconScalingL(); } else { DoCreateFinalIconL(); } }
//----------------------------------------------------------------------------- // CBrowserViewImagesListBox::CreateIconL( // CFbsBitmap* aBitmap, TBool aShrinkIt ) //----------------------------------------------------------------------------- // CGulIcon* CBrowserViewImagesListBox::CreateIconL( CFbsBitmap* aBitmap, TBool aShrinkIt) { CGulIcon* icon = NULL; // create icon if(aShrinkIt) { CFbsBitmap* bmp = new(ELeave)CFbsBitmap; CleanupStack::PushL(bmp); User::LeaveIfError(bmp->Create(TSize(42,32), EColor16M)); // create bitmap device CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(bmp); CleanupStack::PushL(dev); // create graphics context for bitmap device CGraphicsContext* ctx = NULL; User::LeaveIfError( dev->CreateContext(ctx) ); CleanupStack::PushL(ctx); // calculate aspect ratio TSize targetSize = Fit(aBitmap->SizeInPixels(), bmp->SizeInPixels()); // copy bitmap to temporary bitmap ctx->DrawBitmap(TRect(TPoint(0,0), targetSize), aBitmap, TRect(TPoint(0,0), aBitmap->SizeInPixels())); CleanupStack::PopAndDestroy(2); // ctx, dev icon = CGulIcon::NewL(bmp); // bmp is owned, no mask used CleanupStack::Pop(); // bmp delete aBitmap; } else { icon = CGulIcon::NewL(aBitmap); // bitmap is owned, no mask used } return icon; }
TBool CHuiRasterizedTextMesh::RasterizePictographLineL(const TDesC& aTextLine, CFont* aFont, SRasterizedLine & aLineOut) { if(iUsingPreRasterizedMesh) { return EFalse; } // Retrieve the used text style. THuiTextStyle* textStyle = CHuiStatic::Env().TextStyleManager().TextStyle(iTextStyleId); // Calculate line extents and assign it to texture size. TSize textureSize = textStyle->LineExtentsL(aTextLine); if(textureSize.iWidth == 0 || !iPictographInterface || !iPictographInterface->Interface()->ContainsPictographs(aTextLine)) { // This is an empty string or it does not contain pictographs. We will not rasterize it. // Just add a gap. aLineOut.iTexture = NULL; aLineOut.iGap = textureSize.iHeight; return !IsMaxLineCountReached(); } // store the actual size to be assigned as the textures logical size TSize actualsize(textureSize); if (aLineOut.iTexture == NULL) { // Create a texture for storing the pictographs into. aLineOut.iTexture = CHuiTexture::NewL(); HUI_DEBUG1(_L("CHuiRasterizedTextMesh::RasterizePictographLineL() - Registering self (0x%x) as a texture content observer."), this); // Register one content observer for the first texture that // is able to restore all lines in a single run if (iLines.Count()==1) { aLineOut.iTexture->iContentObservers.AppendL(*this); } aLineOut.iGap = 0; } // set a name for the texture // @todo is this needed, what names to use aLineOut.iTexture->SetImageFileNameL(_L("Pictographs")); TSize maxTextureSize = aLineOut.iTexture->MaxTextureSize(); textureSize.iWidth = Min(textureSize.iWidth, maxTextureSize.iWidth); textureSize.iHeight = Min(textureSize.iHeight, maxTextureSize.iHeight); if((textureSize.iWidth == 0) || (textureSize.iHeight == 0)) { // Cannot draw into this tiny texture, so leave. HUI_DEBUG2(_L("CHuiRasterizedTextMesh::RasterizePictographLineL() - texture size was too small to draw into (%i, %i)."), textureSize.iWidth, textureSize.iHeight); User::Leave(KErrAbort); } User::LeaveIfError( iPictographBitmap->Resize(textureSize) ); CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(iPictographBitmap); CleanupStack::PushL(device); CFbsBitGc* gc = 0; User::LeaveIfError( device->CreateContext(gc) ); CleanupStack::PushL(gc); // Prepare the bitmap for drawing...set drawmode because of EColor16MA mode... gc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); TRgb color = KRgbWhite; color.SetAlpha(0x00); gc->SetBrushColor(color); gc->Clear(); gc->UseFont(aFont); // Draw pictorgraphs iPictographInterface->Interface()->DrawPictographsInText( *gc, *aFont, aTextLine, TPoint(0, aFont->FontMaxAscent())); CleanupStack::PopAndDestroy(gc); CleanupStack::PopAndDestroy(device); aLineOut.iTexture->UploadL(*iPictographBitmap, NULL, EHuiTextureUploadFlagRetainResolution); aLineOut.iTexture->SetSize(actualsize); return !IsMaxLineCountReached(); }
/* ------------------------------------------------------------------------------- internal icon re-sizer function ------------------------------------------------------------------------------- */ CGulIcon* CYBRecognizer1::GetListIconL(const TDesC& aFileName,TInt aImage,TInt aMask, TSize aSize) { CGulIcon* RetIcon(NULL); TBool OkToAdd(EFalse); CFbsBitmap* MyBitmap = new(ELeave)CFbsBitmap(); CleanupStack::PushL(MyBitmap); CFbsBitmap* MyMask = new(ELeave)CFbsBitmap(); CleanupStack::PushL(MyMask); if(KErrNone == MyBitmap->Load(aFileName,aImage)) { if(KErrNone == MyMask->Load(aFileName,aMask)) { OkToAdd = ETrue; } } if(OkToAdd) { TSize ImgSiz = MyBitmap->SizeInPixels(); if(aSize.iWidth != ImgSiz.iWidth || aSize.iHeight!= ImgSiz.iHeight) { CFbsBitmap* TmpBackBitmap = new(ELeave)CFbsBitmap(); CleanupStack::PushL(TmpBackBitmap); if(KErrNone == TmpBackBitmap->Create(aSize,MyBitmap->DisplayMode())) { CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(TmpBackBitmap); CleanupStack::PushL(bitmapDevice); CFbsBitGc* graphicsContext = NULL; User::LeaveIfError(bitmapDevice->CreateContext(graphicsContext)); CleanupStack::PushL(graphicsContext); graphicsContext->DrawBitmap(TRect(0,0,aSize.iWidth,aSize.iHeight),MyBitmap); CleanupStack::PopAndDestroy(2);//graphicsContext,bitmapDevice, } CFbsBitmap* TmpBackMask = new(ELeave)CFbsBitmap(); CleanupStack::PushL(TmpBackMask); if(KErrNone == TmpBackMask->Create(aSize,MyMask->DisplayMode())) { CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(TmpBackMask); CleanupStack::PushL(bitmapDevice); CFbsBitGc* graphicsContext = NULL; User::LeaveIfError(bitmapDevice->CreateContext(graphicsContext)); CleanupStack::PushL(graphicsContext); graphicsContext->DrawBitmap(TRect(0,0,aSize.iWidth,aSize.iHeight),MyMask); CleanupStack::PopAndDestroy(2);//graphicsContext,bitmapDevice, } CleanupStack::Pop(2);//TmpBackBitmap, TmpBackMask RetIcon = CGulIcon::NewL(TmpBackBitmap, TmpBackMask); } } if(!RetIcon && OkToAdd) { CleanupStack::Pop(2);//MyBitmap, MyMask RetIcon = CGulIcon::NewL(MyBitmap, MyMask); } else { CleanupStack::PopAndDestroy(2);//MyBitmap, MyMask } return RetIcon; }
CFbsBitmap* AknBitmapMirrorUtils::PartialBitmapL( CFbsBitmap* aBitmap, TRect aRect, TBool aMirrorHorizontally ) { User::LeaveIfNull(aBitmap); CFbsBitmap* tmpBitmap = NULL; TSize sourceBitmapSize = aBitmap->SizeInPixels(); TRect sourceRect = TRect(aRect); if ( sourceRect == KWholeBitmapRect ) { sourceRect.iTl.iX = 0; sourceRect.iTl.iY = 0; sourceRect.iBr.iX = sourceBitmapSize.iWidth; sourceRect.iBr.iY = sourceBitmapSize.iHeight; if (aMirrorHorizontally) tmpBitmap = CreateBitmapOptimizedL(aBitmap, EAknHorizontalMirroring); else tmpBitmap = CreateBitmapOptimizedL(aBitmap, EAknNoMirroring); } else { // Check rect sanity if ( sourceRect.iBr.iX > sourceBitmapSize.iWidth || sourceRect.iBr.iX <= 0 ) { sourceRect.iBr.iX = sourceBitmapSize.iWidth; } if ( sourceRect.iBr.iY > sourceBitmapSize.iHeight || sourceRect.iBr.iY <= 0 ) { sourceRect.iBr.iY = sourceBitmapSize.iHeight; } if ( sourceRect.iTl.iX >= sourceBitmapSize.iWidth || sourceRect.iTl.iX < 0) { sourceRect.iTl.iX = 0; } if ( sourceRect.iTl.iY >= sourceBitmapSize.iHeight || sourceRect.iTl.iY < 0) { sourceRect.iTl.iY = 0; } TSize destinationBitmapSize = TSize( sourceRect.Width(), sourceRect.Height() ); // get a copy of wanted rect of source bitmap to tmpBitmap tmpBitmap = new (ELeave) CFbsBitmap(); CleanupStack::PushL( tmpBitmap ); User::LeaveIfError( tmpBitmap->Create( destinationBitmapSize, aBitmap->DisplayMode() ) ); CFbsBitmapDevice* destinationDevice = CFbsBitmapDevice::NewL( tmpBitmap ); CleanupStack::PushL( destinationDevice ); CFbsBitGc* destinationGc; User::LeaveIfError( destinationDevice->CreateContext( destinationGc ) ); if ( aMirrorHorizontally ) { TRect sourceBitmapBlittingRect( sourceRect.iTl.iX, sourceRect.iTl.iY, sourceRect.iTl.iX + 1, sourceRect.iBr.iY ); for ( TInt xPos=destinationBitmapSize.iWidth-1; xPos >= 0; xPos-- ) { destinationGc->BitBlt( TPoint(xPos,0), aBitmap, sourceBitmapBlittingRect ); sourceBitmapBlittingRect.iTl.iX++; sourceBitmapBlittingRect.iBr.iX++; } } else { destinationGc->BitBlt( TPoint(0,0), aBitmap, sourceRect ); } delete destinationGc; CleanupStack::PopAndDestroy(); // destinationDevice CleanupStack::Pop(); // tmpBitmap } return tmpBitmap; }
CFbsBitmap* AknBitmapMirrorUtils::CreateBitmapOptimizedL(CFbsBitmap* aSourceBitmap, TInt aMirrorDirection) { // Check if displaymode is optimized, fallback to non-optimized version if not. TBool fallback = ETrue; TDisplayMode displayMode = aSourceBitmap->DisplayMode(); switch( displayMode ) { case EGray256: case EColor256: case EColor4K: case EColor64K: fallback = EFalse; break; default: fallback = ETrue; } // Check if mirroring mode is supported, fallback to non-optimized version if not. if ((aMirrorDirection != EAknVerticalMirroring) && (aMirrorDirection != EAknHorizontalMirroring)) { fallback = ETrue; } if( fallback ) return CreateBitmapL(aSourceBitmap, aMirrorDirection); // Prepare destination bitmap User::LeaveIfNull(aSourceBitmap); CFbsBitmap* destinationBitmap = new (ELeave) CFbsBitmap(); CleanupStack::PushL(destinationBitmap); TSize sourceBitmapSize = aSourceBitmap->SizeInPixels(); TRect sourceRect = TRect(TPoint(0,0), sourceBitmapSize); TSize destinationBitmapSize(sourceRect.Width(), sourceRect.Height()); User::LeaveIfError(destinationBitmap->Create(destinationBitmapSize, aSourceBitmap->DisplayMode())); // Check source, if rom bitmap or compressed then create uncompressed ram bitmap TBool srcTemporary = EFalse; if( aSourceBitmap->IsRomBitmap() ) { srcTemporary = ETrue; } // Heap lock for FBServ large chunk to prevent background // compression of aSrcBitmap after if IsCompressedInRAM returns EFalse aSourceBitmap->LockHeapLC( ETrue ); // fbsheaplock TBool fbsHeapLock = ETrue; if( aSourceBitmap->IsCompressedInRAM() ) { srcTemporary = ETrue; } if( aSourceBitmap->ExtendedBitmapType() != KNullUid ) { srcTemporary = ETrue; } CFbsBitmap* realSource = aSourceBitmap; if( srcTemporary ) { CleanupStack::PopAndDestroy(); // fbsheaplock fbsHeapLock = EFalse; realSource = new (ELeave) CFbsBitmap(); CleanupStack::PushL( realSource ); User::LeaveIfError( realSource->Create( sourceBitmapSize, aSourceBitmap->DisplayMode() ) ); CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL( realSource ); CleanupStack::PushL( dev ); CFbsBitGc* gc = NULL; User::LeaveIfError( dev->CreateContext( gc ) ); CleanupStack::PushL( gc ); gc->BitBlt( TPoint(0,0), aSourceBitmap ); CleanupStack::PopAndDestroy(2); // dev, gc } // Heap lock for FBServ large chunk is only needed with large bitmaps. if (!fbsHeapLock) { if ( realSource->IsLargeBitmap() || destinationBitmap->IsLargeBitmap() ) { destinationBitmap->LockHeapLC( ETrue ); // fbsheaplock } else { CleanupStack::PushL( (TAny*)NULL ); } } TUint32* srcAddress = realSource->DataAddress(); TUint32* trgAddress = destinationBitmap->DataAddress(); if ( displayMode == EColor4K || displayMode == EColor64K ) { TInt srcScanLen16 = CFbsBitmap::ScanLineLength(sourceBitmapSize.iWidth, displayMode) / 2; TInt trgScanLen16 = CFbsBitmap::ScanLineLength(destinationBitmapSize.iWidth, displayMode) / 2; TInt srcScanLen32 = CFbsBitmap::ScanLineLength(sourceBitmapSize.iWidth, displayMode) / 4; TInt trgScanLen32 = CFbsBitmap::ScanLineLength(destinationBitmapSize.iWidth, displayMode) / 4; switch (aMirrorDirection) { case EAknVerticalMirroring: { TUint32* trgAddress32 = trgAddress; TUint32* srcAddress32 = srcAddress; TInt trgPos = 0; for ( TInt yPos=destinationBitmapSize.iHeight-1; yPos >= 0; yPos-- ) { srcAddress32 = srcAddress + srcScanLen32*yPos; trgAddress32 = trgAddress + trgScanLen32*trgPos; memcpy(trgAddress32, srcAddress32, srcScanLen32*4); trgPos++; } break; } case EAknHorizontalMirroring: { TUint16* trgAddress16 = reinterpret_cast<TUint16*>(trgAddress); TUint16* srcAddress16 = reinterpret_cast<TUint16*>(srcAddress); TInt xTrgPos = 0; for ( TInt yPos=destinationBitmapSize.iHeight-1; yPos >= 0; yPos-- ) { xTrgPos = 0; for ( TInt xPos=destinationBitmapSize.iWidth-1; xPos >= 0; xPos-- ) { trgAddress16[xTrgPos] = srcAddress16[xPos]; xTrgPos++; } srcAddress16 += srcScanLen16; trgAddress16 += trgScanLen16; } break; } default: { break; } } } else if( (displayMode==EGray256) || (displayMode==EColor256) ) { TInt srcScanLen8 = CFbsBitmap::ScanLineLength(sourceBitmapSize.iWidth, displayMode); TInt trgScanLen8 = CFbsBitmap::ScanLineLength(destinationBitmapSize.iWidth, displayMode); TInt srcScanLen32 = CFbsBitmap::ScanLineLength(sourceBitmapSize.iWidth, displayMode) / 4; TInt trgScanLen32 = CFbsBitmap::ScanLineLength(destinationBitmapSize.iWidth, displayMode) / 4; switch (aMirrorDirection) { case EAknVerticalMirroring: { TUint32* trgAddress32 = trgAddress; TUint32* srcAddress32 = srcAddress; TInt trgPos = 0; for ( TInt yPos=destinationBitmapSize.iHeight-1; yPos >= 0; yPos-- ) { srcAddress32 = srcAddress + srcScanLen32*yPos; trgAddress32 = trgAddress + trgScanLen32*trgPos; memcpy(trgAddress32, srcAddress32, srcScanLen32*4); trgPos++; } break; } case EAknHorizontalMirroring: { TUint8* trgAddress8 = reinterpret_cast<TUint8*>(trgAddress); TUint8* srcAddress8 = reinterpret_cast<TUint8*>(srcAddress); TInt xTrgPos = 0; for ( TInt yPos=destinationBitmapSize.iHeight-1; yPos >= 0; yPos-- ) { xTrgPos = 0; for ( TInt xPos=destinationBitmapSize.iWidth-1; xPos >= 0; xPos-- ) { trgAddress8[xTrgPos] = srcAddress8[xPos]; xTrgPos++; } srcAddress8 += srcScanLen8; trgAddress8 += trgScanLen8; } break; } default: { break; } } } CleanupStack::PopAndDestroy(); // fbsheaplock if( srcTemporary ) { CleanupStack::PopAndDestroy(); // realSource } CleanupStack::Pop(); // destinationBitmap return destinationBitmap; }
// --------------------------------------------------------------------------- // CThumbnailScaleTask::StartL() // --------------------------------------------------------------------------- // void CThumbnailScaleTask::StartL() { TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL()", this ); OstTrace1( TRACE_NORMAL, CTHUMBNAILSCALETASK_STARTL, "CThumbnailScaleTask::StartL;this=%o", this ); CThumbnailTask::StartL(); if ( !iCrop ) { TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - cropping OFF", this ); OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSCALETASK_STARTL, "CThumbnailScaleTask::StartL - cropping OFF;this=%o", this ); // target size at max, keep aspect ratio CalculateTargetSize(); } else { TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - cropping ON", this ); OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSCALETASK_STARTL, "CThumbnailScaleTask::StartL - cropping ON;this=%o", this ); // exact target size, crop excess CalculateCropRectangle(); } TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - sizes calculated", this ); OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSCALETASK_STARTL, "CThumbnailScaleTask::StartL - sizes calculated;this=%o", this ); #ifdef _DEBUG aStart.UniversalTime(); #endif delete iScaledBitmap; iScaledBitmap = NULL; iScaledBitmap = new( ELeave )CFbsBitmap(); TSize bitmapSize = iBitmap->SizeInPixels(); if(bitmapSize.iHeight == iTargetSize.iHeight && bitmapSize.iWidth == iTargetSize.iWidth) { TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - no need for scaling", this); OstTrace1( TRACE_NORMAL, DUP4_CTHUMBNAILSCALETASK_STARTL, "CThumbnailScaleTask::StartL - no need for scaling;this=%o", this ); // copy bitmap 1:1 User::LeaveIfError( iScaledBitmap->Create( bitmapSize, iBitmap->DisplayMode() )); CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(iScaledBitmap); CleanupStack::PushL(device); CFbsBitGc* gc = NULL; User::LeaveIfError(device->CreateContext(gc)); CleanupStack::PushL(gc); gc->BitBlt(TPoint(0, 0), iBitmap); CleanupStack::PopAndDestroy(2, device); // gc TRAPD( err, StoreAndCompleteL()); Complete( err ); ResetMessageData(); } else { TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() - scaling", this); OstTrace1( TRACE_NORMAL, DUP5_CTHUMBNAILSCALETASK_STARTL, "CThumbnailScaleTask::StartL - scaling;this=%o", this ); User::LeaveIfError( iScaledBitmap->Create( iTargetSize, iBitmap->DisplayMode() )); iServer.ScaleBitmapL( iStatus, * iBitmap, * iScaledBitmap, iCropRectangle ); SetActive(); } TN_DEBUG2( "CThumbnailScaleTask(0x%08x)::StartL() end", this ); OstTrace1( TRACE_NORMAL, DUP6_CTHUMBNAILSCALETASK_STARTL, "CThumbnailScaleTask::StartL - end;this=%o", this ); }
void CAknNoteAttributes::SetAnimationBackGroundFrameL() { // R_QGN_GRAF_WAIT_BAR_ANIM case is OK without background frame. if (iAnimation && iAnimationID != R_QGN_GRAF_WAIT_BAR_ANIM) { // Not set background frame, if there is only one frame in animation. CBitmapAnimClientData *animClientData = iAnimation->BitmapAnimData(); if (animClientData != NULL && animClientData->FrameArray().Count() <= 1) { return; } const TDisplayMode displayMode( CCoeEnv::Static()->ScreenDevice()->DisplayMode() ); // Create skinned background frame CFbsBitmap* bitmap = new(ELeave) CFbsBitmap; CleanupStack::PushL(bitmap); User::LeaveIfError( bitmap->Create( iAnimation->Rect().Size(), displayMode ) ); CFbsBitmapDevice* doubleBufferDev = CFbsBitmapDevice::NewL( bitmap ); CleanupStack::PushL(doubleBufferDev); CFbsBitGc* doubleBufferGc = 0; User::LeaveIfError( doubleBufferDev->CreateContext( doubleBufferGc ) ); CleanupStack::PushL(doubleBufferGc); MAknsSkinInstance* skin = AknsUtils::SkinInstance(); MAknsControlContext* cc = iBgContext; AknsDrawUtils::DrawBackground( skin, cc, iNoteControl, *doubleBufferGc, TPoint(0,0), iAnimation->Rect(), KAknsDrawParamDefault ); #if 0 // waitbar background border if ( iAnimationID == R_QGN_GRAF_WAIT_BAR_ANIM ) { CFbsBitmap* frameL = NULL; CFbsBitmap* frameCenter = NULL; CFbsBitmap* frameR = NULL; CFbsBitmap* lMask = NULL; CFbsBitmap* centerMask = NULL; CFbsBitmap* rMask = NULL; AknIconUtils::CreateIconLC( frameL, lMask, KAvkonBitmapFile, EMbmAvkonQgn_graf_bar_frame_side_l, EMbmAvkonQgn_graf_bar_frame_side_l_mask ); AknIconUtils::CreateIconLC( frameCenter, centerMask, KAvkonBitmapFile, EMbmAvkonQgn_graf_bar_frame_center, EMbmAvkonQgn_graf_bar_frame_center_mask); AknIconUtils::CreateIconLC( frameR, rMask, KAvkonBitmapFile, EMbmAvkonQgn_graf_bar_frame_side_r, EMbmAvkonQgn_graf_bar_frame_side_r_mask ); TAknLayoutRect frameGraphicLayout; frameGraphicLayout.LayoutRect( iAnimation->Rect(), AknLayoutScalable_Avkon::wait_border_pane_g1() ); User::LeaveIfError( AknIconUtils::SetSize( frameL, frameGraphicLayout.Rect().Size(), EAspectRatioNotPreserved ) ); frameGraphicLayout.LayoutRect( iAnimation->Rect(), AknLayoutScalable_Avkon::wait_border_pane_g2() ); User::LeaveIfError( AknIconUtils::SetSize( frameCenter, frameGraphicLayout.Rect().Size(), EAspectRatioNotPreserved ) ); frameGraphicLayout.LayoutRect( iAnimation->Rect(), AknLayoutScalable_Avkon::wait_border_pane_g3() ); User::LeaveIfError( AknIconUtils::SetSize( frameR, frameGraphicLayout.Rect().Size(), EAspectRatioNotPreserved ) ); TPoint centerPoint( frameL->SizeInPixels().iWidth, 0 ); TPoint rightPoint( centerPoint.iX + frameCenter->SizeInPixels().iWidth, 0 ); doubleBufferGc->BitBltMasked( TPoint( 0, 0), frameL, TRect( TPoint( 0, 0 ), frameL->SizeInPixels() ), lMask, EFalse ); doubleBufferGc->BitBltMasked( centerPoint, frameCenter, TRect( frameCenter->SizeInPixels() ), centerMask, EFalse ); doubleBufferGc->BitBltMasked( rightPoint, frameR, TRect( frameR->SizeInPixels() ), rMask, EFalse ); CleanupStack::PopAndDestroy( 6 ); if ( iAnimation->BitmapAnimData()->PlayMode() == CBitmapAnimClientData::EPlay ) iAnimation->BitmapAnimData()->SetPlayMode(CBitmapAnimClientData::ECycle); } #endif CleanupStack::PopAndDestroy(2); // doubleBufferGc, doubleBufferDev // finally set background frame CBitmapFrameData* data = CBitmapFrameData::NewL(); data->SetBitmapsOwnedExternally( EFalse ); data->SetBitmap( bitmap ); // Set frame to animation iAnimation->BitmapAnimData()->SetBackgroundFrame( data ); // gets ownership CleanupStack::Pop(bitmap); // bitmap } }
/* * Landmark objects will make use of an SVG file for rendering (demo purposes) */ void CLMXObject::ConstructL() { _LIT(KIconFile, "\\resource\\apps\\Landmarks_0x2002E1AF.mif"); CGulIcon* icon = CreateIconL(KIconFile, EMbmLandmarks_0x2002e1afIcon, EMbmLandmarks_0x2002e1afIcon_mask); CleanupStack::PushL(icon); CFbsBitmap* bitmap = icon->Bitmap(); // Ownership NOT transferred CFbsBitmap* mask = icon->Mask(); // Ownership NOT transferred // Always expect 16M bitmap to make conversion to GL_RGBA easier if (bitmap->DisplayMode() != EColor16M) { bitmap = new(ELeave) CFbsBitmap; CleanupStack::PushL(bitmap); User::LeaveIfError(bitmap->Create(icon->Bitmap()->SizeInPixels(), EColor16M)); CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bitmap); CleanupStack::PushL(bitmapDevice); CFbsBitGc* bitmapContext = 0; User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext)); CleanupStack::PushL(bitmapContext); bitmapContext->BitBlt(TPoint(0, 0), icon->Bitmap()); CleanupStack::PopAndDestroy(2, bitmapDevice); icon->SetBitmap(bitmap); // Ownership transferred CleanupStack::Pop(bitmap); } // Always expect 256 mask to make conversion to GL_RGBA easier if (mask->DisplayMode() != EGray256) { mask = new(ELeave) CFbsBitmap; CleanupStack::PushL(mask); User::LeaveIfError(mask->Create(icon->Mask()->SizeInPixels(), EGray256)); CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(mask); CleanupStack::PushL(bitmapDevice); CFbsBitGc* bitmapContext = 0; User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext)); CleanupStack::PushL(bitmapContext); bitmapContext->BitBlt(TPoint(0, 0), icon->Mask()); CleanupStack::PopAndDestroy(2, bitmapDevice); icon->SetMask(mask); // Ownership transferred CleanupStack::Pop(mask); } // Now bitmap and mask point to either original or converted bitmaps, // and ownership belongs to icon const TSize bitmapSize = bitmap->SizeInPixels(); // sizeof(TUint32) == sizeof(RGBA) const TInt dataSize = bitmapSize.iWidth * bitmapSize.iHeight * sizeof(TUint32); TUint8* data = new(ELeave) TUint8[dataSize]; // Perform copy and conversion from BGR(A) to RGB(A) bitmap->LockHeap(); mask->LockHeap(); // TODO: Alpha component removed, as it seems to be corrupted from // subsequent reads from SVG file TUint8* rgb = reinterpret_cast<TUint8*>(bitmap->DataAddress()); // TUint8* alpha = reinterpret_cast<TUint8*>(mask->DataAddress()); for(TInt i = 0, j = 0; i < dataSize; i += 4, j += 3) { data[i + 0] = rgb[j + 2]; data[i + 1] = rgb[j + 1]; data[i + 2] = rgb[j + 0]; data[i + 3] = 0xc0; //alpha[i / 4]; } // Generate OpenGL texture ::glGenTextures(1, &iTextureId); ::glBindTexture(GL_TEXTURE_2D, iTextureId); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmapSize.iWidth, bitmapSize.iHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); mask->UnlockHeap(); bitmap->UnlockHeap(); delete data; CleanupStack::PopAndDestroy(icon); }