static void CTXLoad_ExecuteConditional(M_Conditional *c, GF_Scene *scene) { GF_List *clist = c->buffer.commandList; c->buffer.commandList = NULL; gf_sg_command_apply_list(gf_node_get_graph((GF_Node*)c), clist, gf_scene_get_time(scene)); if (c->buffer.commandList != NULL) { while (gf_list_count(clist)) { GF_Command *sub_com = (GF_Command *)gf_list_get(clist, 0); gf_sg_command_del(sub_com); gf_list_rem(clist, 0); } gf_list_del(clist); } else { c->buffer.commandList = clist; } }
static void validator_xvs_add_event_dom(GF_Validator *validator, GF_Event *event) { GF_XMLNode *evt_node; GF_XMLAttribute *att; GF_SAFEALLOC(evt_node, GF_XMLNode); switch (event->type) { case GF_EVENT_CLICK: case GF_EVENT_MOUSEUP: case GF_EVENT_MOUSEDOWN: case GF_EVENT_MOUSEOVER: case GF_EVENT_MOUSEOUT: case GF_EVENT_MOUSEMOVE: case GF_EVENT_MOUSEWHEEL: case GF_EVENT_KEYUP: case GF_EVENT_KEYDOWN: case GF_EVENT_TEXTINPUT: evt_node->name = gf_strdup(gf_dom_event_get_name(event->type)); break; } if (!evt_node->name) { gf_free(evt_node); return; } evt_node->attributes = gf_list_new(); GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("time"); att->value = gf_malloc(100); sprintf(att->value, "%f", gf_scene_get_time(validator->term->root_scene)*1000); gf_list_add(evt_node->attributes, att); switch (event->type) { case GF_EVENT_CLICK: case GF_EVENT_MOUSEUP: case GF_EVENT_MOUSEDOWN: case GF_EVENT_MOUSEOVER: case GF_EVENT_MOUSEOUT: case GF_EVENT_MOUSEMOVE: case GF_EVENT_MOUSEWHEEL: if (event->type == GF_EVENT_MOUSEDOWN || event->type == GF_EVENT_MOUSEUP) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("button"); switch (event->mouse.button) { case 0: att->value = gf_strdup("Left"); break; case 1: att->value = gf_strdup("Middle"); break; case 2: att->value = gf_strdup("Right"); break; } gf_list_add(evt_node->attributes, att); } GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("x"); att->value = gf_malloc(100); sprintf(att->value, "%d", event->mouse.x); gf_list_add(evt_node->attributes, att); GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("y"); att->value = gf_malloc(100); sprintf(att->value, "%d", event->mouse.y); gf_list_add(evt_node->attributes, att); if (event->type == GF_EVENT_MOUSEWHEEL) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("wheel_pos"); att->value = gf_malloc(100); sprintf(att->value, "%f", FIX2FLT( event->mouse.wheel_pos) ); gf_list_add(evt_node->attributes, att); } if (event->mouse.key_states & GF_KEY_MOD_SHIFT) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("shift"); att->value = gf_strdup("true"); gf_list_add(evt_node->attributes, att); } if (event->mouse.key_states & GF_KEY_MOD_CTRL) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("ctrl"); att->value = gf_strdup("true"); gf_list_add(evt_node->attributes, att); } if (event->mouse.key_states & GF_KEY_MOD_ALT) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("alt"); att->value = gf_strdup("true"); gf_list_add(evt_node->attributes, att); } break; /*Key Events*/ case GF_EVENT_KEYUP: case GF_EVENT_KEYDOWN: case GF_EVENT_LONGKEYPRESS: GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("key_identifier"); att->value = gf_strdup(gf_dom_get_key_name(event->key.key_code)); gf_list_add(evt_node->attributes, att); if (event->key.flags & GF_KEY_MOD_SHIFT) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("shift"); att->value = gf_strdup("true"); gf_list_add(evt_node->attributes, att); } if (event->key.flags & GF_KEY_MOD_CTRL) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("ctrl"); att->value = gf_strdup("true"); gf_list_add(evt_node->attributes, att); } if (event->key.flags & GF_KEY_MOD_ALT) { GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("alt"); att->value = gf_strdup("true"); gf_list_add(evt_node->attributes, att); } break; case GF_EVENT_TEXTINPUT: GF_SAFEALLOC(att, GF_XMLAttribute); att->name = gf_strdup("unicode-char"); att->value = gf_malloc(100); sprintf(att->value, "%d", event->character.unicode_char); gf_list_add(evt_node->attributes, att); break; } gf_list_add(validator->xvs_node->content, evt_node); /* adding an extra text node for line break in serialization */ GF_SAFEALLOC(evt_node, GF_XMLNode); evt_node->type = GF_XML_TEXT_TYPE; evt_node->name = gf_strdup("\n"); gf_list_add(validator->xvs_node->content, evt_node); }
static GF_Err IS_ProcessData(GF_SceneDecoder *plug, const char *inBuffer, u32 inBufferLength, u16 ES_ID, u32 AU_time, u32 mmlevel) { u32 i, j, count; Double scene_time; GF_BitStream *bs; GF_FieldInfo *field; ISStack *st; ISPriv *priv = (ISPriv *)plug->privateStack; GF_Err e = GF_OK; /*decode data frame except if local stringSensor*/ bs = gf_bs_new(inBuffer, inBufferLength, GF_BITSTREAM_READ); i=0; while ((field = (GF_FieldInfo *)gf_list_enum(priv->ddf, &i))) { /*store present flag in eventIn for command skip - this is an ugly hack but it works since DDF don't have event types*/ field->eventType = gf_bs_read_int(bs, 1); /*parse val ourselves (we don't want to depend on bifs codec)*/ if (field->eventType) { switch (field->fieldType) { case GF_SG_VRML_SFBOOL: * ((SFBool *) field->far_ptr) = (SFBool) gf_bs_read_int(bs, 1); break; case GF_SG_VRML_SFFLOAT: *((SFFloat *)field->far_ptr) = FLT2FIX( gf_bs_read_float(bs) ); break; case GF_SG_VRML_SFINT32: *((SFInt32 *)field->far_ptr) = (s32) gf_bs_read_int(bs, 32); break; case GF_SG_VRML_SFTIME: *((SFTime *)field->far_ptr) = gf_bs_read_double(bs); break; case GF_SG_VRML_SFVEC2F: ((SFVec2f *)field->far_ptr)->x = FLT2FIX( gf_bs_read_float(bs) ); ((SFVec2f *)field->far_ptr)->y = FLT2FIX( gf_bs_read_float(bs) ); break; case GF_SG_VRML_SFVEC3F: ((SFVec3f *)field->far_ptr)->x = FLT2FIX( gf_bs_read_float(bs) ); ((SFVec3f *)field->far_ptr)->y = FLT2FIX( gf_bs_read_float(bs) ); ((SFVec3f *)field->far_ptr)->z = FLT2FIX( gf_bs_read_float(bs) ); break; case GF_SG_VRML_SFCOLOR: ((SFColor *)field->far_ptr)->red = FLT2FIX( gf_bs_read_float(bs) ); ((SFColor *)field->far_ptr)->green = FLT2FIX( gf_bs_read_float(bs) ); ((SFColor *)field->far_ptr)->blue = FLT2FIX( gf_bs_read_float(bs) ); break; case GF_SG_VRML_SFVEC4F: case GF_SG_VRML_SFROTATION: ((SFRotation *)field->far_ptr)->x = FLT2FIX( gf_bs_read_float(bs) ); ((SFRotation *)field->far_ptr)->y = FLT2FIX( gf_bs_read_float(bs) ); ((SFRotation *)field->far_ptr)->z = FLT2FIX( gf_bs_read_float(bs) ); ((SFRotation *)field->far_ptr)->q = FLT2FIX( gf_bs_read_float(bs) ); break; case GF_SG_VRML_SFSTRING: { u32 size, length; size = gf_bs_read_int(bs, 5); length = gf_bs_read_int(bs, size); if (gf_bs_available(bs) < length) return GF_NON_COMPLIANT_BITSTREAM; if ( ((SFString *)field->far_ptr)->buffer ) gf_free( ((SFString *)field->far_ptr)->buffer); ((SFString *)field->far_ptr)->buffer = (char*)gf_malloc(sizeof(char)*(length+1)); memset(((SFString *)field->far_ptr)->buffer , 0, length+1); for (j=0; j<length; j++) { ((SFString *)field->far_ptr)->buffer[j] = gf_bs_read_int(bs, 8); } } break; } } } gf_bs_del(bs); /*special case for StringSensor in local mode: lookup for special chars*/ if ((priv->type == IS_StringSensor) && priv->is_local) { char tmp_utf8[5000]; const unsigned short *ptr; u32 len; GF_FieldInfo *field1 = (GF_FieldInfo *)gf_list_get(priv->ddf, 0); GF_FieldInfo *field2 = (GF_FieldInfo *)gf_list_get(priv->ddf, 1); SFString *inText = (SFString *) field1->far_ptr; SFString *outText = (SFString *) field2->far_ptr; field1->eventType = field2->eventType = 0; priv->enteredText[priv->text_len] = (short) '\0'; len = gf_utf8_wcslen(priv->enteredText); if (len && (priv->enteredText[len-1] == priv->termChar)) { ptr = priv->enteredText; len = gf_utf8_wcstombs(tmp_utf8, 5000, &ptr); if (outText->buffer) gf_free(outText->buffer); outText->buffer = (char*)gf_malloc(sizeof(char) * (len)); memcpy(outText->buffer, tmp_utf8, sizeof(char) * len-1); outText->buffer[len-1] = 0; if (inText->buffer) gf_free(inText->buffer); inText->buffer = NULL; priv->text_len = 0; field1->eventType = field2->eventType = 1; } else { if (priv->delChar) { /*remove chars*/ if ((len>1) && (priv->enteredText[len-1] == priv->delChar)) { priv->enteredText[len-1] = (short) '\0'; len--; if (len) { priv->enteredText[len-1] = (short) '\0'; len--; } } } priv->text_len = len; ptr = priv->enteredText; len = gf_utf8_wcstombs(tmp_utf8, 5000, &ptr); if (inText->buffer) gf_free(inText->buffer); inText->buffer = (char*)gf_malloc(sizeof(char) * (len+1)); memcpy(inText->buffer, tmp_utf8, sizeof(char) * len); inText->buffer[len] = 0; field1->eventType = 1; } } gf_term_lock_compositor(priv->scene->root_od->term, 1); /*apply it*/ i=0; while ((st = (ISStack*)gf_list_enum(priv->is_nodes, &i))) { assert(st->is); assert(st->mo); if (!st->is->enabled) continue; count = gf_list_count(st->is->buffer.commandList); scene_time = gf_scene_get_time(priv->scene); for (j=0; j<count; j++) { GF_Command *com = (GF_Command *)gf_list_get(st->is->buffer.commandList, j); GF_FieldInfo *field = (GF_FieldInfo *)gf_list_get(priv->ddf, j); GF_CommandField *info = (GF_CommandField *)gf_list_get(com->command_fields, 0); if (info && field && field->eventType) { gf_sg_vrml_field_copy(info->field_ptr, field->far_ptr, field->fieldType); gf_sg_command_apply(priv->scene->graph, com, scene_time); } } } gf_term_lock_compositor(priv->scene->root_od->term, 0); return e; }