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