/* * GPAC - Multimedia Framework C SDK * * Authors: Jean Le Feuvre * Copyright (c) Telecom ParisTech 2000-2012 * All rights reserved * * This file is part of GPAC / Scene Compositor sub-project * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef MPEG4_GROUPING_H #define MPEG4_GROUPING_H #include <gpac/internal/compositor_dev.h> enum { GROUP_HAS_SENSORS = 1, GROUP_SKIP_CULLING = 1<<1, GROUP_HAS_LIGHTS = 1<<2, GROUP_IS_ANCHOR = 1<<3, /*set if group has been detected as a good candidate for caching*/ GROUP_IS_CACHABLE = 1<<4, /*set if group is cached*/ GROUP_IS_CACHED = 1<<5, GROUP_PERMANENT_CACHE = 1<<6, }; /*this is only used for type-casting of the common 2D/3D stacks to get the flags*/ typedef struct { u32 flags; } BaseGroupingStack; #ifdef GF_SR_USE_VIDEO_CACHE #define GROUPING_NODE_STACK_2D \ u32 flags; \ GF_Rect bounds; \ struct _group_cache *cache; \ u16 traverse_time; \ u8 changed; \ u8 nb_stats_frame; \ /*cache candidates are sorted by priority*/ \ Fixed priority; \ /*size of offscreen cache in kbytes*/ \ u32 cached_size; \ /*number of objects in cache - for debug purposes only*/ \ u32 nb_objects; \ #else #define GROUPING_NODE_STACK_2D \ u32 flags; \ GF_Rect bounds; \ #endif #define GROUPING_MPEG4_STACK_2D \ GROUPING_NODE_STACK_2D \ GF_List *sensors; \ typedef struct _mpeg4_group2d { GROUPING_MPEG4_STACK_2D } GroupingNode2D; /*traverse all children of the node */ void group_2d_traverse(GF_Node *node, GroupingNode2D *group, GF_TraverseState *tr_state); /*traverse all children of the node with the given traversing order*/ void group_2d_traverse_with_order(GF_Node *node, GroupingNode2D *group, GF_TraverseState *tr_state, u32 *positions); #ifdef GF_SR_USE_VIDEO_CACHE /*traverse the grouping node - returns 1 if the group is cached, in which case children nodes should not need to be traversed in SORT mode - this function takes care of zoom changes & stats resetup if needed*/ Bool group_2d_cache_traverse(GF_Node *node, GroupingNode2D *group, GF_TraverseState *tr_state); /*record the traversal information and turn cache on if possible*/ void group_2d_cache_evaluate(GF_Node *node, GroupingNode2D *group, GF_TraverseState *tr_state, struct _drawable_context *first_child, Bool skip_first_child, u32 last_cache_idx); #endif void group_2d_destroy(GF_Node *node, GroupingNode2D *group); /*for SVG <g> only when using offscreen group caches*/ void group_2d_destroy_svg(GF_Node *node, GroupingNode2D *group); #ifndef GPAC_DISABLE_3D /* @children: pointer to children field @sensors: cached list of sensors at this level, NULL if none @lights: cached list of lights (local and global) at this level, NULL if none @bbox: bounding box of sub-tree @dont_cull: if set, traversing always occur (needed for audio subgraph) */ #define GROUPING_NODE_STACK_3D \ u32 flags; \ GF_BBox bbox; \ typedef struct _parent_node_3d { GROUPING_NODE_STACK_3D } GroupingNode; GroupingNode *group_3d_new(GF_Node *node); void group_3d_delete(GF_Node *node); /*traverse all children of the node */ void group_3d_traverse(GF_Node *n, GroupingNode *group, GF_TraverseState *tr_state); #endif /* * ParentNode (Form, Layout, PathLayout, ...) tools */ typedef struct { /*the associated child (can be a group or a shape)*/ GF_Node *child; /*child bounds before and after placement*/ GF_Rect original, final; /*layout run-time scroll*/ Fixed scroll_x, scroll_y; /*if text node, ascent and descent of the text is stored for baseline alignment*/ Fixed ascent, descent; u32 text_split_idx; /*discard_type 0: not discardable, 1 disardable, 2 line break at the end of the group*/ u8 text_type; } ChildGroup; #define PARENT_MPEG4_STACK_2D \ GROUPING_MPEG4_STACK_2D \ /*list of ChildGroup drawn (can be fully transparents) - used for post placement*/ \ GF_List *groups; typedef struct _parent_node_2d { PARENT_MPEG4_STACK_2D } ParentNode2D; /*performs stack init (allocate all base stuff of stack)*/ void parent_node_setup(ParentNode2D *ptr); /*performs stack init (frees all base stuff of stack, but not the stack)*/ void parent_node_predestroy(ParentNode2D *gr); /*reset children list*/ void parent_node_reset(ParentNode2D *gr); /*creates a new group for the given node. If the node is NULL, the previous group's node is used*/ void parent_node_start_group(ParentNode2D *group, GF_Node *n, Bool discardable); /*sets the current group bounds*/ void parent_node_end_group(ParentNode2D *group, GF_Rect *bounds); /*sets the current group bounds + font properties*/ void parent_node_end_text_group(ParentNode2D *group, GF_Rect *bounds, Fixed ascent, Fixed descent, u32 split_text_idx); /*traverse the parent group's children for bounds compute. Starts a new ChildGroup for each child*/ void parent_node_traverse(GF_Node *node, ParentNode2D *group, GF_TraverseState *tr_state); /*updates the matrix (translations only, computed between final and original bounds) and traverse the given child*/ void parent_node_child_traverse(ChildGroup *cg, GF_TraverseState *tr_state); /*updates the matrix (position assigned by caller) and traverse the given child. Do not traverse if the matrix is NULL*/ void parent_node_child_traverse_matrix(ChildGroup *cg, GF_TraverseState *tr_state, GF_Matrix2D *mat2D); #endif /*MPEG4_GROUPING_H*/