Internal fram API 'ConvertToNonpremultiplied()' added
authorYoungki Ahn <ykahn@samsung.com>
Tue, 28 May 2013 12:40:49 +0000 (21:40 +0900)
committerYoungki Ahn <ykahn@samsung.com>
Tue, 28 May 2013 12:40:49 +0000 (21:40 +0900)
Change-Id: I18b80d065f2f2c2d8dd3dcf313944a4ec1942c7d
Signed-off-by: Youngki Ahn <ykahn@samsung.com>
src/graphics/FGrp_Farm.cpp
src/graphics/FGrp_Farm.h

index 441a498..e99f184 100755 (executable)
@@ -103,8 +103,15 @@ bool _SaveToBmpFromBuffer(unsigned long* pBuffer, int width, int height, int pix
                return false;
        }
 
-       file.Write(bmpFileHeader, sizeof(bmpFileHeader));
-       file.Write(bmpDibHeader, sizeof(bmpDibHeader));
+       {
+               result r1 = file.Write(bmpFileHeader, sizeof(bmpFileHeader));
+               result r2 = file.Write(bmpDibHeader, sizeof(bmpDibHeader));
+
+               if (r1 != E_SUCCESS || r2 != E_SUCCESS)
+               {
+                       return false;
+               }
+       }
 
        {
                typedef unsigned long SourPixel;
@@ -128,7 +135,10 @@ bool _SaveToBmpFromBuffer(unsigned long* pBuffer, int width, int height, int pix
                                ++pSour32;
                        }
 
-                       file.Write(lineBuffer.Get(), dstPitch);
+                       if (file.Write(lineBuffer.Get(), dstPitch) != E_SUCCESS)
+                       {
+                               return false;
+                       }
                }
 
        }
@@ -460,4 +470,73 @@ bool BitmapMaskingFromBitmap(Bitmap& bitmap, Bitmap& mask)
        return succeeded;
 }
 
+////////////////////////////////////////////////////////////////////////////////
+
+bool ConvertToNonpremultiplied(Bitmap& bitmap)
+{
+       BufferInfo bi;
+
+       if (bitmap.Lock(bi) != E_SUCCESS)
+       {
+               return false;
+       }
+
+       bool result = false;
+
+       do
+       {
+               if (bi.bitsPerPixel != 32)
+               {
+                       result = true;
+                       break;
+               }
+
+               //if (!bitmap->isPremultiplied)
+               //      return;
+
+               typedef unsigned long DestPixel;
+
+               DestPixel* p = static_cast<DestPixel*>(bi.pPixels);
+               long paddingBytes = bi.pitch - bi.width * bi.bitsPerPixel / 8;
+
+               for (int y = 0; y < bi.height; y++)
+               {
+                       for (int x = 0; x < bi.width; x++)
+                       {
+                               DestPixel a = (*p >> 24);
+
+                               if (a > 0 && a < 254)
+                               {
+                                       a += (a >> 7);
+
+                                       DestPixel r = (*p >> 8) & 0x0000FF00;
+                                       r = r / a;
+                                       r = (r > 255) ? 255 : r;
+
+                                       DestPixel g = (*p >> 0) & 0x0000FF00;
+                                       g = g / a;
+                                       g = (g > 255) ? 255 : g;
+
+                                       DestPixel b = (*p << 8) & 0x0000FF00;
+                                       b = b / a;
+                                       b = (b > 255) ? 255 : b;
+
+                                       *p = (*p & 0xFF000000) | (r << 16) | (g << 8) | b;
+                               }
+
+                               p++;
+                       }
+
+                       p = reinterpret_cast<DestPixel*>(reinterpret_cast<unsigned char*>(p) + paddingBytes);
+               }
+
+               result = true;
+
+       } while (0);
+
+       bitmap.Unlock();
+
+       return result;
+}
+
 }}} // Tizen::Graphics::_Farm
index 57b925b..5b48ff0 100755 (executable)
@@ -80,6 +80,8 @@ _OSP_EXPORT_ bool CanvasMaskingFromBitmap(Canvas& canvas, Bitmap& mask);
 */
 _OSP_EXPORT_ bool BitmapMaskingFromBitmap(Bitmap& bitmap, Bitmap& mask);
 
+_OSP_EXPORT_ bool ConvertToNonpremultiplied(Bitmap& bitmap);
+
 }}} // Tizen::Graphics::_Farm
 
 #endif _FGRP_INTERNAL_FARM_H_