#ifndef _VISUAL_MANAGER_2D_
#define _VISUAL_MANAGER_2D_
Bool gf_irect_overlaps(GF_IRect *rc1, GF_IRect *rc2);
void gf_irect_intersect(GF_IRect *rc1, GF_IRect *rc2);
GF_Rect gf_rect_ft(GF_IRect *rc);
Bool gf_irect_inside(GF_IRect *rc1, GF_IRect *rc2);
#define gf_rect_equal(rc1, rc2) ((rc1.width == rc2.width) && (rc1.height == rc2.height) && (rc1.x == rc2.x) && (rc1.y == rc2.y))
#define RA_DEFAULT_STEP 10
typedef struct
{
GF_IRect rect;
#ifdef TRACK_OPAQUE_REGIONS
u32 opaque_node_index;
#endif
} GF_RectArrayEntry;
typedef struct
{
GF_RectArrayEntry *list;
u32 count, alloc;
} GF_RectArray;
#define ra_init(ra) { (ra)->count = 0; (ra)->alloc = RA_DEFAULT_STEP; (ra)->list = (GF_RectArrayEntry*)gf_malloc(sizeof(GF_RectArrayEntry)*(ra)->alloc); }
#define ra_del(ra) { if ((ra)->list) { gf_free((ra)->list); (ra)->list = NULL; } }
#define ra_add(ra, rc) { \
assert((rc)->width); \
if ((ra)->count==(ra)->alloc) { \
(ra)->alloc += RA_DEFAULT_STEP; \
(ra)->list = (GF_RectArrayEntry*)gf_realloc((ra)->list, sizeof(GF_RectArrayEntry) * (ra)->alloc); \
} \
(ra)->list[(ra)->count].rect = *rc; (ra)->count++; }
void ra_union_rect(GF_RectArray *ra, GF_IRect *rc);
void ra_refresh(GF_RectArray *ra);
void gf_irect_union(GF_IRect *rc1, GF_IRect *rc2);
struct _drawable_store
{
struct _drawable *drawable;
struct _drawable_store *next;
};
Bool visual_2d_draw_frame(GF_VisualManager *visual, GF_Node *root, GF_TraverseState *tr_state, Bool is_root_visual);
Bool visual_2d_node_cull(GF_TraverseState *tr_state, GF_Rect *bounds);
void visual_2d_pick_node(GF_VisualManager *visual, GF_TraverseState *tr_state, GF_Event *ev, GF_ChildNodeItem *children);
void visual_2d_clear_surface(GF_VisualManager *visual, GF_IRect *rc, u32 BackColor, u32 is_offscreen);
DrawableContext *visual_2d_get_drawable_context(GF_VisualManager *visual);
void visual_2d_remove_last_context(GF_VisualManager *visual);
void visual_2d_drawable_delete(GF_VisualManager *visual, Drawable *node);
GF_Err visual_2d_init_raster(GF_VisualManager *visual);
void visual_2d_release_raster(GF_VisualManager *visual);
void visual_2d_texture_path(GF_VisualManager *visual, GF_Path *path, DrawableContext *ctx, GF_TraverseState *tr_state);
void visual_2d_draw_path(GF_VisualManager *visual, GF_Path *path, DrawableContext *ctx, GF_STENCIL brush, GF_STENCIL pen, GF_TraverseState *tr_state);
void visual_2d_texture_path_text(GF_VisualManager *visual, DrawableContext *txt_ctx, GF_Path *path, GF_Rect *object_bounds, GF_TextureHandler *txh, GF_TraverseState *tr_state);
void visual_2d_fill_rect(GF_VisualManager *visual, DrawableContext *ctx, GF_Rect *rc, u32 color, u32 strike_color, GF_TraverseState *tr_state);
void visual_2d_texture_path_extended(GF_VisualManager *visual, GF_Path *path, GF_TextureHandler *txh, struct _drawable_context *ctx, GF_Rect *orig_bounds, GF_Matrix2D *ext_mx, GF_TraverseState *tr_state);
void visual_2d_draw_path_extended(GF_VisualManager *visual, GF_Path *path, DrawableContext *ctx, GF_STENCIL brush, GF_STENCIL pen, GF_TraverseState *tr_state, GF_Rect *orig_bounds, GF_Matrix2D *ext_mx, Bool is_erase);
typedef struct _video_overlay
{
struct _video_overlay *next;
GF_Window src, dst;
DrawableContext *ctx;
GF_RectArray ra;
} GF_OverlayStack;
Bool visual_2d_overlaps_overlay(GF_VisualManager *visual, DrawableContext *ctx, GF_TraverseState *tr_state);
void visual_2d_flush_overlay_areas(GF_VisualManager *visual, GF_TraverseState *tr_state);
void visual_2d_draw_overlays(GF_VisualManager *visual);
#ifndef GPAC_DISABLE_3D
void visual_2d_flush_hybgl_canvas(GF_VisualManager *visual, GF_TextureHandler *txh, struct _drawable_context *ctx, GF_TraverseState *tr_state);
#endif
#endif