352 lines
10 KiB
C
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_ */
|