Implement user decoration
authorHeeJu Kang <mobum.kang@samsung.com>
Wed, 24 Jul 2013 12:20:00 +0000 (21:20 +0900)
committerHeeJu Kang <mobum.kang@samsung.com>
Wed, 24 Jul 2013 12:20:00 +0000 (21:20 +0900)
Change-Id: I2c2e215d7c543027f12fedef03c1dab70c9641ea
Signed-off-by: HeeJu Kang <mobum.kang@samsung.com>
project/res/screen-density-xhigh/image_cover_osp.#.png [new file with mode: 0644]
project/src/ViewForm.cpp

diff --git a/project/res/screen-density-xhigh/image_cover_osp.#.png b/project/res/screen-density-xhigh/image_cover_osp.#.png
new file mode 100644 (file)
index 0000000..3cc988b
Binary files /dev/null and b/project/res/screen-density-xhigh/image_cover_osp.#.png differ
index 3fa640f..b356411 100644 (file)
@@ -38,6 +38,193 @@ const float VIEW_Y = 50.0f;
 const float VIEW_WIDTH = 175.0f;
 const float VIEW_HEIGHT = 175.0f;
 
+class MyAppWidgetView
+       : public AppWidgetView
+{
+public:
+               MyAppWidgetView(const Tizen::Base::String& appId, const Tizen::Base::String& providerName)
+                       : __pNinePatchBitmap(null)
+                       , __pSizeInfoList(null)
+               {
+                       __pNinePatchBitmap = Tizen::App::Application::GetInstance()->GetAppResource()->GetBitmapN(L"image_cover_osp.#.png");
+
+                       unique_ptr<AppWidgetProviderInfo> pProviderInfo(AppWidgetManager::GetInstance()->GetAppWidgetProviderInfoN(appId, providerName ));
+                       TryReturnVoid(pProviderInfo.get(), "pProviderInfo is null!!");
+
+                       __pSizeInfoList = pProviderInfo->GetSizeInfoListN();
+               }
+               virtual ~MyAppWidgetView(void) {}
+
+private:
+               virtual result OnDraw(void);
+               bool CanvasMaskingFromBitmap(Canvas& canvas, Canvas& mask);
+               bool CanvasMaskingFromBitmap(Canvas& canvas, Bitmap& mask);
+
+private:
+               Bitmap* __pNinePatchBitmap;
+               Tizen::Base::Collection::IList* __pSizeInfoList;
+};
+
+bool
+MyAppWidgetView::CanvasMaskingFromBitmap(Canvas& canvas, Canvas& mask)
+{
+       typedef unsigned long Pixel;
+
+       BufferInfo dstBi;
+       BufferInfo srcBi;
+
+       canvas.Lock(dstBi);
+       mask.Lock(srcBi);
+
+       if (dstBi.bitsPerPixel != 32 || srcBi.bitsPerPixel != 32)
+               return false;
+
+       if (srcBi.width > dstBi.width || srcBi.height > dstBi.height)
+               return false;
+
+       {
+               Pixel* pDst = (Pixel*)dstBi.pPixels;
+               Pixel* pSrc = (Pixel*)srcBi.pPixels;
+
+               int dstSkip = dstBi.pitch * 8 / dstBi.bitsPerPixel - srcBi.width;
+               int srcSkip = srcBi.pitch * 8 / srcBi.bitsPerPixel - srcBi.width;
+
+               for (int y = 0; y < srcBi.height; y++)
+               {
+                       for (int x = 0; x < srcBi.width; x++)
+                       {
+                               Pixel dA = (*pDst >> 24) & 0xFF;
+                               Pixel dR = (*pDst >> 16) & 0xFF;
+                               Pixel dG = (*pDst >> 8) & 0xFF;
+                               Pixel dB = (*pDst >> 0) & 0xFF;
+
+                               Pixel sA = (*pSrc >> 24) & 0xFF;
+
+                               Pixel alpha = sA + (sA >> 7);
+
+                               dA = (alpha * dA) >> 8;
+                               dR = (alpha * dR) >> 8;
+                               dG = (alpha * dG) >> 8;
+                               dB = (alpha * dB) >> 8;
+
+                               *pDst = (dA << 24) | (dR << 16) | (dG << 8)  + (dB);
+
+                               ++pDst;
+                               ++pSrc;
+                       }
+
+                       pDst += dstSkip;
+                       pSrc += srcSkip;
+               }
+       }
+       mask.Unlock();
+       canvas.Unlock();
+
+       return true;
+}
+
+bool
+MyAppWidgetView::CanvasMaskingFromBitmap(Canvas& canvas, Bitmap& mask)
+{
+       typedef unsigned long Pixel;
+
+       BufferInfo dstBi;
+       BufferInfo srcBi;
+
+       canvas.Lock(dstBi);
+       mask.Lock(srcBi);
+
+       if (dstBi.bitsPerPixel != 32 || srcBi.bitsPerPixel != 32)
+               return false;
+
+       if (srcBi.width > dstBi.width || srcBi.height > dstBi.height)
+               return false;
+
+       {
+               Pixel* pDst = (Pixel*)dstBi.pPixels;
+               Pixel* pSrc = (Pixel*)srcBi.pPixels;
+
+               int dstSkip = dstBi.pitch * 8 / dstBi.bitsPerPixel - srcBi.width;
+               int srcSkip = srcBi.pitch * 8 / srcBi.bitsPerPixel - srcBi.width;
+
+               for (int y = 0; y < srcBi.height; y++)
+               {
+                       for (int x = 0; x < srcBi.width; x++)
+                       {
+                               Pixel dA = (*pDst >> 24) & 0xFF;
+                               Pixel dR = (*pDst >> 16) & 0xFF;
+                               Pixel dG = (*pDst >> 8) & 0xFF;
+                               Pixel dB = (*pDst >> 0) & 0xFF;
+
+                               Pixel sA = (*pSrc >> 24) & 0xFF;
+
+                               Pixel alpha = sA + (sA >> 7);
+
+                               dA = (alpha * dA) >> 8;
+                               dR = (alpha * dR) >> 8;
+                               dG = (alpha * dG) >> 8;
+                               dB = (alpha * dB) >> 8;
+
+                               *pDst = (dA << 24) | (dR << 16) | (dG << 8)  + (dB);
+
+                               ++pDst;
+                               ++pSrc;
+                       }
+
+                       pDst += dstSkip;
+                       pSrc += srcSkip;
+               }
+       }
+       mask.Unlock();
+       canvas.Unlock();
+
+       return true;
+}
+
+result
+MyAppWidgetView::OnDraw(void)
+{
+       AppWidgetView::OnDraw();
+
+       AppWidgetSizeInfo* pSizeInfo = null;
+       if (__pSizeInfoList)
+       {
+               for(int i = 0; i < __pSizeInfoList->GetCount(); i ++)
+               {
+                       pSizeInfo = dynamic_cast<AppWidgetSizeInfo*>(__pSizeInfoList->GetAt(i) );
+                       if (!pSizeInfo)
+                       {
+                               AppLog("pSizeInfo is null");
+                               continue;
+                       }
+
+                       if (pSizeInfo->GetSize() == GetSizeF())
+                       {
+                               break;
+                       }
+               }
+       }
+
+       if (pSizeInfo && pSizeInfo->IsDecorationFrameUsed())
+       {
+               Canvas canvas;
+
+               FloatRectangle rect = GetBoundsF();
+               canvas.Construct(rect);
+
+               rect.x = 0.0f;
+               rect.y = 0.0f;
+
+               canvas.DrawNinePatchedBitmap(rect, *__pNinePatchBitmap);
+
+               Canvas* pCanvas = GetCanvasN();
+               if (pCanvas)
+               {
+                       CanvasMaskingFromBitmap(*pCanvas, canvas);
+               }
+       }
+}
+
 ViewForm::ViewForm(void)
        : __pAppWidgetView(null)
        , __pOptionMenu(null)
@@ -101,7 +288,7 @@ ViewForm::OnTerminating(void)
 void
 ViewForm::CreateAppWidgetView(const Tizen::Base::String& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& userInfo)
 {
-       unique_ptr<AppWidgetView> pAppWidgetView(new AppWidgetView());
+       unique_ptr<AppWidgetView> pAppWidgetView(new MyAppWidgetView(appId, providerName));
        if (pAppWidgetView)
        {
                result r = pAppWidgetView->Construct(appId, providerName, FloatRectangle(VIEW_X, VIEW_Y, VIEW_WIDTH, VIEW_HEIGHT), userInfo);