ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/services/mgui/Image.c b/marvell/services/mgui/Image.c
new file mode 100644
index 0000000..b61ef44
--- /dev/null
+++ b/marvell/services/mgui/Image.c
@@ -0,0 +1,258 @@
+/******************************************************************************

+*(C) Copyright 2014 Marvell International Ltd.

+* All Rights Reserved

+******************************************************************************/

+/*******************************************************************************

+ *

+ *  Filename: Line.c

+ *

+ *  Authors:  Boaz Sommer

+ *

+ *  Description: A Line class

+ *

+ *  HISTORY:

+ *

+ *

+ *

+ *  Notes:

+ *

+ ******************************************************************************/

+#include	<stdarg.h>

+#include	<stdlib.h>

+#include 	<string.h>

+

+#include	"mgui_utils.h"

+#include	"Image.h"

+

+typedef	struct	_IMAGE_ARRAY

+{

+	int					num_items;

+	int					image_index_to_display;

+	int					image_index_last_display;

+	IMAGE_ARRAY_ITEM	*image_array_items;

+}IMAGE_ARRAY;

+

+typedef	struct	S_IMAGE_PRIV

+{

+	void			*dfb;

+	IMAGE_ARRAY			image_array;

+	IMAGE_ARRAY_ITEM	single_image_path;

+	OBJECT_RECT		region;

+}IMAGE_PRIV;

+

+static	char	*_ImageGetPath(IMAGE_PRIV *image)

+{

+	char	*path = NULL;

+

+	if	(image->single_image_path.path)

+		path	=	image->single_image_path.path;

+	else if	(image->image_array.image_index_to_display != -1)

+		path	=	image->image_array.image_array_items[image->image_array.image_index_to_display].path;

+

+	return path;

+}

+

+static	void	_ImageFreeArray	(IMAGE_PRIV *image)

+{

+	int	i, num = image->image_array.num_items;

+

+	for (i = 0; i < num; i++)

+	{

+		if	(image->image_array.image_array_items[i].path != NULL)

+		{

+			free	(image->image_array.image_array_items[i].path);

+			GuiReleaseImageSurface(image->dfb, image->image_array.image_array_items[i].image_surface);

+		}

+	}

+

+	free(image->image_array.image_array_items);

+	image->image_array.image_array_items = NULL;

+	image->image_array.num_items	=	0;

+	image->image_array.image_index_to_display	=	-1;

+	image->image_array.image_index_last_display	=	-1;

+}

+

+

+IMAGE	ImageInit	(void *dfb)

+{

+	IMAGE_PRIV	*image	=	calloc(1, sizeof(*image));

+

+	image->dfb	=	dfb;

+	GuiAddObject(image->dfb, image, (ObjectDrawFunc)ImageDraw);

+	image->image_array.image_index_to_display	=	-1;

+	image->image_array.image_index_last_display	=	-1;

+	image->single_image_path.path = NULL;

+	image->image_array.num_items	=	0;

+

+	return (IMAGE)image;

+}

+

+void	ImageDeinit	(IMAGE pt)

+{

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+

+	if	(image)

+	{

+		_ImageFreeArray(image);

+		if	(image->single_image_path.path)

+		{

+			GuiReleaseImageSurface(image->dfb, image->single_image_path.image_surface);

+			free	(image->single_image_path.path);

+		}

+		GuiRemoveObject(image->dfb, image);

+		free	(image);

+		image	=	NULL;

+	}

+}

+

+

+void	ImageDraw	(IMAGE pt)

+{

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+	IMAGE_ARRAY_ITEM	*image_array_item = NULL;

+	if	(image)

+	{

+		//MGUI_DMSG("image_index_to_display = %d\n", image->image_array.image_index_to_display);

+		if	(image->image_array.image_index_to_display >= 0) {

+			image_array_item	= &image->image_array.image_array_items[image->image_array.image_index_to_display];

+			if (image->image_array.image_index_last_display != image->image_array.image_index_to_display &&

+				image->image_array.image_index_last_display >= 0)

+				lvgl_image_hide(image->image_array.image_array_items[image->image_array.image_index_last_display].image_surface);

+		} else if	(image->single_image_path.path)

+			image_array_item	= &image->single_image_path;

+		//MGUI_DMSG("image_array_item = %04X\n", (unsigned long)image_array_item);

+		if	(image_array_item) {

+			//DirectFbDrawImageFromSurface	(image->dfb, image_array_item->image_surface, image->region.lx, image->region.ly);

+			MGUI_DMSG("ptr=%p, key=%d, path=%s, surface=%p, flags=0x%08x, region=[h:%d w:%d:, lx:%d, ly:%d,\n",

+				image_array_item,

+				image_array_item->key, image_array_item->path,

+				image_array_item->image_surface,

+				image_array_item->image_blitting_flags,

+				image->region.h, image->region.w, image->region.lx, image->region.ly);

+

+			GuiDrawResizeImageFromSurface(image->dfb,

+					image_array_item->image_surface,

+					&image_array_item->image_blitting_flags,

+					&image->region);

+		}

+	}

+

+#if 0

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+	char		*path = NULL;

+	if	(image)

+	{

+		path	=	_ImageGetPath(image);

+		if	(path)

+		{

+			MGUI_DMSG("path = %s\n", path);

+			DirectFbDrawImage(image->dfb, path, &image->region);

+		}

+	}

+#endif

+}

+

+

+void ImageSetup2(IMAGE pt, OBJECT_RECT rect)

+{

+	IMAGE_PRIV *image = (IMAGE_PRIV *)pt;

+	if (image) {

+		image->region = rect;

+	}

+}

+

+void	ImageSetup				(IMAGE pt, int lx, int ly, int w, int h)

+{

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+	if	(image)

+	{

+		image->region.lx	=	lx;

+		image->region.ly	=	ly;

+		image->region.w		=	w;

+		image->region.h		=	h;

+	}

+}

+

+void	ImageSetFromPath	(IMAGE pt, char *resPath)

+{

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+

+	if	(image && resPath)

+	{

+		MGUI_DMSG("image path = %s\n", resPath);

+		image->single_image_path.path	=	strdup(resPath);

+		GuiCreateImageSurface(image->dfb, resPath,

+				&image->single_image_path.image_surface,

+				&image->single_image_path.image_blitting_flags);

+

+		GuiGetImageGeometry(image->dfb, resPath, &image->region);

+		MGUI_DMSG("image Width x Height = %d x %d\n", image->region.w, image->region.h);

+	}

+}

+

+void	ImageGetGeometry		(IMAGE pt, OBJECT_RECT *rect)

+{

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+	char	*path;

+	if	(image)

+	{

+		path	=	_ImageGetPath(image);

+		if	(path)

+		{

+			GuiGetImageGeometry(image->dfb, path, rect);

+		}

+	}

+}

+

+void	ImageSetFromArray		(IMAGE pt, int key)

+{

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+	int			i;

+

+	if	(image)

+	{

+		for	(i = 0; i < image->image_array.num_items; i++)

+		{

+			if	(key == image->image_array.image_array_items[i].key)

+			{

+				image->image_array.image_index_last_display = image->image_array.image_index_to_display;

+				image->image_array.image_index_to_display = i;

+				break;

+			}

+		}

+	}

+}

+

+void	ImageSetArray	(IMAGE pt, const IMAGE_ARRAY_ITEM *array, int size)

+{

+	IMAGE_PRIV	*image	=	(IMAGE_PRIV *)pt;

+	int			i;

+

+	MGUI_DMSG("image = %08X\n", (unsigned long )image);

+

+	if	(image)

+	{

+		if	(image->image_array.image_array_items != NULL)

+		{

+			MGUI_DMSG("Freeing image array\n");

+			_ImageFreeArray(image);

+		}

+

+		image->image_array.image_array_items	=	calloc(size, sizeof(IMAGE_ARRAY_ITEM));

+		MGUI_DMSG("image_array_items allocated, address = %08X, size = %d\n", (unsigned long)image->image_array.image_array_items,

+				size);

+		for	(i = 0; i < size; i++)

+		{

+			image->image_array.image_array_items[i].key = array[i].key;

+			image->image_array.image_array_items[i].path = strdup(array[i].path);

+			GuiCreateImageSurface(image->dfb,

+						image->image_array.image_array_items[i].path,

+						&image->image_array.image_array_items[i].image_surface,

+						&image->image_array.image_array_items[i].image_blitting_flags);

+		}

+		image->image_array.num_items	=	size;

+	}

+

+	MGUI_DMSG("Done.\n");

+}

+