activityfw/tsutils/src/tsgraphicfilescalinghandler.cpp
changeset 96 5d243a69bdda
parent 94 dbb8300717f7
equal deleted inserted replaced
95:c739008478cc 96:5d243a69bdda
    19 
    19 
    20 // -----------------------------------------------------------------------------
    20 // -----------------------------------------------------------------------------
    21 // -----------------------------------------------------------------------------
    21 // -----------------------------------------------------------------------------
    22 //
    22 //
    23 CTsGraphicFileScalingHandler::CTsGraphicFileScalingHandler(MImageReadyCallBack &aNotify,
    23 CTsGraphicFileScalingHandler::CTsGraphicFileScalingHandler(MImageReadyCallBack &aNotify,
    24                             const TSize &aNewSize,
    24                                 const TSize &aNewSize,
    25                             TKindOfScaling aKindOfScaling
    25                                 TKindOfScaling aKindOfScaling
    26                             /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) :
    26                                 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) :
    27     CActive(EPriorityNormal),
    27     CActive(EPriorityNormal),
    28     mNotify(aNotify),
    28     mNotify(aNotify),
    29     mNewSize(aNewSize),
    29     mNewSize(aNewSize),
    30     mKindOfScaling(aKindOfScaling),
    30     mKindOfScaling(aKindOfScaling),
    31     mCurrentOperation(ENone)
    31     mCurrentOperation(ENone)
    32 {
    32 {
       
    33     CActiveScheduler::Add(this);
    33 }
    34 }
    34 
    35 
    35 // -----------------------------------------------------------------------------
    36 // -----------------------------------------------------------------------------
    36 // -----------------------------------------------------------------------------
    37 // -----------------------------------------------------------------------------
    37 //
    38 //
    38 EXPORT_C CTsGraphicFileScalingHandler::~CTsGraphicFileScalingHandler()
    39 EXPORT_C CTsGraphicFileScalingHandler::~CTsGraphicFileScalingHandler()
    39 {
    40 {
    40     Cancel();
    41     Cancel();
    41     delete mBitmapFromFile;
    42     delete mInputBitmap;
    42     delete mBitmapOutput;
    43     delete mOutputBitmap;
    43     delete mImageDecoder;
    44     delete mImageDecoder;
    44     delete mBitmapScaler;
    45     delete mBitmapScaler;
    45 }
    46 }
    46 
    47 
    47 // -----------------------------------------------------------------------------
    48 // -----------------------------------------------------------------------------
    48 // -----------------------------------------------------------------------------
    49 // -----------------------------------------------------------------------------
    49 //
    50 //
    50 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewL(MImageReadyCallBack &aNotify,
    51 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewL(MImageReadyCallBack &aNotify,
    51                                 RFs &aFs,
    52                                                 RFs &aFs,
    52                                 const TDesC &aFileName,
    53                                                 const TDesC &aFileName,
    53                                 const TDesC8& aMimeType,
    54                                                 const TDesC8& aMimeType,
    54                                 const TSize &aNewSize,
    55                                                 const TSize &aNewSize,
    55                                 TKindOfScaling aKindOfScaling
    56                                                 TKindOfScaling aKindOfScaling
    56                                 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/)
    57                                                 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/)
    57 {
    58 {
    58     CTsGraphicFileScalingHandler *self = CTsGraphicFileScalingHandler::NewLC(aNotify,
    59     CTsGraphicFileScalingHandler *self = CTsGraphicFileScalingHandler::NewLC(aNotify,
    59                                                                  aFs,
    60                                                                         aFs,
    60                                                                  aFileName,
    61                                                                         aFileName,
    61                                                                  aMimeType,
    62                                                                         aMimeType,
    62                                                                  aNewSize,
    63                                                                         aNewSize,
    63                                                                  aKindOfScaling);
    64                                                                         aKindOfScaling);
    64     CleanupStack::Pop();
    65     CleanupStack::Pop();
    65     return self;
    66     return self;
    66 }
    67 }
    67 
    68 
    68 // -----------------------------------------------------------------------------
    69 // -----------------------------------------------------------------------------
    69 // -----------------------------------------------------------------------------
    70 // -----------------------------------------------------------------------------
    70 //
    71 //
    71 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewLC(MImageReadyCallBack &aNotify,
    72 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewLC(MImageReadyCallBack &aNotify,
    72                                 RFs &aFs,
    73                                                 RFs &aFs,
    73                                 const TDesC &aFileName,
    74                                                 const TDesC &aFileName,
    74                                 const TDesC8& aMimeType,
    75                                                 const TDesC8& aMimeType,
    75                                 const TSize &aNewSize,
    76                                                 const TSize &aNewSize,
    76                                 TKindOfScaling aKindOfScaling
    77                                                 TKindOfScaling aKindOfScaling
    77                                 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/)
    78                                                 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/)
    78 {
    79 {
    79     CTsGraphicFileScalingHandler *self = new (ELeave) CTsGraphicFileScalingHandler(aNotify,
    80     CTsGraphicFileScalingHandler *self = new (ELeave) CTsGraphicFileScalingHandler(aNotify,
    80                                                                        aNewSize,
    81                                                                                 aNewSize,
    81                                                                        aKindOfScaling);
    82                                                                                 aKindOfScaling);
    82 
    83 
    83     CleanupStack::PushL(self);
    84     CleanupStack::PushL(self);
    84     self->ConstructL(aFs, aFileName, aMimeType);
    85     self->ConstructL(aFs, aFileName, aMimeType);
    85     return self;
    86     return self;
    86 }
    87 }
    97 
    98 
    98     if (aMimeType.Length() == 0) {
    99     if (aMimeType.Length() == 0) {
    99         User::Leave(KErrBadName);
   100         User::Leave(KErrBadName);
   100     }
   101     }
   101 
   102 
   102     if(0>=mNewSize.iWidth || 0>=mNewSize.iHeight) {
   103     if (0>=mNewSize.iWidth || 0>=mNewSize.iHeight) {
   103        User::Leave(KErrCorrupt);
   104        User::Leave(KErrCorrupt);
   104     }
   105     }
   105 
   106 
   106     CActiveScheduler::Add(this);
   107     mInputBitmap = new(ELeave)CFbsBitmap();
   107 
   108     DecodingOperationL(aFs, aFileName, aMimeType);
   108     mBitmapScaler = CBitmapScaler::NewL();
   109     SetActive();
   109     mBitmapScaler->SetQualityAlgorithm(CBitmapScaler::EMaximumQuality);
   110 }
   110 
   111 
   111     // convert *.png to bitmap
   112 // -----------------------------------------------------------------------------
   112     mImageDecoder = CImageDecoder::FileNewL(aFs, aFileName, aMimeType);
   113 // -----------------------------------------------------------------------------
   113     mBitmapFromFile = new(ELeave)CFbsBitmap();
   114 //
   114     const TFrameInfo frameInfo(mImageDecoder->FrameInfo(0));
   115 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewL(MImageReadyCallBack &aNotify,
   115     User::LeaveIfError(mBitmapFromFile->Create(frameInfo.iOverallSizeInPixels, 
   116                                         const CFbsBitmap &aImputFbsBitmap,
   116                                                frameInfo.iFrameDisplayMode));
   117                                         const TSize &aNewSize,
   117 
   118                                         TKindOfScaling aKindOfScaling
   118     mImageDecoder->Convert(&iStatus, *mBitmapFromFile, 0);
   119                                         /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/)
   119     mCurrentOperation = EConvertBitmapFromFile;
   120 {
       
   121     CTsGraphicFileScalingHandler *self = CTsGraphicFileScalingHandler::NewLC(aNotify,
       
   122                                                                         aImputFbsBitmap,
       
   123                                                                         aNewSize,
       
   124                                                                         aKindOfScaling);
       
   125     CleanupStack::Pop();
       
   126     return self;
       
   127 }
       
   128 
       
   129 // -----------------------------------------------------------------------------
       
   130 // -----------------------------------------------------------------------------
       
   131 //
       
   132 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewLC(MImageReadyCallBack &aNotify,
       
   133                                                 const CFbsBitmap &aImputFbsBitmap,
       
   134                                                 const TSize &aNewSize,
       
   135                                                 TKindOfScaling aKindOfScaling
       
   136                                                 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/)
       
   137 {
       
   138     CTsGraphicFileScalingHandler *self = new (ELeave) CTsGraphicFileScalingHandler(aNotify,
       
   139                                                                                 aNewSize,
       
   140                                                                                 aKindOfScaling);
       
   141 
       
   142     CleanupStack::PushL(self);
       
   143     self->ConstructL(aImputFbsBitmap);
       
   144     return self;
       
   145 }
       
   146 
       
   147 // -----------------------------------------------------------------------------
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 void CTsGraphicFileScalingHandler::ConstructL(const CFbsBitmap &aImputFbsBitmap)
       
   151 {
       
   152     if (0>=mNewSize.iWidth || 0>=mNewSize.iHeight) {
       
   153        User::Leave(KErrCorrupt);
       
   154     }
       
   155 
       
   156     mInputBitmap = new(ELeave)CFbsBitmap();
       
   157     User::LeaveIfError(mInputBitmap->Duplicate(aImputFbsBitmap.Handle()));
       
   158 
       
   159     ScalingOperationL();
   120     SetActive();
   160     SetActive();
   121 }
   161 }
   122 
   162 
   123 // -----------------------------------------------------------------------------
   163 // -----------------------------------------------------------------------------
   124 // -----------------------------------------------------------------------------
   164 // -----------------------------------------------------------------------------
   145 
   185 
   146     switch (mCurrentOperation) {
   186     switch (mCurrentOperation) {
   147     case EConvertBitmapFromFile: {
   187     case EConvertBitmapFromFile: {
   148             delete mImageDecoder;
   188             delete mImageDecoder;
   149             mImageDecoder = 0;
   189             mImageDecoder = 0;
   150             
   190 
   151             mBitmapOutput = new (ELeave)CFbsBitmap();
   191             ScalingOperationL();
   152             User::LeaveIfError(mBitmapOutput->Create(Scaling(), mBitmapFromFile->DisplayMode()));
       
   153             mBitmapScaler->Scale(&iStatus, *mBitmapFromFile, *mBitmapOutput, EFalse);
       
   154             mCurrentOperation = EScale;
       
   155             SetActive();
   192             SetActive();
   156             break;
   193             break;
   157         }
   194         }
   158     case EScale: {
   195     case EScale: {
   159             mCurrentOperation = ENone;
   196             mCurrentOperation = ENone;
   160 
   197 
   161             delete mBitmapScaler;
   198             delete mBitmapScaler;
   162             mBitmapScaler = 0;
   199             mBitmapScaler = 0;
   163             
   200             
   164             delete mBitmapFromFile;
   201             delete mInputBitmap;
   165             mBitmapFromFile = 0;
   202             mInputBitmap = 0;
   166 
   203 
   167             if (mKindOfScaling == CTsGraphicFileScalingHandler::EKeepAspectRatioByExpanding) {
   204             if (mKindOfScaling == CTsGraphicFileScalingHandler::EKeepAspectRatioByExpanding) {
   168                 User::LeaveIfError(mBitmapOutput->Resize(mNewSize));
   205                 User::LeaveIfError(mOutputBitmap->Resize(mNewSize));
   169             }
   206             }
   170 
   207 
   171             mNotify.ImageReadyCallBack(iStatus.Int(), mBitmapOutput);
   208             mNotify.ImageReadyCallBack(iStatus.Int(), mOutputBitmap);
   172             break;
   209             break;
   173         }
   210         }
   174     }
   211     }
   175 }
   212 }
   176 
   213 
   177 // -----------------------------------------------------------------------------
   214 // -----------------------------------------------------------------------------
   178 // -----------------------------------------------------------------------------
   215 // -----------------------------------------------------------------------------
   179 //
   216 //
   180 TSize CTsGraphicFileScalingHandler::Scaling()
   217 void CTsGraphicFileScalingHandler::DecodingOperationL(RFs &aFs, const TDesC &aFileName, const TDesC8& aMimeType)
   181 {
   218 {
   182    TSize originalSize = mBitmapFromFile->SizeInPixels();
   219     // convert *.png to bitmap
       
   220     mImageDecoder = CImageDecoder::FileNewL(aFs, aFileName, aMimeType);
       
   221     const TFrameInfo frameInfo(mImageDecoder->FrameInfo(0));
       
   222     mInputBitmap->Reset();
       
   223     User::LeaveIfError(mInputBitmap->Create(frameInfo.iOverallSizeInPixels, 
       
   224                                                frameInfo.iFrameDisplayMode));
       
   225 
       
   226     mImageDecoder->Convert(&iStatus, *mInputBitmap, 0);
       
   227     mCurrentOperation = EConvertBitmapFromFile;
       
   228 }
       
   229 
       
   230 // -----------------------------------------------------------------------------
       
   231 // -----------------------------------------------------------------------------
       
   232 //
       
   233 void CTsGraphicFileScalingHandler::ScalingOperationL()
       
   234 {
       
   235     mBitmapScaler = CBitmapScaler::NewL();
       
   236     mBitmapScaler->SetQualityAlgorithm(CBitmapScaler::EMaximumQuality);
       
   237 
       
   238     FixForDisplayModeNotSupportedByScalingOperation();
       
   239 
       
   240     mOutputBitmap = new (ELeave)CFbsBitmap();
       
   241     User::LeaveIfError(mOutputBitmap->Create(NewSizeToScalingOperation(), mInputBitmap->DisplayMode()));
       
   242     mBitmapScaler->Scale(&iStatus, *mInputBitmap, *mOutputBitmap, EFalse);
       
   243     mCurrentOperation = EScale;
       
   244 }
       
   245 
       
   246 // -----------------------------------------------------------------------------
       
   247 // -----------------------------------------------------------------------------
       
   248 //
       
   249 void CTsGraphicFileScalingHandler::FixForDisplayModeNotSupportedByScalingOperation()
       
   250 {
       
   251     if (EColor16MAP == mInputBitmap->DisplayMode()) {
       
   252         mInputBitmap->SetDisplayMode(EColor16MA);
       
   253     }
       
   254 }
       
   255 
       
   256 // -----------------------------------------------------------------------------
       
   257 // -----------------------------------------------------------------------------
       
   258 //
       
   259 TSize CTsGraphicFileScalingHandler::NewSizeToScalingOperation()
       
   260 {
       
   261    TSize originalSize = mInputBitmap->SizeInPixels();
   183    float widthFactor = mNewSize.iWidth / (float)originalSize.iWidth;
   262    float widthFactor = mNewSize.iWidth / (float)originalSize.iWidth;
   184    float heightFactor = mNewSize.iHeight / (float)originalSize.iHeight;
   263    float heightFactor = mNewSize.iHeight / (float)originalSize.iHeight;
   185 
   264 
   186    TSize retSize(mNewSize);
   265    TSize retSize(mNewSize);
   187 
   266