352 lines
10 KiB
C

/****************************************************************************
*
* Copyright 2012 - 2020 Vivante Corporation, Santa Clara, California.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* 'Software'), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*****************************************************************************/
#ifndef VELM_H_
#define VELM_H_
#ifdef __cplusplus
extern "C" {
#endif
/*
*/
#define VERSION 0x00000001
#define SLOT_COUNT 256/*16*/
#define OBJECT_SLOT(id) \
elm_tls->gContext.object_slots[id % SLOT_COUNT]
/*
VGLite releated configurations.
*/
#define TS_WIDTH 64
#define TS_HEIGHT 64
#define RTOS 1
#define APP_BUFFER_COUNT 2
#if (RTOS && DDRLESS) || BAREMETAL
#define OBJCOUNT_GRAD 16
#define OBJCOUNT_EVO 128
#define OBJCOUNT_EBO 64
#define OBJCOUNT_GROUP 16
#endif
#if RTOS
#include "rtthread.h"
#define elm_alloc(num_objects, object_size) rt_malloc(num_objects * object_size)
#define elm_free rt_free
#else
#define elm_alloc calloc
#define elm_free free
#endif
typedef enum {
ELEMENT_LINEARGRADIENT = 0, /*! linear gradient element */
ELEMENT_PATH = 1, /*! path element */
ELEMENT_GROUP = 2, /*! group element */
ELEMENT_TEXT = 3, /*! text element */
ELEMENT_TSPAN = 4, /*! tspan element */
ELEMENT_FONT = 5, /*! font element */
ELEMENT_TTF_FONT = 6, /*! ttf-type font */
ELEMENT_VECTOR_FONT = 7, /*! vector fonts */
ELEMENT_TEXT_FONT = 8, /*! text fonts */
} ELM_ELEMENT_TYPE;
#define COUNT_OF(array) (sizeof(array) / sizeof(array[0]))
/*
System definitions.
*/
#define DEBUG_ASSERT(a, message) \
if (!a) \
printf("%s: ASSERT failed @ %s, %d.\n", message, __FILE__, __LINE__)
/*!
@typedef el_Object
common object type definition shared by all EVO object to identify its handle,
object type, and ELM version info.
for reference purpose, handle = 0 is reserved.
*/
typedef struct {
ElmHandle handle;
ELM_OBJECT_TYPE type;
unsigned int reference; // Reference count by other objects.
#if (RTOS && DDRLESS) || BAREMETAL
int index; /* The index of the object in pool. */
#endif
} el_Object;
/*!
@typedef el_Transform
The transformation attribute for an EVO/EBO/Group object.
*/
typedef struct {
float rotate;
float translate[2];
float scale[2];
BOOL dirty;
BOOL identity;
vg_lite_matrix_t matrix;
} el_Transform;
/*!
@typedef el_GradData
Linear gradient definition.
!grad the native vg_lite gradient data;
!gransform the grad's transformation. matrix is synced to grad's.
*/
typedef struct {
vg_lite_linear_gradient_t grad;
el_Transform transform;
} el_GradData;
/*!
@typedef el_RadgradData
Radial gradient definition.
!rad_grad the native vg_lite_radial_gradient data;
!gransform the grad's transformation. matrix is synced to grad's.
*/
typedef struct {
vg_lite_radial_gradient_t rad_grad;
el_Transform transform;
} el_RadgradData;
/*!
@typedef el_Obj_Grad
The linear gradient object definition.
*/
typedef struct {
el_Object object;
el_GradData data;
} el_Obj_Grad;
/*!
@typedef el_Obj_Radgrad
The radial gradient object definition.
*/
typedef struct {
el_Object object;
el_RadgradData data;
} el_Obj_Radgrad;
/*!
@typedef el_Obj_Pattern
The pattern paint object definition.
pattern: it should be an pointer to an el_Obj_EVO;
mode: the pattern fill mode.
color: the color value if pattern mode is COLOR
*/
typedef struct {
void *pattern;
ELM_PATTERN_MODE mode;
uint32_t color;
} el_Obj_Pattern;
/*!
@typedef el_Paint
The paint object definition.
color: for solid fill;
grad: for linear gradient fill;
pattern: for image fill.
*/
typedef struct {
ELM_PAINT_TYPE type;
uint32_t color;
el_Obj_Grad * grad;
el_Obj_Radgrad * radgrad;
el_Obj_Pattern pattern;
} el_Paint;
/*!
@typedef el_Attribute
The rendering attribute definition.
*/
typedef struct {
ELM_QUALITY quality;
ELM_BLEND blend;
ELM_EVO_FILL fill_rule;
el_Paint paint;
el_Transform transform;
} el_Attribute;
/*!
@typedef el_EVOData
The data definition for EVO (vector object).
*/
typedef struct {
vg_lite_path_t path;
} el_EVOData;
/*!
@typedef el_Obj_EVO
EVO (Elementry Vector Object) type definition.
*/
typedef struct {
el_Object object;
el_Attribute attribute;
el_Attribute defaultAttrib;
el_EVOData data;
uint32_t has_pattern;
uint32_t is_pattern;
uint32_t is_image;
char eboname[20];
uint32_t img_width;
uint32_t img_height;
} el_Obj_EVO;
/*!
@typedef el_EBOData
The data definition for EBO (bitmap object).
*/
typedef struct {
vg_lite_buffer_t buffer;
} el_EBOData;
/*!
@typedef el_Obj_EBO
EBO (Elementry Buffer Object) type definition.
*/
typedef struct {
el_Object object;
el_Attribute attribute;
el_Attribute defaultAttrib;
el_EBOData data;
uint32_t clut_count;
uint32_t clut[256];
} el_Obj_EBO;
/*!
@typedef el_GroupData
The group object data definition.
*/
typedef struct {
unsigned int count;
el_Obj_EVO * objects;
} el_GroupData;
/*!
@typedef el_Obj_Group
Group object type definition.
*/
typedef struct {
el_Object object;
el_Transform transform;
el_Transform defaultTrans;
el_GroupData group;
} el_Obj_Group;
/*!
@typedef el_Obj_Buffer
The render buffer object definition.
*/
typedef struct {
el_Object object;
vg_lite_buffer_t buffer;
} el_Obj_Buffer;
/*!
@typedef el_ObjList
List to organize objects.
*/
typedef struct _object_list{
el_Object *object;
struct _object_list *next;
} el_ObjList;
/*!
@typedef ElmRenderBuffer
The ElmRenderBuffer definition.
*/
typedef struct elm_render_buffer {
ElmBuffer handle;
vg_lite_buffer_t *buffer;
} ElmRenderBuffer;
/*!
@typedef el_Context
The context object for global data management.
!version UXDK version
!currentHandle The current handle for new object
!objectCount Count of all objects
!object_slots List array to manage objects
*/
typedef struct {
uint32_t version;
int reference;
ElmHandle currentHandle;
unsigned int objectCount;
el_ObjList *object_slots[SLOT_COUNT];
ElmRenderBuffer elmFB[APP_BUFFER_COUNT];
/* VGLite related states. */
uint32_t tessellation_width;
uint32_t tessellation_height;
/* The current vector index (within a group). */
int32_t vector_id;
#if (RTOS && DDRLESS) || BAREMETAL
/* Static object pools. */
el_Obj_Grad objpool_grad[OBJCOUNT_GRAD];
el_Obj_EVO objpool_evo[OBJCOUNT_EVO];
el_Obj_EBO objpool_ebo[OBJCOUNT_EBO];
el_Obj_Group objpool_group[OBJCOUNT_GROUP];
/* The allocation map table.
* Each bit in the element maps to the usage of the object.
* 0 means free, 1 means allocated.
* The mapping order is 01234567...31 (hi -> low) in big endian systems.
* */
int32_t objmap_grad[(OBJCOUNT_GRAD + 31) / 32];
int32_t objmap_evo[(OBJCOUNT_EVO + 31) / 32];
int32_t objmap_ebo[(OBJCOUNT_EBO + 31) / 32];
int32_t objmap_group[(OBJCOUNT_GROUP + 31) / 32];
int objcounter_grad;
int objcounter_evo;
int objcounter_ebo;
int objcounter_group;
#endif
} el_Context;
/*!
@typedef elm_tls_t
The elm_tls_t definition.
*/
typedef struct vglite_elm_tls {
el_Context gContext;
} elm_tls_t;
/*
API function prototypes.
*/
int add_object (el_Object *object);
int remove_object (el_Object *object);
el_Object *get_object (ElmHandle handle);
#ifdef __cplusplus
}
#endif
#endif /* VELM_H_ */