diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_picture_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_picture_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,431 @@ + + + + +TB9.2 Example Applications: examples/Graphics/Embedding/Picture.cpp Source File + + + + + +

examples/Graphics/Embedding/Picture.cpp

00001 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+00002 // All rights reserved.
+00003 // This component and the accompanying materials are made available
+00004 // under the terms of "Eclipse Public License v1.0"
+00005 // which accompanies this distribution, and is available
+00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
+00007 //
+00008 // Initial Contributors:
+00009 // Nokia Corporation - initial contribution.
+00010 //
+00011 // Contributors:
+00012 //
+00013 // Description:
+00014 //
+00015 
+00016 #include "EmbeddingGraphicsControl.h"
+00017 #include <coemain.h>
+00018 
+00019 // for the store
+00020 #include <s32std.h>
+00021 
+00022 static const TUid KUidExampleSmileyPicture = { 0x100000E6 } ;
+00023 
+00024 /*
+00025         CExamplePictureFactory
+00026 
+00027         Give picture header, checks UID and only if it's KUidExampleSmileyPicture will this restore
+00028         a picture - changing the swizzle in aHeader from a stream id into a pointer.
+00029         [incidentally, what errors should result if either the picture is already restored, or the UID
+00030         isn't recognized?]
+00031 */
+00032 
+00033 class TExamplePictureFactory : public MPictureFactory
+00034         {
+00035 public:
+00036         void NewPictureL(TPictureHeader& aHeader,const CStreamStore& aDeferredPictureStore) const;
+00037         };
+00038 
+00039 void TExamplePictureFactory::NewPictureL(TPictureHeader& aHeader,const CStreamStore& aDeferredPictureStore) const
+00040         {
+00041         if (aHeader.iPictureType == KUidExampleSmileyPicture)
+00042                 {
+00043                 // restore new picture from store into the TSwizzle
+00044                 // (which changes from stream id to pointer)
+00045                 // Construct a CSmileyPicture object and restore from the stream
+00046             if (aHeader.iPicture.IsId())
+00047                         aHeader.iPicture = CSmileyPicture::NewL(aDeferredPictureStore,aHeader.iPicture.AsId());
+00048                         
+00049                 }
+00050         else
+00051                 {
+00052                         // output error and panic
+00053                         User::Leave(KErrNoMemory);
+00054                 }
+00055         }
+00056 
+00057 // implementation of the CSmileyPicture class
+00058 
+00059 CSmileyPicture::CSmileyPicture()
+00060         {
+00061         // do nothing
+00062         }
+00063 
+00064 CSmileyPicture* CSmileyPicture::NewL(TMood aMood, TSizeSpec aSizeSpec)
+00065         {
+00066         CSmileyPicture* self = new (ELeave) CSmileyPicture();
+00067         self->iMood = aMood;
+00068         self->iSizeSpec = aSizeSpec;
+00069         return self;
+00070         }
+00071 
+00072 CSmileyPicture* CSmileyPicture::NewL(const CStreamStore& aStore, TStreamId aStreamId) 
+00073 // create from store
+00074         {
+00075         RStoreReadStream inStream;
+00076         inStream.OpenLC(aStore,aStreamId);
+00077         CSmileyPicture* self = new (ELeave) CSmileyPicture();
+00078         self->InternalizeL(inStream);
+00079         CleanupStack::PopAndDestroy();
+00080         return self;
+00081         }
+00082 
+00083 TStreamId CSmileyPicture::StoreL(CStreamStore& aStore) const
+00084 // stores the CSmileyPicture in a new stream of the specified store (using ExternalizeL())
+00085         {
+00086         RStoreWriteStream stream;
+00087         TStreamId id=stream.CreateLC(aStore);
+00088         ExternalizeL(stream);  
+00089         stream.CommitL();
+00090         CleanupStack::PopAndDestroy();
+00091         return id;
+00092         }
+00093 
+00094 void CSmileyPicture::ExternalizeL(RWriteStream& aStream) const
+00095         {
+00096         aStream.WriteInt8L(iMood);
+00097         aStream.WriteInt8L(iSizeSpec);
+00098         }
+00099 
+00100 void CSmileyPicture::InternalizeL(RReadStream& aStream)
+00101         {
+00102         iMood = TMood(aStream.ReadInt8L());
+00103         iSizeSpec = TSizeSpec(aStream.ReadInt8L());
+00104         }
+00105 
+00106 TInt CSmileyPicture::SpecToFactor() const
+00107         {
+00108         switch (iSizeSpec)
+00109                 {
+00110                 case ESmall:
+00111                         return 1;
+00112                 case EMedium:
+00113                         return 2;
+00114                 case ELarge:
+00115                         return 3;
+00116                 default:
+00117                         return 0;
+00118                 }
+00119         }
+00120 
+00121 void CSmileyPicture::Draw(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect,
+00122                                                 MGraphicsDeviceMap* /*aMap*/) const
+00123         {
+00124         aGc.SetClippingRect(aClipRect);  
+00125 
+00126         TInt scaleFactor = SpecToFactor();
+00127 
+00128         TSize penSizeBold(3*scaleFactor,3*scaleFactor);
+00129         TSize penSizeFat(5*scaleFactor,5*scaleFactor);
+00130         aGc.SetPenSize(penSizeFat);
+00131 
+00132         TInt leftOffset = 13*scaleFactor;
+00133         TInt rightOffset = 27*scaleFactor;
+00134         TInt circleSize = 40*scaleFactor;
+00135         TInt shrinkSize = 10*scaleFactor;
+00136         TInt halfCircle = 20*scaleFactor;
+00137         TInt neutralSize = 13*scaleFactor;
+00138 
+00139         TPoint leftEye(aTopLeft.iX+leftOffset,aTopLeft.iY+leftOffset);
+00140         TPoint rightEye(aTopLeft.iX+rightOffset,aTopLeft.iY+leftOffset);
+00141         aGc.Plot(leftEye);
+00142         aGc.Plot(rightEye);
+00143         aGc.SetPenSize(penSizeBold);
+00144         TRect circle(aTopLeft,TPoint(aTopLeft.iX+circleSize,aTopLeft.iY+circleSize));
+00145         aGc.DrawEllipse(circle);
+00146 
+00147         // draw the smile
+00148         TRect smile = circle;
+00149         switch (iMood)
+00150                 {
+00151                 case EHappy:
+00152                         {
+00153                         smile.Shrink(shrinkSize,shrinkSize);
+00154                         aGc.DrawArc(smile,TPoint(aTopLeft.iX,aTopLeft.iY+circleSize-shrinkSize),TPoint(aTopLeft.iX+circleSize,aTopLeft.iY+circleSize-shrinkSize));
+00155                         }
+00156                         break;
+00157                 case ENeutral:
+00158                         {
+00159                         aGc.DrawLine(TPoint(leftEye.iX,leftEye.iY+neutralSize),TPoint(rightEye.iX,rightEye.iY+neutralSize));
+00160                         }
+00161                         break;
+00162                 case ESad:
+00163                         {
+00164                         smile.Shrink(shrinkSize,shrinkSize);
+00165                         smile.Move(0,15*scaleFactor);
+00166                         aGc.DrawArc(smile,TPoint(aTopLeft.iX+circleSize,aTopLeft.iY+halfCircle),TPoint(aTopLeft.iX,aTopLeft.iY+halfCircle));
+00167                         }
+00168                         break;
+00169                 }
+00170         }
+00171 
+00172 void CSmileyPicture::SetMood(TMood aMood)
+00173         {
+00174         iMood = aMood;  
+00175         }
+00176 
+00177 CSmileyPicture::TMood CSmileyPicture::Mood()
+00178         {
+00179         return iMood;
+00180         }
+00181 
+00182 void CSmileyPicture::SetSize(TSizeSpec aSizeSpec)
+00183         {
+00184         iSizeSpec = aSizeSpec;  
+00185         }
+00186 
+00187 CSmileyPicture::TSizeSpec CSmileyPicture::Size()
+00188         {
+00189         return iSizeSpec;
+00190         }
+00191 
+00192 void CSmileyPicture::GetOriginalSizeInTwips(TSize& /*aSize*/) const
+00193         {
+00194         // do nothing
+00195         }
+00196 
+00197 
+00198 void CSmileyPicture::SetScaleFactor(TInt /*aScaleFactorWidth*/,TInt /*aScaleFactorHeight*/)
+00199         {
+00200         // do nothing
+00201         }
+00202 
+00203 
+00204 TInt CSmileyPicture::ScaleFactorWidth()const
+00205         {
+00206         return 1;
+00207         }
+00208 
+00209 
+00210 TInt CSmileyPicture::ScaleFactorHeight()const
+00211         {
+00212         return 1;
+00213         }
+00214 
+00215 
+00216 void CSmileyPicture::SetCropInTwips(const TMargins& /*aMargins*/)
+00217         {
+00218         // do nothing
+00219         }
+00220 
+00221 
+00222 void CSmileyPicture::GetCropInTwips(TMargins& aMargins)const
+00223         {
+00224         CPicture::GetCropInTwips(aMargins); // no crop
+00225         }
+00226 
+00227 TPictureCapability CSmileyPicture::Capability()const
+00228         {
+00229         return CPicture::Capability(); // no scale, no crop
+00230         }
+00231 
+00232 // example really starts here
+00233 CPictureControl::CPictureControl()
+00234         { 
+00235         SetMaxPhases(7);
+00236         iValidDocument = CPictureControl::EPicture;
+00237         iOffset = TPoint(50,50);
+00238         }
+00239 
+00240 // The file name
+00241 _LIT(KFileName,"\\grpict.dat");
+00242 
+00243 // Literal text
+00244 _LIT(KTxtUpdateModelCase0,"draw happy face at (50,50)");
+00245 _LIT(KTxtUpdateModelCase1,"draw sad face at (50,50)");
+00246 _LIT(KTxtUpdateModelCase2,"draw neutral face at (50,50)");
+00247 _LIT(KTxtUpdateModelCase3,"store picture in file");
+00248 _LIT(KTxtUpdateModelCase4,"delete picture from memory");
+00249 _LIT(KTxtUpdateModelCase5,"restore picture header from file");
+00250 _LIT(KTxtUpdateModelCase6,"restore picture from file");
+00251 
+00252 void CPictureControl::UpdateModelL()
+00253         {
+00254         // set up zoom factor object
+00255         testZf.SetGraphicsDeviceMap(iCoeEnv->ScreenDevice());
+00256         // set the zoom factor of the object
+00257         testZf.SetZoomFactor(TZoomFactor::EZoomOneToOne);
+00258         // use graphics device maps for drawing and getting fonts
+00259         testMap=&testZf;
+00260 
+00261         // the file session used in the example
+00262         RFs fsSession;
+00263         TParse filestorename;
+00264         
+00265         switch (Phase())
+00266                 {
+00267                 case 0:
+00268                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase0);
+00269                         iPicture = CSmileyPicture::NewL(CSmileyPicture::EHappy,CSmileyPicture::ESmall);
+00270                         break;
+00271                 case 1:
+00272                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase1);
+00273                         iPicture->SetMood(CSmileyPicture::ESad);
+00274                         iPicture->SetSize(CSmileyPicture::EMedium);
+00275                         break;
+00276                 case 2:
+00277                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase2);
+00278                         iPicture->SetMood(CSmileyPicture::ENeutral);
+00279                         iPicture->SetSize(CSmileyPicture::ELarge);
+00280                         break;
+00281                 case 3:
+00282                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase3);
+00283                         // set up the permament direct file store for the picture
+00284                         fsSession.Connect();
+00285                         
+00286                         // Create (replace, if it exists) the direct file store
+00287                         fsSession.Parse(KFileName,filestorename);
+00288                         iStore = CDirectFileStore::ReplaceLC(fsSession,filestorename.FullName(),EFileWrite);
+00289                         // Must say what kind of file store.
+00290                         iStore->SetTypeL(KDirectFileStoreLayoutUid);
+00291 
+00292                         // create picture header
+00293                         iHeader.iPicture = iPicture;
+00294                         iHeader.iSize = TSize(iPicture->SpecToFactor()*40,iPicture->SpecToFactor()*40);
+00295                         iHeader.iPictureType = KUidExampleSmileyPicture;
+00296 
+00297                         // store picture header and picture
+00298                         iHeaderId = StoreHeaderL(*iStore);
+00299                         // make header stream the root stream
+00300                         iStore->SetRootL(iHeaderId);
+00301 
+00302                         // close store
+00303                         CleanupStack::PopAndDestroy();
+00304                         fsSession.Close();
+00305                         break;
+00306                 case 4:
+00307                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase4);
+00308                         delete iPicture;
+00309                         iPicture = NULL;
+00310                         iValidDocument = CPictureControl::EFalse;
+00311                         break;
+00312                 case 5:
+00313                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase5);
+00314                         // set up the permament direct file store for the picture
+00315                         fsSession.Connect();
+00316                         
+00317                         // Open the direct file store and read the header
+00318                         fsSession.Parse(KFileName,filestorename);
+00319                         iStore = CDirectFileStore::OpenLC(fsSession,filestorename.FullName(),EFileRead);
+00320 
+00321                         RestoreHeaderL(*iStore,iStore->Root());
+00322                         // close store
+00323                         CleanupStack::PopAndDestroy();
+00324                         fsSession.Close();
+00325                         iValidDocument = CPictureControl::EHeader;
+00326                         break;
+00327                 case 6:
+00328                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase6);
+00329 
+00330                         fsSession.Connect();
+00331                         
+00332                         // Open the direct file store and read the header
+00333                         fsSession.Parse(KFileName,filestorename);
+00334                         iStore = CDirectFileStore::OpenLC(fsSession,filestorename.FullName(),EFileRead);
+00335                         
+00336                         TExamplePictureFactory factory;
+00337                         factory.NewPictureL(iHeader,*iStore);
+00338                                                 
+00339                         iPicture = (CSmileyPicture *) iHeader.iPicture.AsPtr();
+00340 
+00341                         // close store
+00342                         CleanupStack::PopAndDestroy();
+00343                         fsSession.Close();
+00344                         iValidDocument = CPictureControl::EPicture;
+00345                         break;
+00346                 }
+00347         }
+00348 
+00349 void CPictureControl::RestoreHeaderL(CStreamStore& aStore, TStreamId aId)
+00350         {
+00351         RStoreReadStream stream;
+00352         stream.OpenLC(aStore,aId);
+00353         iHeader.InternalizeL(stream);
+00354         CleanupStack::PopAndDestroy();          // close and delete the stream
+00355         }
+00356 
+00357 TStreamId CPictureControl::StoreHeaderL(CStreamStore& aStore) const
+00358         {
+00359         CStoreMap* map=CStoreMap::NewLC(aStore);
+00360         StoreHeaderComponentsL(*map,aStore);
+00361 
+00362         RStoreWriteStream stream(*map);
+00363         TStreamId id = stream.CreateLC(aStore);
+00364         iHeader.ExternalizeL(stream);
+00365         stream.CommitL();
+00366         map->Reset();
+00367         CleanupStack::PopAndDestroy(2);
+00368         return id;
+00369         }
+00370 
+00371 void CPictureControl::StoreHeaderComponentsL(CStoreMap& aMap,CStreamStore& aStore) const
+00372         {
+00373         TStreamId id;
+00374 
+00375         id = iPicture->StoreL(aStore);
+00376         aMap.BindL(iPicture,id);
+00377         }
+00378 
+00379 void CPictureControl::Draw(const TRect& /* aRect */) const
+00380         {
+00381         // draw surrounding rectangle
+00382         CWindowGc& gc=SystemGc(); // graphics context we draw to
+00383         gc.UseFont(iMessageFont); // use the system message font
+00384         gc.Clear(); // clear the area to be drawn to
+00385         SystemGc().DrawRect(Rect()); // surrounding rectangle to draw into
+00386         TRect rect=Rect(); // a centered rectangle of the default size
+00387         TRgb darkGray(85,85,85);
+00388 
+00389         // decide what to do, and do it
+00390         switch (iValidDocument)
+00391                 {
+00392         case CPictureControl::EFalse:
+00393                 // if document is not valid then Draw() draws gray screen
+00394                 gc.SetBrushColor(darkGray);
+00395                 gc.Clear(rect);
+00396                 break;
+00397         case CPictureControl::EPicture:
+00398                 // if picture in is memory then draw it
+00399                 iPicture->Draw(gc,iOffset,rect,testMap);
+00400                 break;
+00401         case CPictureControl::EHeader: 
+00402                 // if no iPicture, draw picture outline to specified size at iOffset
+00403                 TInt bottomRightX = iOffset.iX + iHeader.iSize.iWidth;
+00404                 TInt bottomRightY = iOffset.iY + iHeader.iSize.iHeight;
+00405                 TRect outlineBox(iOffset,TPoint(bottomRightX,bottomRightY));
+00406         
+00407                 gc.SetPenStyle(CGraphicsContext::EDottedPen);
+00408                 gc.DrawRect(outlineBox);
+00409                 break;
+00410                 }
+00411 
+00412         //iConEnv->ScreenDevice()->ReleaseFont(iMessageFont);
+00413         //gc.ReleaseFont(iMessageFont);
+00414         //gc.DiscardFont(); // discard font
+00415         }
+
+
Generated by  + +doxygen 1.6.2
+ +