*/
#include <new>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <Ecore_X.h>
#include <Evas.h>
+#include <Ecore.h>
extern "C"
{
-#include <X11/Xproto.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <dri2.h>
-#include <tbm_bufmgr.h>
-#include <xf86drm.h>
#include <elm_config.h>
}
+
#include <livebox-service.h>
#include <livebox.h>
#include <FBaseColHashMapT.h>
#include <FUi_ControlManager.h>
#include <FUiCtrl_Frame.h>
#include <FUiCtrl_IFrameEventListener.h>
+#include "FShell_AppWidgetBuffer.h"
#include "FShell_AppWidgetViewManager.h"
#include "FShell_AppWidgetView.h"
#include "FShell_AppWidgetPopupView.h"
-//#define _PIXMAP_TEST
-//#define _BUFFER_TEST
+//#define _DUMP_BUFFER
using namespace std;
using namespace Tizen::Base;
using namespace Tizen::Ui;
using namespace Tizen::Ui::Controls;
-namespace
-{
-
-tbm_bufmgr __pTbmBufmgr = null;
-int __fileCount = 0;
-int __drmFileDescriptor = -1;
-
-void
-dump_bmp(const char* pFileName, const void* pData, int width, int height)
-{
- FILE* pFile = null;
-
- struct
- {
- unsigned char magic[2];
- } bmpfile_magic = { {'B', 'M'} };
-
- struct
- {
- unsigned int filesz;
- unsigned short creator1;
- unsigned short creator2;
- unsigned int bmp_offset;
- } bmpfile_header = { 0, 0, 0, 0x36 };
-
- struct
- {
- unsigned int header_sz;
- unsigned int width;
- unsigned int height;
- unsigned short nplanes;
- unsigned short bitspp;
- unsigned int compress_type;
- unsigned int bmp_bytesz;
- unsigned int hres;
- unsigned int vres;
- unsigned int ncolors;
- unsigned int nimpcolors;
- } bmp_dib_v3_header_t = { 0x28, 0, 0, 1, 24, 0, 0, 0, 0, 0, 0 };
-
- if (pFileName != null)
- {
- pFile = fopen(pFileName, "w+");
- }
-
- if (pFile == null)
- {
- SysSecureLog(NID_UI_CTRL,"Failed to open %s", pFileName);
- return;
- }
-
- bmpfile_header.filesz = sizeof(bmpfile_magic) + sizeof(bmpfile_header) + sizeof(bmp_dib_v3_header_t) + width * height * 3;
- bmp_dib_v3_header_t.header_sz = sizeof(bmp_dib_v3_header_t);
- bmp_dib_v3_header_t.width = width;
- bmp_dib_v3_header_t.height = -height;
- bmp_dib_v3_header_t.nplanes = 1;
- bmp_dib_v3_header_t.bmp_bytesz = width * height * 3;
-
- fwrite(&bmpfile_magic, sizeof(bmpfile_magic), 1, pFile);
- fwrite(&bmpfile_header, sizeof(bmpfile_header), 1, pFile);
- fwrite(&bmp_dib_v3_header_t, sizeof(bmp_dib_v3_header_t), 1, pFile);
-
- unsigned int* pBlocks = (unsigned int*)pData;
-
- for (int i = 0; i < (height * width); i++)
- {
- fwrite(&pBlocks[i], 3, 1, pFile);
- }
-
- fclose(pFile);
-}
-
-struct _Deleter
-{
- void operator()(char* pStr)
- {
- free(pStr);
- }
-};
-
-tbm_bufmgr
-bufmgr_get(Display* pDisplay, Pixmap pixmap)
-{
- int screen = DefaultScreen(pDisplay);
-
- // DRI2
- int eventBase = 0;
- int errorBase = 0;
- if (!DRI2QueryExtension(pDisplay, &eventBase, &errorBase))
- {
- SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2QueryExtension.");
- return null;
- }
-
- int dri2Major = 0;
- int dri2Minor = 0;
- if (!DRI2QueryVersion(pDisplay, &dri2Major, &dri2Minor))
- {
- SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2QueryVersion.");
- return null;
- }
-
- char* pDriverNameTemp = null;
- char* pDeviceNameTemp = null;
- if (!DRI2Connect(pDisplay, RootWindow(pDisplay, screen), &pDriverNameTemp, &pDeviceNameTemp))
- {
- SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2Connect.");
- return null;
- }
-
- unique_ptr<char, _Deleter> pDriverName(pDriverNameTemp);
- unique_ptr<char, _Deleter> pDeviceName(pDeviceNameTemp);
-
- // Get the drm_fd though opening the deviceName
- __drmFileDescriptor = open(pDeviceName.get(), O_RDWR);
- if (__drmFileDescriptor < 0)
- {
- SysSecureLog(NID_UI_CTRL, "Failed to open drm device (%s)", pDeviceName.get());
- return null;
- }
-
- // Get the drm magic
- drm_magic_t magic;
- drmGetMagic(__drmFileDescriptor, &magic);
- if (!DRI2Authenticate(pDisplay, RootWindow(pDisplay, screen), magic))
- {
- SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2Authenticate.");
- close(__drmFileDescriptor);
- __drmFileDescriptor = -1;
- return null;
- }
-
- // tbm buffer manager init
- tbm_bufmgr bufmgr = tbm_bufmgr_init(__drmFileDescriptor);
- if (!bufmgr)
- {
- SysSecureLog(NID_UI_CTRL, "Failed to initialize buffer manager.");
- close(__drmFileDescriptor);
- __drmFileDescriptor = -1;
- return null;
- }
-
- DRI2CreateDrawable(pDisplay, pixmap);
-
- return bufmgr;
-}
-
-static void
-pixmap_update(Display* pDisplay, tbm_bufmgr bufmgr, Pixmap pixmap, int x, int y, int width, int height)
-{
- int dri2_width = 0;
- int dri2_height = 0;
- unsigned int attachments[1] = { DRI2BufferFrontLeft };
- int dri2_count = 1;
- int dri2_out_count = 0;
-
- int opt = TBM_OPTION_READ|TBM_OPTION_WRITE;
- char imgFile[100] = {0,};
-
- tbm_bo bo = null;
- tbm_bo_handle bo_handle;
- bo_handle.ptr = null;
-
- DRI2Buffer* pDri2_buffers = DRI2GetBuffers (pDisplay, pixmap, &dri2_width, &dri2_height, attachments, dri2_count, &dri2_out_count);
- SysTryReturnVoidResult(NID_SHELL, pDri2_buffers != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
- SysTryLogCatch(NID_UI_CTRL, pDri2_buffers->name != null, , "[E_OUT_OF_MEMORY] Memory is insufficient.");
-
- bo = tbm_bo_import(bufmgr, pDri2_buffers->name);
- SysTryLogCatch(NID_UI_CTRL, bo != null, , "Failed to import bo (key : %d).", pDri2_buffers->name);
-
- bo_handle = tbm_bo_map(bo, TBM_DEVICE_CPU, opt);
- SysTryLogCatch(NID_UI_CTRL, bo_handle.ptr != null, , "Failed to get map.");
-
- memset(imgFile, 0, sizeof(imgFile));
- sprintf(imgFile,"./dump%d.bmp", __fileCount++);
-
- if (__fileCount == 5 || __fileCount == 20)
- {
- dump_bmp(imgFile, bo_handle.ptr, dri2_width, dri2_height);
- }
-
-CATCH:
- if (bo_handle.ptr)
- {
- tbm_bo_unmap(bo);
- }
-
- if (bo)
- {
- tbm_bo_unref(bo);
- }
-
- if (pDri2_buffers)
- {
- free(pDri2_buffers);
- }
-}
-
-void
-DumpPixmap(int pixmap)
-{
- int x = 0;
- int y = 0;
- int width = 0;
- int height = 0;
-
- ecore_x_pixmap_geometry_get(pixmap, &x, &y, &width, &height);
- SysTryReturnVoidResult(NID_SHELL, (width > 0) && (height > 0), E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid [0x%x %d %d].", pixmap, width , height);
-
- if (__drmFileDescriptor > -1)
- {
- close(__drmFileDescriptor);
- __drmFileDescriptor = -1;
- }
-
- if (__pTbmBufmgr)
- {
- tbm_bufmgr_deinit(__pTbmBufmgr);
- __pTbmBufmgr = null;
- }
-
- if (__pTbmBufmgr == null)
- {
- __pTbmBufmgr = bufmgr_get((Display*)ecore_x_display_get(), pixmap);
- }
-
- if (__pTbmBufmgr != null)
- {
- pixmap_update((Display*)ecore_x_display_get(), __pTbmBufmgr, pixmap, 0, 0, width, height);
- }
- else
- {
- SysSecureLog(NID_UI_CTRL, "can't get pixmap gBufmgr");
- }
-
- SysSecureLog(NID_UI_CTRL, "dump pixmap[%d]", pixmap);
-}
-
-}
-
namespace Tizen { namespace Graphics
{
//result _CreateCoordinateTransformer(_ICoordinateSystemTransformer*&, _LogicalResolution, _BaseScreenSize, _PhysicalResolution, _BaseScreenSize);
_AppWidgetViewManager::_AppWidgetViewManager(void)
: __glMode(false)
+ , __pAppWidgetBuffer(new (std::nothrow) _AppWidgetBuffer)
{
// _LogicalResolution sourceResolution = RESOLUTION_LOGICAL_720;
// _PhysicalResolution destResolution = _CoordinateSystem::GetInstance()->GetPhysicalResolution();
+#if defined(_DUMP_BUFFER)
+ __pAppWidgetBuffer->Initialize();
+#endif // _DUMP_BUFFER
+
livebox_init(ecore_x_display_get());
livebox_subscribe_group("*", "*");
const int BITS_PER_PIXEL = 32;
int length = size.width * size.height * BITS_PER_PIXEL / 8;
-#if defined(_BUFFER_TEST)
- {
- FILE* pFile = null;
- static int idx = 0;
- char filename[1024];
- snprintf(filename, sizeof(filename), "/tmp/view%d.raw", idx++);
- pFile = fopen(filename, "w+b");
- if (pFile)
- {
- fwrite(pBuffer, length, 1, pFile);
- fclose(pFile);
- SysLog(NID_SHELL, "_BUFFER_TEST: buffer (0x%x) size (%d) width(%f) height(%f)", pBuffer, length, size.width, size.height);
- }
- else
- {
- SysLog(NID_SHELL, "File open failed: (%s) buffer (0x%x) size (%d)", strerror(errno), pBuffer, length);
- }
- }
-#endif // _BUFFER_TEST
-
unique_ptr<ByteBuffer> pByteBuffer(new (std::nothrow) ByteBuffer());
SysTryReturn(NID_SHELL, pByteBuffer, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
}
void
+_AppWidgetViewManager::DumpBuffer(unsigned int pixmap)
+{
+ if (__pAppWidgetBuffer->GetPixmap() != pixmap)
+ {
+ int x = 0;
+ int y = 0;
+ int width = 0;
+ int height = 0;
+
+ ecore_x_pixmap_geometry_get(pixmap, &x, &y, &width, &height);
+ SysTryReturnVoidResult(NID_SHELL, (width > 0) && (height > 0), E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid [0x%x %d %d].", pixmap, width , height);
+
+ __pAppWidgetBuffer->DeallocBuffer();
+ __pAppWidgetBuffer->AllocBuffer(pixmap, FloatDimension(width, height));
+ __pAppWidgetBuffer->Dump();
+ __pAppWidgetBuffer->UnlockBuffer();
+ }
+ else
+ {
+ __pAppWidgetBuffer->LockBuffer();
+ __pAppWidgetBuffer->Dump();
+ __pAppWidgetBuffer->UnlockBuffer();
+ }
+}
+
+void
_AppWidgetViewManager::OnAppWidgetCreated(livebox* pAppWidget)
{
}
case LB_TYPE_PIXMAP:
if (__glMode)
{
- pAppWidgetView->OnAppWidgetUpdated(livebox_lb_pixmap(pAppWidget));
+ Pixmap pixmap = livebox_lb_pixmap(pAppWidget);
+ pAppWidgetView->OnAppWidgetUpdated(pixmap);
-#if defined(_PIXMAP_TEST)
- DumpPixmap(livebox_lb_pixmap(pAppWidget));
-#endif // _PIXMAP_TEST
+#if defined(_DUMP_BUFFER)
+ DumpBuffer(pixmap);
+#endif // _DUMP_BUFFER
}
else
{
case PD_TYPE_PIXMAP:
if (__glMode)
{
- pAppWidgetPopupView->OnAppWidgetUpdated(livebox_pd_pixmap(pAppWidget));
-#if defined(_PIXMAP_TEST)
- DumpPixmap(livebox_pd_pixmap(pAppWidget));
-#endif // _PIXMAP_TEST
+ Pixmap pixmap = livebox_pd_pixmap(pAppWidget);
+ pAppWidgetPopupView->OnAppWidgetUpdated(pixmap);
+#if defined(_DUMP_BUFFER)
+ DumpBuffer(pixmap);
+#endif // _DUMP_BUFFER
}
else
{