scenegraph_dev.h
来自「gaca源码」· C头文件 代码 · 共 742 行 · 第 1/2 页
H
742 行
void (*restore)(struct _smil_timing_rti *rti, Fixed normalized_simple_time);
} SMIL_Timing_RTI;
void gf_smil_timing_init_runtime_info(SVGElement *timed_elt);
void gf_smil_timing_delete_runtime_info(SVGElement *timed_elt);
Fixed gf_smil_timing_get_normalized_simple_time(SMIL_Timing_RTI *rti, Double scene_time);
/*returns 1 if animation changed the target value/element/... */
Bool gf_smil_timing_notify_time(SMIL_Timing_RTI *rti, Double scene_time);
/* SMIL Animation Structures */
/* This structure is used per animated attribute,
it contains:
- all the animations applying to the same attribute,
- the specified value before any inheritance has been applied nor any animation started
(as specified in the SVG document),
- the presentation value passed from one animation to the next one,
- a pointer to the value of the color property (for handling of 'currentColor'),
- the location of the attribute in the elt structure when it was created
(used for fast comparison of SVG properties when animating from/to/by/values/... inherited values)
*/
typedef struct {
GF_List *anims;
GF_FieldInfo saved_specified_value;
GF_FieldInfo presentation_value;
GF_FieldInfo current_color_value;
void *orig_dom_ptr;
} SMIL_AttributeAnimations;
/* This structure is per animation element,
it holds the result of the animation and
some info to make animation computation faster */
typedef struct {
SMIL_AttributeAnimations *owner;
/* animation element */
SVGElement *anim_elt;
/* result of the animation */
GF_FieldInfo interpolated_value;
/* last value of the animation, used in accumulation phase */
GF_FieldInfo last_specified_value;
/* temporary value needed when the type of
the key values is different from the target attribute type */
GF_FieldInfo tmp_value;
s32 previous_key_index;
Fixed previous_coef;
u32 previous_keytime_index;
/* needed ? */
Bool target_value_changed;
GF_Path *path;
u8 rotate;
GF_PathIterator *path_iterator;
Fixed length;
} SMIL_Anim_RTI;
void gf_smil_anim_init_node(GF_Node *node);
void gf_smil_anim_init_runtime_info(SVGElement *e);
void gf_smil_anim_delete_runtime_info(SMIL_Anim_RTI *rai);
void gf_smil_anim_delete_animations(SVGElement *e);
void gf_svg_init_lsr_conditional(SVGCommandBuffer *script);
void gf_svg_reset_lsr_conditional(SVGCommandBuffer *script);
#endif
//
// MF Fields tools
// WARNING: MF / SF Nodes CANNOT USE THESE FUNCTIONS
//
//return the size (in bytes) of fixed fields (buffers are handled as a char ptr , 1 byte)
u32 gf_sg_vrml_get_sf_size(u32 FieldType);
/*BASE node (GF_Node) destructor*/
void gf_node_free(GF_Node *node);
/*node destructor dispatcher: redirects destruction for each graph type: VRML/MPEG4, X3D, SVG...)*/
void gf_node_del(GF_Node *node);
//these 2 functions are used when deleting the nodes (DESTRUCTORS ONLY), because the
//info about DEF ? USE is stored somewhere else (usually, BIFS codec or XMT parser)
//the parent node is used to determined the acyclic portions of the scene graph
void gf_node_list_del(GF_List *children, GF_Node *parent);
/*creates an undefined GF_Node - for parsing only*/
GF_Node *gf_sg_new_base_node();
/*returns field type from its name*/
u32 gf_sg_field_type_by_name(char *fieldType);
/*
Proto node
*/
/*field interface to codec. This is used to do the node decoding, index translation
and all QP/BIFS Anim parsing. */
struct _protofield
{
u8 EventType;
u8 FieldType;
/*if UseName, otherwise fieldN*/
char *FieldName;
/*default field value*/
void *default_value;
/*for instanciation - if externProto dit not specify field val*/
u8 val_not_loaded;
/*coding indexes*/
u32 IN_index, OUT_index, DEF_index, ALL_index;
/*Quantization*/
u32 QP_Type, hasMinMax;
void *qp_min_value, *qp_max_value;
/*this is for QP=13 only*/
u32 NumBits;
/*Animation*/
u32 Anim_Type;
void *userpriv;
void (*OnDelete)(void *ptr);
};
GF_ProtoFieldInterface *gf_sg_proto_new_field_interface(u32 FieldType);
/*proto field instance. since it is useless to duplicate all coding info, names and the like
we seperate proto declaration and proto instanciation*/
typedef struct
{
u8 EventType;
u8 FieldType;
u8 has_been_accessed;
void *field_pointer;
} GF_ProtoField;
struct _proto
{
/*1 - Prototype interface*/
u32 ID;
char *Name;
GF_List *proto_fields;
/*pointer to parent scene graph*/
struct __tag_scene_graph *parent_graph;
/*pointer to proto scene graph*/
struct __tag_scene_graph *sub_graph;
/*2 - proto implementation as declared in the bitstream*/
GF_List *node_code;
/*num fields*/
u32 NumIn, NumOut, NumDef, NumDyn;
void *userpriv;
void (*OnDelete)(void *ptr);
/*URL of extern proto lib (if none, URL is empty)*/
MFURL ExternProto;
/*list of instances*/
GF_List *instances;
};
/*proto field API*/
u32 gf_sg_proto_get_num_fields(GF_Node *node, u8 code_mode);
GF_Err gf_sg_proto_get_field(GF_Proto *proto, GF_Node *node, GF_FieldInfo *field);
typedef struct _proto_instance
{
/*this is a node*/
BASE_NODE
/*Prototype interface for coding and field addressing*/
GF_Proto *proto_interface;
/*proto implementation at run-time (aka the state of the nodes may differ accross
different instances of the proto)*/
GF_List *fields;
/*a proto doesn't have one root SFnode but a collection of nodes for implementation*/
GF_List *node_code;
/*node for proto rendering, first of all declared nodes*/
GF_Node *RenderingNode;
#ifndef GF_NODE_USE_POINTERS
/*in case the PROTO is destroyed*/
char *proto_name;
#endif
/*scripts are loaded once all IS routes are activated and node code is loaded*/
GF_List *scripts_to_load;
Bool is_loaded;
} GF_ProtoInstance;
/*destroy proto*/
void gf_sg_proto_del_instance(GF_ProtoInstance *inst);
GF_Err gf_sg_proto_get_field_index(GF_ProtoInstance *proto, u32 index, u32 code_mode, u32 *all_index);
Bool gf_sg_proto_get_aq_info(GF_Node *Node, u32 FieldIndex, u8 *QType, u8 *AType, Fixed *b_min, Fixed *b_max, u32 *QT13_bits);
GF_Err gf_sg_proto_get_field_ind_static(GF_Node *Node, u32 inField, u8 IndexMode, u32 *allField);
GF_Node *gf_sg_proto_create_node(GF_SceneGraph *scene, GF_Proto *proto, GF_ProtoInstance *from_inst);
void gf_sg_proto_instanciate(GF_ProtoInstance *proto_node);
/*get tag of first node in proto code - used for validation only*/
u32 gf_sg_proto_get_render_tag(GF_Proto *proto);
/*to call when a proto field has been modified (at creation or through commands, modifications through events
are handled internally).
node can be the proto instance or a node from the proto code
this will call NodeChanged if needed, forward to proto/node or trigger any route if needed*/
void gf_sg_proto_check_field_change(GF_Node *node, u32 fieldIndex);
/*
Script node
*/
#ifdef GPAC_HAS_SPIDERMONKEY
/*WIN32 and WinCE config (no configure script)*/
#if defined(WIN32) || defined(_WIN32_WCE)
#ifndef XP_PC
#define XP_PC
#endif
/*WINCE specific config*/
#if defined(_WIN32_WCE)
#include <windows.h>
#define XP_WINCE
#endif
#endif
/*other platforms should be setup through configure*/
#include <jsapi.h>
#endif
typedef struct
{
//extra script fields
GF_List *fields;
//BIFS coding stuff
u32 numIn, numDef, numOut;
/*pointer to original tables*/
#ifdef GF_NODE_USE_POINTERS
GF_Err (*gf_sg_script_get_field)(GF_Node *node, GF_FieldInfo *info);
GF_Err (*gf_sg_script_get_field_index)(GF_Node *node, u32 inField, u8 IndexMode, u32 *allField);
#endif
#ifdef GPAC_HAS_SPIDERMONKEY
JSContext *js_ctx;
struct JSObject *js_obj;
struct JSObject *js_browser;
/*all attached objects (eg, not created by the script) are stored here so that we don't
allocate them again and again and again when getting properties...*/
GF_List *obj_bank;
#endif
void (*JS_PreDestroy)(GF_Node *node);
void (*JS_EventIn)(GF_Node *node, GF_FieldInfo *in_field);
Bool is_loaded;
} GF_ScriptPriv;
/*setup script stack*/
void gf_sg_script_init(GF_Node *node);
/*get script field*/
GF_Err gf_sg_script_get_field(GF_Node *node, GF_FieldInfo *info);
/*get effective field count per event mode*/
u32 gf_sg_script_get_num_fields(GF_Node *node, u8 IndexMode);
/*translate field index from inMode to ALL mode*/
GF_Err gf_sg_script_get_field_index(GF_Node *Node, u32 inField, u8 IndexMode, u32 *allField);
/*create dynamic fields in the clone*/
GF_Err gf_sg_script_prepare_clone(GF_Node *dest, GF_Node *orig);
struct _scriptfield
{
u32 eventType;
u32 fieldType;
char *name;
s32 IN_index, OUT_index, DEF_index;
u32 ALL_index;
//real field
void *pField;
Double last_route_time;
Bool activate_event_out;
};
#ifdef GPAC_HAS_SPIDERMONKEY
JSContext *gf_sg_ecmascript_new();
void gf_sg_ecmascript_del(JSContext *);
void gf_sg_script_init_sm_api(GF_ScriptPriv *sc, GF_Node *script);
JSBool gf_sg_script_eventout_set_prop(JSContext *c, JSObject *obj, jsval id, jsval *val);
typedef struct
{
GF_FieldInfo field;
GF_Node *owner;
/*JS list for MFFields or NULL*/
JSObject *js_list;
/*when creating SFnode from inside the script, the node is stored here untill attached to an object*/
GF_Node *temp_node;
GF_List *temp_list;
/*when not owned by a node*/
void *field_ptr;
} GF_JSField;
void gf_sg_script_to_node_field(JSContext *c, jsval v, GF_FieldInfo *field, GF_Node *owner, GF_JSField *parent);
jsval gf_sg_script_to_smjs_field(GF_ScriptPriv *priv, GF_FieldInfo *field, GF_Node *parent);
#ifndef GPAC_DISABLE_SVG
void JSScript_LoadSVG(GF_Node *node);
typedef struct __tag_svg_script_ctx
{
Bool (*script_execute)(struct __tag_scene_graph *sg, char *utf8_script, GF_DOM_Event *event);
void (*on_node_destroy)(struct __tag_scene_graph *sg, GF_Node *n);
JSContext *js_ctx;
u32 nb_scripts;
/*node bank*/
GF_List *node_bank;
/*global object*/
JSObject *global;
/*event object*/
JSObject *event;
/*document object*/
JSObject *document;
} GF_SVGJS;
#endif
#endif
#endif /*_GF_SCENEGRAPH_DEV_H_*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?