📄 lsr_enc.c
字号:
GF_LSR_WRITE_INT(lsr, LSR_EVT_mousemove, 6, "event"); break; case GF_EVENT_MOUSEOUT: GF_LSR_WRITE_INT(lsr, LSR_EVT_mouseout, 6, "event"); break; case GF_EVENT_MOUSEOVER: GF_LSR_WRITE_INT(lsr, LSR_EVT_mouseover, 6, "event"); break; case GF_EVENT_MOUSEUP: GF_LSR_WRITE_INT(lsr, LSR_EVT_mouseup, 6, "event"); break; case GF_EVENT_PAUSE: GF_LSR_WRITE_INT(lsr, LSR_EVT_pause, 6, "event"); break; case GF_EVENT_PAUSED_EVENT: GF_LSR_WRITE_INT(lsr, LSR_EVT_pausedEvent, 6, "event"); break; case GF_EVENT_PLAY: GF_LSR_WRITE_INT(lsr, LSR_EVT_play, 6, "event"); break; case GF_EVENT_REPEAT_EVENT: GF_LSR_WRITE_INT(lsr, LSR_EVT_repeatEvent, 6, "event"); break; case GF_EVENT_REPEAT_KEY: GF_LSR_WRITE_INT(lsr, LSR_EVT_repeatKey, 6, "event"); break; case GF_EVENT_RESIZE: GF_LSR_WRITE_INT(lsr, LSR_EVT_resize, 6, "event"); break; case GF_EVENT_RESUME_EVENT: GF_LSR_WRITE_INT(lsr, LSR_EVT_resumedEvent, 6, "event"); break; case GF_EVENT_SCROLL: GF_LSR_WRITE_INT(lsr, LSR_EVT_scroll, 6, "event"); break; case GF_EVENT_SHORT_ACCESSKEY: GF_LSR_WRITE_INT(lsr, LSR_EVT_shortAccessKey, 6, "event"); break; case GF_EVENT_TEXTINPUT: GF_LSR_WRITE_INT(lsr, LSR_EVT_textinput, 6, "event"); break; case GF_EVENT_UNLOAD: GF_LSR_WRITE_INT(lsr, LSR_EVT_unload, 6, "event"); break; case GF_EVENT_ZOOM: GF_LSR_WRITE_INT(lsr, LSR_EVT_zoom, 6, "event"); break; default: GF_LOG(GF_LOG_WARNING, GF_LOG_CODING, ("[LASeR] Unsupported LASER event %d\n", evtType) ); GF_LSR_WRITE_INT(lsr, 0, 6, "event"); break; return; } switch (evtType) { case GF_EVENT_KEYDOWN: if (!evtParam) break; case GF_EVENT_LONGKEYPRESS: case GF_EVENT_REPEAT_KEY: case GF_EVENT_SHORT_ACCESSKEY: lsr_write_vluimsbf5(lsr, dom_to_lsr_key(evtParam), "keyCode"); break; } }}static void lsr_write_smil_time(GF_LASeRCodec *lsr, SMIL_Time *t){ s32 now; if (t->type==GF_SMIL_TIME_EVENT) { GF_LSR_WRITE_INT(lsr, 1, 1, "hasEvent"); if (t->element && gf_node_get_id((GF_Node*)t->element) ) { XMLRI iri; GF_LSR_WRITE_INT(lsr, 1, 1, "hasIdentifier"); iri.string = NULL; iri.type = XMLRI_ELEMENTID; iri.target = t->element; lsr_write_codec_IDREF(lsr, &iri, "idref"); } else { GF_LSR_WRITE_INT(lsr, 0, 1, "hasIdentifier"); } lsr_write_event_type(lsr, t->event.type, t->event.parameter); } else { GF_LSR_WRITE_INT(lsr, 0, 1, "hasEvent"); } if (!t->clock) { GF_LSR_WRITE_INT(lsr, 0, 1, "hasClock"); return; } GF_LSR_WRITE_INT(lsr, 1, 1, "hasClock"); now = (s32) (t->clock * lsr->time_resolution); if (now<0) { now = -now; GF_LSR_WRITE_INT(lsr, 1, 1, "sign"); } else { GF_LSR_WRITE_INT(lsr, 0, 1, "sign"); } lsr_write_vluimsbf5(lsr, now, "value");}static void lsr_write_smil_times(GF_LASeRCodec *lsr, GF_List **l, const char *name, Bool skipable){ SMIL_Time *v; u32 r_count, i, count; Bool indef = 0; count = l ? gf_list_count(*l) : 0; r_count = 0; for (i=0; i<count; i++) { v = (SMIL_Time*)gf_list_get(*l, i); if (v->type==GF_SMIL_TIME_INDEFINITE) { indef = 1; break; } else if (v->type!=GF_SMIL_TIME_EVENT_RESOLVED) r_count++; } if (skipable && !r_count && !indef) { GF_LSR_WRITE_INT(lsr, 0, 1, name); return; } if (skipable) GF_LSR_WRITE_INT(lsr, 1, 1, name); GF_LSR_WRITE_INT(lsr, indef, 1, "choice"); if (indef) return; lsr_write_vluimsbf5(lsr, r_count, "count"); for (i=0; i<count; i++) { v = (SMIL_Time*)gf_list_get(*l, i); lsr_write_smil_time(lsr, v); }}static void lsr_write_duration_ex(GF_LASeRCodec *lsr, SMIL_Duration *v, const char *name, Bool skipable){ if (skipable) { if (!v || !v->type) { GF_LSR_WRITE_INT(lsr, 0, 1, name); return; } GF_LSR_WRITE_INT(lsr, 1, 1, name); } if (v->type==SMIL_DURATION_DEFINED) { s32 now = (s32) (v->clock_value * lsr->time_resolution); GF_LSR_WRITE_INT(lsr, 0, 1, "choice"); GF_LSR_WRITE_INT(lsr, (now<0) ? 1 : 0, 1, "sign"); if (now<0) now = -now; lsr_write_vluimsbf5(lsr, now, "value"); } else { GF_LSR_WRITE_INT(lsr, 1, 1, "choice"); GF_LSR_WRITE_INT(lsr, v->type, 2, "time"); }}#define lsr_write_duration(a, b, c) lsr_write_duration_ex(a, b, c, 1)static void lsr_write_focus(GF_LASeRCodec *lsr, SVG_Focus *foc, const char *name){ if (foc->type==SVG_FOCUS_IRI) { GF_LSR_WRITE_INT(lsr, 0, 1, "isEnum"); lsr_write_codec_IDREF(lsr, &foc->target, "id"); } else { GF_LSR_WRITE_INT(lsr, 1, 1, "isEnum"); GF_LSR_WRITE_INT(lsr, foc->type, 1, "enum"); }}static Bool lsr_elt_has_same_base(GF_LASeRCodec *lsr, SVGAllAttributes *atts, SVG_Element *base, Bool *same_fill, Bool *same_stroke, Bool no_stroke_check){ SVGAllAttributes base_atts; GF_FieldInfo info, base_info; if (same_stroke) *same_stroke = 0; if (same_fill) *same_fill = 0; if (!base) return 0; gf_svg_flatten_attributes(base, &base_atts); if (atts->externalResourcesRequired != base_atts.externalResourcesRequired) return 0; info.fieldType = base_info.fieldType = SVG_Paint_datatype; info.far_ptr = atts->stroke; base_info.far_ptr = base_atts.stroke; /*check stroke color*/ if (!gf_svg_attributes_equal(&info, &base_info)) { if (!no_stroke_check) return 0; } else { if (same_stroke) *same_stroke = 1; } if (same_fill) { info.fieldType = base_info.fieldType = SVG_Paint_datatype; info.far_ptr = atts->fill; base_info.far_ptr = base_atts.fill; /*check stroke color*/ *same_fill = gf_svg_attributes_equal(&info, &base_info) ? 1 : 0; } switch (gf_node_get_tag((GF_Node*) base)) { /*check path length*/ case TAG_SVG_path: info.fieldType = base_info.fieldType = SVG_Number_datatype; info.far_ptr = atts->pathLength; base_info.far_ptr = base_atts.pathLength; if (!gf_svg_attributes_equal(&info, &base_info)) return 0; break; /*check rx and ry for rect*/ case TAG_SVG_rect: info.fieldType = base_info.fieldType = SVG_Length_datatype; info.far_ptr = atts->rx; base_info.far_ptr = base_atts.rx; if (!gf_svg_attributes_equal(&info, &base_info)) return 0; info.fieldType = base_info.fieldType = SVG_Length_datatype; info.far_ptr = atts->ry; base_info.far_ptr = base_atts.ry; if (!gf_svg_attributes_equal(&info, &base_info)) return 0; break; /*check x and y for use*/ case TAG_SVG_use: info.fieldType = base_info.fieldType = SVG_Coordinate_datatype; info.far_ptr = atts->x; base_info.far_ptr = base_atts.x; if (!gf_svg_attributes_equal(&info, &base_info)) return 0; info.fieldType = base_info.fieldType = SVG_Coordinate_datatype; info.far_ptr = atts->y; base_info.far_ptr = base_atts.y; if (!gf_svg_attributes_equal(&info, &base_info)) return 0; break; /*check editable and rotate for text*/ case TAG_SVG_text: info.fieldType = base_info.fieldType = SVG_Boolean_datatype; info.far_ptr = atts->editable; base_info.far_ptr = base_atts.editable; if (!gf_svg_attributes_equal(&info, &base_info)) return 0; info.fieldType = base_info.fieldType = SVG_Numbers_datatype; info.far_ptr = atts->text_rotate; base_info.far_ptr = base_atts.text_rotate; if (!gf_svg_attributes_equal(&info, &base_info)) return 0; break; } return gf_lsr_same_rare(atts, &base_atts);}static Bool lsr_float_list_equal(GF_List *l1, GF_List *l2){ u32 i, count = gf_list_count(l1); if (count != gf_list_count(l2)) return 0; for (i=0;i<count;i++) { Fixed *v1 = (Fixed *)gf_list_get(l1, i); Fixed *v2 = (Fixed *)gf_list_get(l2, i); if (*v1 != *v2) return 0; } return 1;}static void lsr_write_rare(GF_LASeRCodec *lsr, GF_Node *n){ u32 i, nb_rare; s32 field_rare; SVGAttribute *att; nb_rare = 0; att = ((SVG_Element*)n)->attributes; while (att) { field_rare = gf_lsr_rare_type_from_attribute(att->tag); if (field_rare>=0) nb_rare++; att = att->next; } GF_LSR_WRITE_INT(lsr, nb_rare ? 1 : 0, 1, "has_rare"); if (!nb_rare) return; GF_LSR_WRITE_INT(lsr, nb_rare, 6, "nbOfAttributes"); att = ((SVG_Element*)n)->attributes; while (att) { field_rare = gf_lsr_rare_type_from_attribute(att->tag); if (field_rare==-1) { att = att->next; continue; } /*RARE extension*/ if (field_rare==49) { Bool is_string = 0; u32 size, cur_bits; u32 len = 2+3; switch (att->tag) { case TAG_SVG_ATT_syncMaster: len +=1; break; case TAG_SVG_ATT_requiredFonts: len += 8*strlen(*(SVG_String*)att->data); /*get vluimsbf5 field size with one extra word (4 bits, enough to code string alignment)*/ size = lsr_get_vluimsbf5_size(len, 1); cur_bits = gf_bs_get_bit_position(lsr->bs) + lsr->info->cfg.extensionIDBits + size + 5; /*count string alignment*/ while (cur_bits%8) { len++; cur_bits++; } is_string = 1; break; default: len +=2; break; } GF_LSR_WRITE_INT(lsr, 49, 6, "attributeRARE"); GF_LSR_WRITE_INT(lsr, 2, lsr->info->cfg.extensionIDBits, "extensionID"); if (is_string) { lsr_write_vluimsbf5_ex(lsr, len, 1, "len"); } else { lsr_write_vluimsbf5(lsr, len, "len"); } GF_LSR_WRITE_INT(lsr, 1, 2, "nbOfAttributes"); switch (att->tag) { case TAG_SVG_ATT_syncMaster: GF_LSR_WRITE_INT(lsr, 0, 3, "attributeRARE"); GF_LSR_WRITE_INT(lsr, *(SVG_Boolean *)att->data ? 1 : 0, 1, "syncMaster"); break; case TAG_SVG_ATT_focusHighlight: GF_LSR_WRITE_INT(lsr, 1, 3, "attributeRARE"); GF_LSR_WRITE_INT(lsr, *(SVG_FocusHighlight*)att->data, 2, "focusHighlight"); break; case TAG_SVG_ATT_initialVisibility: GF_LSR_WRITE_INT(lsr, 2, 3, "attributeRARE"); GF_LSR_WRITE_INT(lsr, *(SVG_InitialVisibility*)att->data, 2, "initialVisibility"); break; case TAG_SVG_ATT_fullscreen: GF_LSR_WRITE_INT(lsr, 3, 3, "attributeRARE"); GF_LSR_WRITE_INT(lsr, *(SVG_Boolean *)att->data ? 1 : 0, 2, "fullscreen"); break; case TAG_SVG_ATT_requiredFonts: GF_LSR_WRITE_INT(lsr, 4, 3, "attributeRARE"); lsr_write_byte_align_string(lsr, *(SVG_String*)att->data, "requiredFonts"); break; } GF_LSR_WRITE_INT(lsr, 0, 1, "hasNextExtension"); att = att->next; continue; } GF_LSR_WRITE_INT(lsr, (u32)field_rare, 6, "attributeRARE"); switch (att->tag) { case TAG_SVG_ATT__class: lsr_write_byte_align_string(lsr, *(SVG_String *)att->data, "class"); break; case TAG_SVG_ATT_audio_level: lsr_write_fixed_clamp(lsr, ((SVG_Number *) att->data)->value, "audio-level"); break; case TAG_SVG_ATT_color: lsr_write_paint(lsr, (SVG_Paint*) att->data, "color"); break; case TAG_SVG_ATT_color_rendering: GF_LSR_WRITE_INT(lsr, *(SVG_RenderingHint*)att->data, 2, "color-rendering"); break; case TAG_SVG_ATT_display: GF_LSR_WRITE_INT(lsr, *(SVG_Display*)att->data, 5, "display"); break; case TAG_SVG_ATT_display_align: GF_LSR_WRITE_INT(lsr, *(SVG_DisplayAlign*)att->data, 3, "display-align"); break; case TAG_SVG_ATT_fill_opacity: lsr_write_fixed_clamp(lsr, ((SVG_Number *)att->data)->value, "fill-opacity"); break; case TAG_SVG_ATT_fill_rule: GF_LSR_WRITE_INT(lsr, *(SVG_FillRule*)att->data, 2, "fill-rule"); break; case TAG_SVG_ATT_image_rendering: GF_LSR_WRITE_INT(lsr, *(SVG_RenderingHint*)att->data, 2, "image-rendering"); break; case TAG_SVG_ATT_line_increment: lsr_write_line_increment_type(lsr, (SVG_Number*)att->data, "lineIncrement"); break; case TAG_SVG_ATT_pointer_events: GF_LSR_WRITE_INT(lsr, *(SVG_PointerEvents*)att->data, 4, "pointer-events"); break; case TAG_SVG_ATT_shape_rendering: GF_LSR_WRITE_INT(lsr, *(SVG_RenderingHint*)att->data, 3, "shape-rendering"); break; case TAG_SVG_ATT_solid_color: lsr_write_paint(lsr, (SVG_Paint*)att->data, "solid-color"); break; case TAG_SVG_ATT_solid_opacity: lsr_write_fixed_clamp(lsr, ((SVG_Number *)att->data)->value, "solid-opacity"); break; case TAG_SVG_ATT_stop_color: lsr_write_paint(lsr, (SVG_Paint*)att->data, "stop-color"); break; case TAG_SVG_ATT_stop_opacity: lsr_write_fixed_clamp(lsr, ((SVG_Number *)att->data)->value, "stop-opacity"); break; case TAG_SVG_ATT_stroke_dasharray: { u32 j; SVG_StrokeDashArray *da = (SVG_StrokeDashArray*)att->data; if (da->type==SVG_STROKEDASHARRAY_INHERIT) { GF_LSR_WRITE_INT(lsr, 1, 1, "dashArray"); } else { GF_LSR_WRITE_INT(lsr, 0, 1, "dashArray"); lsr_write_vluimsbf5(lsr, da->array.count, "len"); for (j=0; j<da->array.count; j++) { lsr_write_fixed_16_8(lsr, da->array.vals[j], "dash"); } } } break; case TAG_SVG_ATT_stroke_dashoffset: lsr_write_fixed_16_8i(lsr, (SVG_Number*)att->data, "dashOffset"); break; case TAG_SVG_ATT_stroke_linecap: GF_LSR_WRITE_INT(lsr, *(SVG_StrokeLineCap*)att->data, 2, "stroke-linecap"); break; case TAG_SVG_ATT_stroke_linejoin: GF_LSR_WRITE_INT(lsr, *(SVG_StrokeLineJoin*)att->data, 2, "stroke-linejoin"); break; case TAG_SVG_ATT_stroke_miterlimit: lsr_write_fixed_16_8i(lsr, (SVG_Number*)att->data, "miterLimit"); break; case TAG_SVG_ATT_stroke_opacity: lsr_write_fixed_clamp(lsr, ((SVG_Number *)att->data)->value, "stroke-opacity"); break; case TAG_SVG_ATT_stroke_width: lsr_write_fixed_16_8i(lsr, (SVG_Number*)att->data, "strokeWidth"); break; case TAG_SVG_ATT_text_anchor: GF_LSR_WRITE_INT(lsr, *(SVG_TextAnchor*)att->data, 2, "text-achor"); break; case TAG_SVG_ATT_text_rendering: GF_LSR_WRITE_INT(lsr, *(SVG_RenderingHint*)att->data, 3, "text-rendering"); break; case TAG_SVG_ATT_viewport_fill: lsr_write_paint(lsr, (SVG_Paint*)att->data, "viewport-fill"); break; case TAG_SVG_ATT_viewport_fill_opacity: lsr_write_fixed_clamp(lsr, ((SVG_Number *)att->data)->value, "viewport-fill-opacity"); break; case TAG_SVG_ATT_vector_effect: GF_LSR_WRITE_INT(lsr, *(SVG_VectorEffect*)att->data, 4, "vector-effect"); break; case TAG_SVG_ATT_visibility: GF_LSR_WRITE_INT(lsr, *(SVG_PointerEvents*)att->data, 2, "visibility"); break; case TAG_SVG_ATT_requiredExtensions: lsr_write_byte_align_string_list(lsr, *(GF_List **)att->data, "requiredExtensions", 1); break; case TAG_SVG_ATT_requiredFormats: lsr_write_byte_align_string_list(lsr, *(GF_List **)att->data, "requiredFormats", 0); break; case TAG_SVG_ATT_requiredFeatures: { GF_List *l = *(GF_List **)att->data; u32 j, tot_count, count = gf_list_count(l); u8 *vals = (u8*)malloc(sizeof(u8)*count); tot_count = 0; for (i=0; i<count; i++) { char *ext; XMLRI *iri = (XMLRI*)gf_list_get(l, i); if (iri->type != XMLRI_STRING) continue; ext = strchr(iri->string, '#'); if (!ext) continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -