📄 lsr_dec.c
字号:
color->type = SVG_COLOR_RGBCOLOR;}static void lsr_read_line_increment_type(GF_LASeRCodec *lsr, SVG_Number *li, const char *name){ u32 val; GF_LSR_READ_INT(lsr, val, 1, "choice"); if (val==1) { GF_LSR_READ_INT(lsr, val, 1, "type"); if (val==1) li->type=SVG_NUMBER_INHERIT; else li->type=SVG_NUMBER_AUTO; } else { li->value = lsr_read_fixed_16_8(lsr, "line-increment-value"); }}static void lsr_read_byte_align_string(GF_LASeRCodec *lsr, char **str, const char *name){ u32 len; gf_bs_align(lsr->bs); len = lsr_read_vluimsbf8(lsr, "len"); if (str) { if (*str) free(*str); *str = NULL; if (len) { if (len > gf_bs_available(lsr->bs) ) { lsr->last_error = GF_NON_COMPLIANT_BITSTREAM; return; } *str = (char*)malloc(sizeof(char)*(len+1)); gf_bs_read_data(lsr->bs, *str, len); (*str) [len] = 0; } } else { while (len) { gf_bs_read_int(lsr->bs, 8); len--; } } GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[LASeR] %s\t\t%d\t\t%s\n", name, 8*len, *str));}static void lsr_read_text_content(GF_LASeRCodec *lsr, GF_Node *elt){ char *str = NULL; lsr_read_byte_align_string(lsr, &str, "textContent"); if (!str) return; gf_dom_add_text_node(elt, str);}static void lsr_read_byte_align_string_list(GF_LASeRCodec *lsr, GF_List *l, const char *name, Bool is_iri){ XMLRI *iri; char *text, *sep, *sep2, *cur; while (gf_list_count(l)) { char *str = (char *)gf_list_last(l); gf_list_rem_last(l); free(str); } text = NULL; lsr_read_byte_align_string(lsr, &text, name); cur = text; while (cur) { sep = strchr(cur, '\''); if (!sep) { if (is_iri) { GF_SAFEALLOC(iri, XMLRI); iri->string = strdup(cur); iri->type = XMLRI_STRING; gf_list_add(l, iri); } else { gf_list_add(l, strdup(cur)); } break; } sep2 = strchr(sep + 1, '\''); if (!sep2) { if (is_iri) { GF_SAFEALLOC(iri, XMLRI); iri->string = strdup(cur); iri->type = XMLRI_STRING; gf_list_add(l, iri); } else { gf_list_add(l, strdup(cur)); } break; } sep2[0] = 0; if (is_iri) { GF_SAFEALLOC(iri, XMLRI); iri->string = strdup(sep+1); iri->type = XMLRI_STRING; gf_list_add(l, iri); } else { gf_list_add(l, strdup(sep+1)); } sep2[0] = '\''; cur = sep2 + 1; } free(text);}static void lsr_read_any_uri(GF_LASeRCodec *lsr, XMLRI *iri, const char *name){ u32 val; GF_LSR_READ_INT(lsr, val, 1, "hasUri"); if (val) { char *s = NULL; iri->type=XMLRI_STRING; if (iri->string) { free(iri->string); iri->string = NULL; } lsr_read_byte_align_string(lsr, &s, "uri"); GF_LSR_READ_INT(lsr, val, 1, "hasData"); if (!val) { iri->string = s; } else { u32 len_rad, len; len = lsr_read_vluimsbf5(lsr, "len"); len_rad = s ? strlen(s) : 0; iri->string = (char*)malloc(sizeof(char)*(len_rad+1+len+1)); iri->string[0] = 0; if (s) { strcpy(iri->string, s); free(s); } strcat(iri->string, ","); gf_bs_read_data(lsr->bs, iri->string + len_rad + 1, len); iri->string[len_rad + 1 + len] = 0; } } GF_LSR_READ_INT(lsr, val, 1, "hasID"); if (val) lsr_read_codec_IDREF(lsr, iri, "idref"); GF_LSR_READ_INT(lsr, val, 1, "hasStreamID"); if (val) { iri->type = XMLRI_STREAMID; iri->lsr_stream_id = lsr_read_vluimsbf5(lsr, name); GF_LSR_READ_INT(lsr, val, 1, "reserved"); if (val) { u32 len = lsr_read_vluimsbf5(lsr, "len"); GF_LSR_READ_INT(lsr, val, len, "reserved"); } }}static void lsr_read_paint(GF_LASeRCodec *lsr, SVG_Paint *paint, const char *name){ u32 val; GF_LSR_READ_INT(lsr, val, 1, "hasIndex"); if (val) { GF_LSR_READ_INT(lsr, val, lsr->colorIndexBits, name); lsr_get_color(lsr, val, &paint->color); paint->type = SVG_PAINT_COLOR; paint->color.type = 0; } else { GF_LSR_READ_INT(lsr, val, 2, "enum"); switch (val) { case 0: GF_LSR_READ_INT(lsr, val, 2, "choice"); switch (val) { case 0: paint->type = SVG_PAINT_INHERIT; break; case 1: paint->type = SVG_PAINT_COLOR; paint->color.type = SVG_COLOR_CURRENTCOLOR; break; default: paint->type = SVG_PAINT_NONE; break; } break; case 1: { XMLRI iri; memset(&iri, 0, sizeof(XMLRI)); iri.type = 0xFF; lsr_read_any_uri(lsr, &iri, name); gf_svg_unregister_iri(lsr->sg, &iri); paint->type = SVG_PAINT_URI; if (iri.string) { paint->type = SVG_PAINT_URI; paint->iri.type = XMLRI_STRING; paint->iri.string = iri.string; } else if (iri.target) { paint->iri.type = XMLRI_ELEMENTID; paint->iri.target = iri.target; } } break; case 2: { char *sysPaint=NULL; lsr_read_byte_align_string(lsr, &sysPaint, "systemsPaint"); if (sysPaint) { paint->type = SVG_PAINT_COLOR; paint->color.type = gf_svg_get_system_paint_server_type(sysPaint); free(sysPaint); } } break; case 3: lsr_read_extension(lsr, name); break; } }}static void lsr_read_string_attribute(GF_LASeRCodec *lsr, GF_Node *elt, u32 tag, char *name){ u32 val; GF_LSR_READ_INT(lsr, val, 1, name); if (val) { GF_FieldInfo info; lsr->last_error = gf_svg_get_attribute_by_tag(elt, tag, 1, 0, &info); lsr_read_byte_align_string(lsr, info.far_ptr, name); }}static void lsr_read_id(GF_LASeRCodec *lsr, GF_Node *n){ GF_FieldInfo info; u32 val, id, i, count; char *name; GF_LSR_READ_INT(lsr, val, 1, "has_id"); if (!val) return; name = NULL; id = 1+lsr_read_vluimsbf5(lsr, "ID"); gf_node_set_id(n, id, name); GF_LSR_READ_INT(lsr, val, 1, "reserved"); /*currently not used*/ if (val) { u32 len = lsr_read_vluimsbf5(lsr, "len"); GF_LSR_READ_INT(lsr, val, len, "reserved"); } /*update all pending HREFs*/ count = gf_list_count(lsr->defered_hrefs); for (i=0; i<count; i++) { XMLRI *href = (XMLRI *)gf_list_get(lsr->defered_hrefs, i); char *str_id = href->string; if (str_id[0] == '#') str_id++; /*skip 'N'*/ str_id++; if (id == (1 + (u32) atoi(str_id))) { href->target = (SVG_Element*) n; free(href->string); href->string = NULL; gf_list_rem(lsr->defered_hrefs, i); i--; count--; } } /*update unresolved listeners*/ count = gf_list_count(lsr->defered_listeners); for (i=0; i<count; i++) { GF_Node *par; XMLRI *observer = NULL; GF_Node *listener = (GF_Node *)gf_list_get(lsr->defered_listeners, i); par = NULL; if (gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_observer, 0, 0, &info) == GF_OK) { observer = (XMLRI*)info.far_ptr; if (observer->type == XMLRI_ELEMENTID) { if (!observer->target) continue; else par = observer->target; } } if (gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_listener_target, 0, 0, &info) == GF_OK) { if (((XMLRI*)info.far_ptr)->type == XMLRI_ELEMENTID) { if (!((XMLRI*)info.far_ptr)->target) continue; else if (!par) par = ((XMLRI*)info.far_ptr)->target; } } /*FIXME - double check with XML events*/ if (!par && !observer) { if (gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_event, 0, 0, &info) == GF_OK) { XMLEV_Event *ev = (XMLEV_Event *)info.far_ptr; /*all non-UI get attched to root*/ if (ev && (ev->type>GF_EVENT_MOUSEWHEEL)) { par = (GF_Node*) lsr->current_root; } } } assert(par); gf_dom_listener_add(par, listener); gf_list_rem(lsr->defered_listeners, i); i--; count--; } /*update all pending animations*/ count = gf_list_count(lsr->defered_anims); for (i=0; i<count; i++) { SVG_Element *elt = (SVG_Element *)gf_list_get(lsr->defered_anims, i); if (lsr_setup_smil_anim(lsr, elt, NULL)) { gf_list_rem(lsr->defered_anims, i); i--; count--; gf_node_init((GF_Node*)elt); } }}static Fixed lsr_translate_coords(GF_LASeRCodec *lsr, u32 val, u32 nb_bits){#ifdef GPAC_FIXED_POINT if (val >> (nb_bits-1) ) { s32 neg = (s32) val - (1<<nb_bits); if (neg < -FIX_ONE / 2) return 2 * gf_divfix(INT2FIX(neg/2), lsr->res_factor); return gf_divfix(INT2FIX(neg), lsr->res_factor); } else { if (val > FIX_ONE / 2) return 2 * gf_divfix(INT2FIX(val/2), lsr->res_factor); return gf_divfix(INT2FIX(val), lsr->res_factor); }#else if (val >> (nb_bits-1) ) { s32 neg = (s32) val - (1<<nb_bits); return gf_divfix(INT2FIX(neg), lsr->res_factor); } else { return gf_divfix(INT2FIX(val), lsr->res_factor); }#endif}static Fixed lsr_translate_scale(GF_LASeRCodec *lsr, u32 val){ if (val >> (lsr->coord_bits-1) ) { s32 v = val - (1<<lsr->coord_bits); return INT2FIX(v) / 256 ; } else { return INT2FIX(val) / 256; }}static void lsr_read_matrix(GF_LASeRCodec *lsr, SVG_Transform *mx){ u32 flag; gf_mx2d_init(mx->mat); mx->is_ref = 0; GF_LSR_READ_INT(lsr, flag, 1, "isNotMatrix"); if (flag) { GF_LSR_READ_INT(lsr, flag, 1, "isRef"); if (flag) { GF_LSR_READ_INT(lsr, flag, 1, "hasXY"); if (flag) { mx->mat.m[2] = lsr_read_fixed_16_8(lsr, "valueX"); mx->mat.m[5] = lsr_read_fixed_16_8(lsr, "valueY"); } } else { lsr_read_extension(lsr, "ext"); } } else { lsr->coord_bits += lsr->scale_bits; GF_LSR_READ_INT(lsr, flag, 1, "xx_yy_present"); if (flag) { GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "xx"); mx->mat.m[0] = lsr_translate_scale(lsr, flag); GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "yy"); mx->mat.m[4] = lsr_translate_scale(lsr, flag); } else { mx->mat.m[0] = mx->mat.m[4] = FIX_ONE; } GF_LSR_READ_INT(lsr, flag, 1, "xy_yx_present"); if (flag) { GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "xy"); mx->mat.m[1] = lsr_translate_scale(lsr, flag); GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "yx"); mx->mat.m[3] = lsr_translate_scale(lsr, flag); } lsr->coord_bits -= lsr->scale_bits; GF_LSR_READ_INT(lsr, flag, 1, "xz_yz_present"); if (flag) { GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "xz"); mx->mat.m[2] = lsr_translate_coords(lsr, flag, lsr->coord_bits); GF_LSR_READ_INT(lsr, flag, lsr->coord_bits, "yz"); mx->mat.m[5] = lsr_translate_coords(lsr, flag, lsr->coord_bits); } }}static Fixed lsr_read_fixed_clamp(GF_LASeRCodec *lsr, const char *name){ s32 val; GF_LSR_READ_INT(lsr, val, 8, name); return INT2FIX(val) / 255;}static void lsr_read_focus(GF_LASeRCodec *lsr, SVG_Focus *foc, const char *name){ u32 flag; if (foc->target.string) { free(foc->target.string); foc->target.string = NULL; } if (foc->target.target) foc->target.target = NULL; gf_svg_unregister_iri(lsr->sg, &foc->target); GF_LSR_READ_INT(lsr, flag, 1, "isEnum"); if (flag) { GF_LSR_READ_INT(lsr, foc->type, 1, "enum"); } else { foc->type = SVG_FOCUS_IRI; lsr_read_codec_IDREF(lsr, &foc->target, "id"); }}static void lsr_restore_base(GF_LASeRCodec *lsr, SVG_Element *elt, SVG_Element *base, Bool reset_fill, Bool reset_stroke){ GF_Err e; GF_FieldInfo f_base, f_clone; SVGAttribute *att; /*clone all propertie from base*/ att = base->attributes; while (att) { Bool is_fill, is_stroke; is_fill = is_stroke = 0; switch (att->tag) { /*for all properties*/ case TAG_SVG_ATT_fill: is_fill = 1; break; case TAG_SVG_ATT_stroke: is_stroke = 1; break; case TAG_SVG_ATT_audio_level: case TAG_SVG_ATT_color: case TAG_SVG_ATT_color_rendering: case TAG_SVG_ATT_display: case TAG_SVG_ATT_display_align: case TAG_SVG_ATT_fill_opacity: case TAG_SVG_ATT_fill_rule: case TAG_SVG_ATT_font_family: case TAG_SVG_ATT_font_size: case TAG_SVG_ATT_font_style: case TAG_SVG_ATT_font_variant: case TAG_SVG_ATT_font_weight: case TAG_SVG_ATT_image_rendering: case TAG_SVG_ATT_line_increment: case TAG_SVG_ATT_opacity: case TAG_SVG_ATT_pointer_events: case TAG_SVG_ATT_shape_rendering: case TAG_SVG_ATT_solid_color: case TAG_SVG_ATT_solid_opacity: case TAG_SVG_ATT_stop_color: case TAG_SVG_ATT_stop_opacity: case TAG_SVG_ATT_stroke_dasharray: case TAG_SVG_ATT_stroke_dashoffset: case TAG_SVG_ATT_stroke_linecap: case TAG_SVG_ATT_stroke_linejoin: case TAG_SVG_ATT_stroke_miterlimit:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -