LCOV - code coverage report
Current view: top level - scenegraph - svg_properties.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 936 1103 84.9 %
Date: 2021-04-29 23:48:07 Functions: 9 9 100.0 %

          Line data    Source code
       1             : /*
       2             :  *                                      GPAC Multimedia Framework
       3             :  *
       4             :  *                      Authors: Cyril Concolato, Jean Le Feuvre
       5             :  *                      Copyright (c) Telecom ParisTech 2004-2012
       6             :  *                                      All rights reserved
       7             :  *
       8             :  *  This file is part of GPAC / SVG Loader module
       9             :  *
      10             :  *  GPAC is free software; you can redistribute it and/or modify
      11             :  *  it under the terms of the GNU Lesser General Public License as published by
      12             :  *  the Free Software Foundation; either version 2, or (at your option)
      13             :  *  any later version.
      14             :  *
      15             :  *  GPAC is distributed in the hope that it will be useful,
      16             :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      17             :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      18             :  *  GNU Lesser General Public License for more details.
      19             :  *
      20             :  *  You should have received a copy of the GNU Lesser General Public
      21             :  *  License along with this library; see the file COPYING.  If not, write to
      22             :  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
      23             :  *
      24             :  */
      25             : 
      26             : #include <gpac/scenegraph_svg.h>
      27             : 
      28             : #ifndef GPAC_DISABLE_SVG
      29             : 
      30             : #include <gpac/internal/scenegraph_dev.h>
      31             : #include <gpac/nodes_svg.h>
      32             : /*
      33             :         Initialization of properties at the top level before any rendering
      34             :         The value shall not use the 'inherit' value, it uses the initial value.
      35             :     The property values are then updated when going down the tree using svg_properties_apply
      36             : */
      37             : GF_EXPORT
      38          51 : void gf_svg_properties_init_pointers(SVGPropertiesPointers *svg_props)
      39             : {
      40          51 :         if (!svg_props) return;
      41             : 
      42          51 :         GF_SAFEALLOC(svg_props->audio_level, SVG_Number);
      43          51 :         if (svg_props->audio_level) {
      44          51 :                 svg_props->audio_level->type = SVG_NUMBER_VALUE;
      45          51 :                 svg_props->audio_level->value = FIX_ONE;
      46          51 :                 svg_props->computed_audio_level = FIX_ONE;
      47             :         }
      48             :         
      49          51 :         GF_SAFEALLOC(svg_props->color, SVG_Paint);
      50          51 :         if (svg_props->color) {
      51          51 :                 svg_props->color->type = SVG_PAINT_COLOR;
      52          51 :                 svg_props->color->color.type = SVG_COLOR_RGBCOLOR;
      53             :                 /* svg_props->color->red, green, blue set to zero, so initial value for color property is black */
      54             :         }
      55             :         
      56          51 :         GF_SAFEALLOC(svg_props->color_rendering, SVG_RenderingHint);
      57          51 :         if (svg_props->color_rendering) *svg_props->color_rendering = SVG_RENDERINGHINT_AUTO;
      58             : 
      59          51 :         GF_SAFEALLOC(svg_props->display, SVG_Display);
      60          51 :         if (svg_props->display) *svg_props->display = SVG_DISPLAY_INLINE;
      61             : 
      62          51 :         GF_SAFEALLOC(svg_props->display_align, SVG_DisplayAlign);
      63          51 :         if (svg_props->display_align) *svg_props->display_align = SVG_DISPLAYALIGN_AUTO;
      64             : 
      65          51 :         GF_SAFEALLOC(svg_props->fill, SVG_Paint);
      66          51 :         if (svg_props->fill) {
      67          51 :                 svg_props->fill->type = SVG_PAINT_COLOR;
      68          51 :                 svg_props->fill->color.type = SVG_COLOR_RGBCOLOR;
      69             :                 /* svg_props->fill->color.red, green, blue set to zero, so initial value for fill color is black */
      70             :         }
      71          51 :         GF_SAFEALLOC(svg_props->fill_opacity, SVG_Number);
      72          51 :         if (svg_props->fill_opacity) {
      73          51 :                 svg_props->fill_opacity->type = SVG_NUMBER_VALUE;
      74          51 :                 svg_props->fill_opacity->value = FIX_ONE;
      75             :         }
      76          51 :         GF_SAFEALLOC(svg_props->fill_rule, SVG_FillRule);
      77          51 :         if (svg_props->fill_rule) *svg_props->fill_rule = SVG_FILLRULE_NONZERO;
      78             : 
      79          51 :         GF_SAFEALLOC(svg_props->font_family, SVG_FontFamily);
      80          51 :         if (svg_props->font_family) {
      81          51 :                 svg_props->font_family->type = SVG_FONTFAMILY_VALUE;
      82          51 :                 svg_props->font_family->value = gf_strdup("Arial");
      83             :         }
      84          51 :         GF_SAFEALLOC(svg_props->font_size, SVG_FontSize);
      85          51 :         if (svg_props->font_size) {
      86          51 :                 svg_props->font_size->type = SVG_NUMBER_VALUE;
      87          51 :                 svg_props->font_size->value = 12*FIX_ONE;
      88             :         }
      89          51 :         GF_SAFEALLOC(svg_props->font_style, SVG_FontStyle);
      90          51 :         if (svg_props->font_style) *svg_props->font_style = SVG_FONTSTYLE_NORMAL;
      91             : 
      92          51 :         GF_SAFEALLOC(svg_props->font_variant, SVG_FontVariant);
      93          51 :         if (svg_props->font_variant) *svg_props->font_variant = SVG_FONTVARIANT_NORMAL;
      94             : 
      95          51 :         GF_SAFEALLOC(svg_props->font_weight, SVG_FontWeight);
      96          51 :         if (svg_props->font_weight) *svg_props->font_weight = SVG_FONTWEIGHT_NORMAL;
      97             : 
      98          51 :         GF_SAFEALLOC(svg_props->image_rendering, SVG_RenderingHint);
      99          51 :         if (svg_props->image_rendering) *svg_props->image_rendering = SVG_RENDERINGHINT_AUTO;
     100             : 
     101          51 :         GF_SAFEALLOC(svg_props->line_increment, SVG_Number);
     102          51 :         if (svg_props->line_increment) svg_props->line_increment->type = SVG_NUMBER_AUTO;
     103             : 
     104          51 :         GF_SAFEALLOC(svg_props->opacity, SVG_Number);
     105          51 :         if (svg_props->opacity) {
     106          51 :                 svg_props->opacity->type = SVG_NUMBER_VALUE;
     107          51 :                 svg_props->opacity->value = FIX_ONE;
     108             :         }
     109          51 :         GF_SAFEALLOC(svg_props->pointer_events, SVG_PointerEvents);
     110          51 :         if (svg_props->pointer_events) *svg_props->pointer_events = SVG_POINTEREVENTS_VISIBLEPAINTED;
     111             : 
     112          51 :         GF_SAFEALLOC(svg_props->shape_rendering, SVG_RenderingHint);
     113          51 :         if (svg_props->shape_rendering) *svg_props->shape_rendering = SVG_RENDERINGHINT_AUTO;
     114             : 
     115          51 :         GF_SAFEALLOC(svg_props->solid_color, SVG_Paint);
     116          51 :         if (svg_props->solid_color) {
     117          51 :                 svg_props->solid_color->type = SVG_PAINT_COLOR;
     118          51 :                 svg_props->solid_color->color.type = SVG_COLOR_RGBCOLOR;
     119             :                 /* svg_props->solid_color->color.red, green, blue set to zero, so initial value for solid_color is black */
     120             :         }
     121          51 :         GF_SAFEALLOC(svg_props->solid_opacity, SVG_Number);
     122          51 :         if (svg_props->solid_opacity) {
     123          51 :                 svg_props->solid_opacity->type = SVG_NUMBER_VALUE;
     124          51 :                 svg_props->solid_opacity->value = FIX_ONE;
     125             :         }
     126          51 :         GF_SAFEALLOC(svg_props->stop_color, SVG_Paint);
     127          51 :         if (svg_props->stop_color) {
     128          51 :                 svg_props->stop_color->type = SVG_PAINT_COLOR;
     129          51 :                 svg_props->stop_color->color.type = SVG_COLOR_RGBCOLOR;
     130             :                 /* svg_props->stop_color->color.red, green, blue set to zero, so initial value for stop_color is black */
     131             :         }
     132          51 :         GF_SAFEALLOC(svg_props->stop_opacity, SVG_Number);
     133          51 :         if (svg_props->stop_opacity) {
     134          51 :                 svg_props->stop_opacity->type = SVG_NUMBER_VALUE;
     135          51 :                 svg_props->stop_opacity->value = FIX_ONE;
     136             :         }
     137          51 :         GF_SAFEALLOC(svg_props->stroke, SVG_Paint);
     138          51 :         if (svg_props->stroke) {
     139          51 :                 svg_props->stroke->type = SVG_PAINT_NONE;
     140          51 :                 svg_props->stroke->color.type = SVG_COLOR_RGBCOLOR;
     141             :                 /* svg_props->stroke->color.red, green, blue set to zero, so initial value for stroke color is black */
     142             :         }
     143             :         
     144          51 :         GF_SAFEALLOC(svg_props->stroke_dasharray, SVG_StrokeDashArray);
     145          51 :         if (svg_props->stroke_dasharray) svg_props->stroke_dasharray->type = SVG_STROKEDASHARRAY_NONE;
     146             : 
     147          51 :         GF_SAFEALLOC(svg_props->stroke_dashoffset , SVG_Length);
     148          51 :         if (svg_props->stroke_dashoffset) {
     149          51 :                 svg_props->stroke_dashoffset->type = SVG_NUMBER_VALUE;
     150          51 :                 svg_props->stroke_dashoffset->value = 0;
     151             :         }
     152             :         
     153          51 :         GF_SAFEALLOC(svg_props->stroke_linecap, SVG_StrokeLineCap);
     154          51 :         if (svg_props->stroke_linecap) *svg_props->stroke_linecap = SVG_STROKELINECAP_BUTT;
     155             : 
     156          51 :         GF_SAFEALLOC(svg_props->stroke_linejoin, SVG_StrokeLineJoin);
     157          51 :         if (svg_props->stroke_linejoin) *svg_props->stroke_linejoin = SVG_STROKELINEJOIN_MITER;
     158             : 
     159          51 :         GF_SAFEALLOC(svg_props->stroke_miterlimit, SVG_Number);
     160          51 :         if (svg_props->stroke_miterlimit) {
     161          51 :                 svg_props->stroke_miterlimit->type = SVG_NUMBER_VALUE;
     162          51 :                 svg_props->stroke_miterlimit->value = 4*FIX_ONE;
     163             :         }
     164          51 :         GF_SAFEALLOC(svg_props->stroke_opacity, SVG_Number);
     165          51 :         if (svg_props->stroke_opacity) {
     166          51 :                 svg_props->stroke_opacity->type = SVG_NUMBER_VALUE;
     167          51 :                 svg_props->stroke_opacity->value = FIX_ONE;
     168             :         }
     169          51 :         GF_SAFEALLOC(svg_props->stroke_width, SVG_Length);
     170          51 :         if (svg_props->stroke_width) {
     171          51 :                 svg_props->stroke_width->type = SVG_NUMBER_VALUE;
     172          51 :                 svg_props->stroke_width->value = FIX_ONE;
     173             :         }
     174          51 :         GF_SAFEALLOC(svg_props->text_align, SVG_TextAlign);
     175          51 :         if (svg_props->text_align) *svg_props->text_align = SVG_TEXTALIGN_START;
     176             : 
     177          51 :         GF_SAFEALLOC(svg_props->text_anchor, SVG_TextAnchor);
     178          51 :         if (svg_props->text_anchor) *svg_props->text_anchor = SVG_TEXTANCHOR_START;
     179             : 
     180          51 :         GF_SAFEALLOC(svg_props->text_rendering, SVG_RenderingHint);
     181          51 :         if (svg_props->text_rendering) *svg_props->text_rendering = SVG_RENDERINGHINT_AUTO;
     182             : 
     183          51 :         GF_SAFEALLOC(svg_props->vector_effect, SVG_VectorEffect);
     184          51 :         if (svg_props->vector_effect) *svg_props->vector_effect = SVG_VECTOREFFECT_NONE;
     185             : 
     186          51 :         GF_SAFEALLOC(svg_props->viewport_fill, SVG_Paint);
     187          51 :         if (svg_props->viewport_fill) svg_props->viewport_fill->type = SVG_PAINT_NONE;
     188             : 
     189          51 :         GF_SAFEALLOC(svg_props->viewport_fill_opacity, SVG_Number);
     190          51 :         if (svg_props->viewport_fill_opacity) {
     191          51 :                 svg_props->viewport_fill_opacity->type = SVG_NUMBER_VALUE;
     192          51 :                 svg_props->viewport_fill_opacity->value = FIX_ONE;
     193             :         }
     194          51 :         GF_SAFEALLOC(svg_props->visibility, SVG_Visibility);
     195          51 :         if (svg_props->visibility) *svg_props->visibility = SVG_VISIBILITY_VISIBLE;
     196             : 
     197             : }
     198             : 
     199             : GF_EXPORT
     200          51 : void gf_svg_properties_reset_pointers(SVGPropertiesPointers *svg_props)
     201             : {
     202          51 :         if (!svg_props) return;
     203          51 :         if(svg_props->audio_level) gf_free(svg_props->audio_level);
     204          51 :         gf_svg_delete_paint(NULL, svg_props->color);
     205          51 :         if(svg_props->color_rendering) gf_free(svg_props->color_rendering);
     206          51 :         if(svg_props->display) gf_free(svg_props->display);
     207          51 :         if(svg_props->display_align) gf_free(svg_props->display_align);
     208          51 :         gf_svg_delete_paint(NULL, svg_props->fill);
     209          51 :         if(svg_props->fill_opacity) gf_free(svg_props->fill_opacity);
     210          51 :         if(svg_props->fill_rule) gf_free(svg_props->fill_rule);
     211          51 :         if(svg_props->font_family) {
     212          51 :                 if (svg_props->font_family->value) gf_free(svg_props->font_family->value);
     213          51 :                 gf_free(svg_props->font_family);
     214             :         }
     215          51 :         if(svg_props->font_size) gf_free(svg_props->font_size);
     216          51 :         if(svg_props->font_style) gf_free(svg_props->font_style);
     217          51 :         if(svg_props->font_variant) gf_free(svg_props->font_variant);
     218          51 :         if(svg_props->font_weight) gf_free(svg_props->font_weight);
     219          51 :         if(svg_props->image_rendering) gf_free(svg_props->image_rendering);
     220          51 :         if(svg_props->line_increment) gf_free(svg_props->line_increment);
     221          51 :         if(svg_props->opacity) gf_free(svg_props->opacity);
     222          51 :         if(svg_props->pointer_events) gf_free(svg_props->pointer_events);
     223          51 :         if(svg_props->shape_rendering) gf_free(svg_props->shape_rendering);
     224          51 :         gf_svg_delete_paint(NULL, svg_props->solid_color);
     225          51 :         if(svg_props->solid_opacity) gf_free(svg_props->solid_opacity);
     226          51 :         gf_svg_delete_paint(NULL, svg_props->stop_color);
     227          51 :         if(svg_props->stop_opacity) gf_free(svg_props->stop_opacity);
     228          51 :         gf_svg_delete_paint(NULL, svg_props->stroke);
     229          51 :         if(svg_props->stroke_dasharray) {
     230          51 :                 if (svg_props->stroke_dasharray->array.count) gf_free(svg_props->stroke_dasharray->array.vals);
     231          51 :                 gf_free(svg_props->stroke_dasharray);
     232             :         }
     233          51 :         if(svg_props->stroke_dashoffset) gf_free(svg_props->stroke_dashoffset);
     234          51 :         if(svg_props->stroke_linecap) gf_free(svg_props->stroke_linecap);
     235          51 :         if(svg_props->stroke_linejoin) gf_free(svg_props->stroke_linejoin);
     236          51 :         if(svg_props->stroke_miterlimit) gf_free(svg_props->stroke_miterlimit);
     237          51 :         if(svg_props->stroke_opacity) gf_free(svg_props->stroke_opacity);
     238          51 :         if(svg_props->stroke_width) gf_free(svg_props->stroke_width);
     239          51 :         if(svg_props->text_align) gf_free(svg_props->text_align);
     240          51 :         if(svg_props->text_anchor) gf_free(svg_props->text_anchor);
     241          51 :         if(svg_props->text_rendering) gf_free(svg_props->text_rendering);
     242          51 :         if(svg_props->vector_effect) gf_free(svg_props->vector_effect);
     243          51 :         gf_svg_delete_paint(NULL, svg_props->viewport_fill);
     244          51 :         if(svg_props->viewport_fill_opacity) gf_free(svg_props->viewport_fill_opacity);
     245          51 :         if(svg_props->visibility) gf_free(svg_props->visibility);
     246             :         memset(svg_props, 0, sizeof(SVGPropertiesPointers));
     247             : }
     248             : 
     249             : 
     250        2960 : void *gf_svg_get_property_pointer_from_tag(SVGPropertiesPointers *output_property_context, u32 prop_tag)
     251             : {
     252        2960 :         switch (prop_tag) {
     253           0 :         case TAG_SVG_ATT_audio_level:
     254           0 :                 return output_property_context->audio_level;
     255           0 :         case TAG_SVG_ATT_color:
     256           0 :                 return output_property_context->color;
     257         300 :         case TAG_SVG_ATT_color_rendering:
     258         300 :                 return output_property_context->color_rendering;
     259         300 :         case TAG_SVG_ATT_display:
     260         300 :                 return output_property_context->display;
     261           0 :         case TAG_SVG_ATT_display_align:
     262           0 :                 return output_property_context->display_align;
     263         450 :         case TAG_SVG_ATT_fill:
     264         450 :                 return output_property_context->fill;
     265         150 :         case TAG_SVG_ATT_fill_opacity:
     266         150 :                 return output_property_context->fill_opacity;
     267         150 :         case TAG_SVG_ATT_fill_rule:
     268         150 :                 return output_property_context->fill_rule;
     269         150 :         case TAG_SVG_ATT_font_family:
     270         150 :                 return output_property_context->font_family;
     271          92 :         case TAG_SVG_ATT_font_size:
     272          92 :                 return output_property_context->font_size;
     273         150 :         case TAG_SVG_ATT_font_style:
     274         150 :                 return output_property_context->font_style;
     275           0 :         case TAG_SVG_ATT_font_variant:
     276           0 :                 return output_property_context->font_variant;
     277         150 :         case TAG_SVG_ATT_font_weight:
     278         150 :                 return output_property_context->font_weight;
     279         150 :         case TAG_SVG_ATT_image_rendering:
     280         150 :                 return output_property_context->image_rendering;
     281           0 :         case TAG_SVG_ATT_line_increment:
     282           0 :                 return output_property_context->line_increment;
     283         468 :         case TAG_SVG_ATT_opacity:
     284         468 :                 return output_property_context->opacity;
     285           0 :         case TAG_SVG_ATT_pointer_events:
     286           0 :                 return output_property_context->pointer_events;
     287           0 :         case TAG_SVG_ATT_shape_rendering:
     288           0 :                 return output_property_context->shape_rendering;
     289         150 :         case TAG_SVG_ATT_solid_color:
     290         150 :                 return output_property_context->solid_color;
     291           0 :         case TAG_SVG_ATT_solid_opacity:
     292           0 :                 return output_property_context->solid_opacity;
     293           0 :         case TAG_SVG_ATT_stop_color:
     294           0 :                 return output_property_context->stop_color;
     295           0 :         case TAG_SVG_ATT_stop_opacity:
     296           0 :                 return output_property_context->stop_opacity;
     297           0 :         case TAG_SVG_ATT_stroke:
     298           0 :                 return output_property_context->stroke;
     299         150 :         case TAG_SVG_ATT_stroke_dasharray:
     300         150 :                 return output_property_context->stroke_dasharray;
     301           0 :         case TAG_SVG_ATT_stroke_dashoffset:
     302           0 :                 return output_property_context->stroke_dashoffset;
     303           0 :         case TAG_SVG_ATT_stroke_linecap:
     304           0 :                 return output_property_context->stroke_linecap;
     305           0 :         case TAG_SVG_ATT_stroke_linejoin:
     306           0 :                 return output_property_context->stroke_linejoin;
     307           0 :         case TAG_SVG_ATT_stroke_miterlimit:
     308           0 :                 return output_property_context->stroke_miterlimit;
     309         150 :         case TAG_SVG_ATT_stroke_opacity:
     310         150 :                 return output_property_context->stroke_opacity;
     311           0 :         case TAG_SVG_ATT_stroke_width:
     312           0 :                 return output_property_context->stroke_width;
     313           0 :         case TAG_SVG_ATT_text_align:
     314           0 :                 return output_property_context->text_align;
     315           0 :         case TAG_SVG_ATT_text_anchor:
     316           0 :                 return output_property_context->text_anchor;
     317           0 :         case TAG_SVG_ATT_text_rendering:
     318           0 :                 return output_property_context->text_rendering;
     319           0 :         case TAG_SVG_ATT_vector_effect:
     320           0 :                 return output_property_context->vector_effect;
     321           0 :         case TAG_SVG_ATT_viewport_fill:
     322           0 :                 return output_property_context->viewport_fill;
     323           0 :         case TAG_SVG_ATT_viewport_fill_opacity:
     324           0 :                 return output_property_context->viewport_fill_opacity;
     325           0 :         case TAG_SVG_ATT_visibility:
     326           0 :                 return output_property_context->visibility;
     327             :         default:
     328             :                 return NULL;
     329             :         }
     330             : }
     331             : 
     332        2960 : void *gf_svg_get_property_pointer(SVG_Element *elt, void *input_attribute,
     333             :                                   SVGPropertiesPointers *output_property_context)
     334             : {
     335        2960 :         SVGAttribute *att = elt->attributes;
     336       11838 :         while (att) {
     337        8878 :                 if (att->data == input_attribute) break;
     338        5918 :                 att = att->next;
     339             :         }
     340        2960 :         if (!att) return NULL;
     341        2960 :         return gf_svg_get_property_pointer_from_tag(output_property_context, att->tag);
     342             : }
     343             : 
     344          58 : Bool gf_svg_is_property(GF_Node *node, GF_FieldInfo *target_attribute)
     345             : {
     346          58 :         u32 tag = gf_node_get_tag(node);
     347             : 
     348          58 :         if (tag > GF_NODE_RANGE_LAST_VRML) {
     349             :                 SVG_Element *e = (SVG_Element *)node;
     350          58 :                 SVGAttribute *att = e->attributes;
     351         243 :                 while (att) {
     352         185 :                         if (att->data == target_attribute->far_ptr) break;
     353         127 :                         att = att->next;
     354             :                 }
     355          58 :                 if (!att) return 0;
     356          58 :                 switch (att->tag) {
     357             :                 case TAG_SVG_ATT_audio_level:
     358             :                 case TAG_SVG_ATT_color:
     359             :                 case TAG_SVG_ATT_color_rendering:
     360             :                 case TAG_SVG_ATT_display:
     361             :                 case TAG_SVG_ATT_display_align:
     362             :                 case TAG_SVG_ATT_fill:
     363             :                 case TAG_SVG_ATT_fill_opacity:
     364             :                 case TAG_SVG_ATT_fill_rule:
     365             :                 case TAG_SVG_ATT_font_family:
     366             :                 case TAG_SVG_ATT_font_size:
     367             :                 case TAG_SVG_ATT_font_style:
     368             :                 case TAG_SVG_ATT_font_variant:
     369             :                 case TAG_SVG_ATT_font_weight:
     370             :                 case TAG_SVG_ATT_image_rendering:
     371             :                 case TAG_SVG_ATT_line_increment:
     372             :                 case TAG_SVG_ATT_opacity:
     373             :                 case TAG_SVG_ATT_pointer_events:
     374             :                 case TAG_SVG_ATT_shape_rendering:
     375             :                 case TAG_SVG_ATT_solid_color:
     376             :                 case TAG_SVG_ATT_solid_opacity:
     377             :                 case TAG_SVG_ATT_stop_color:
     378             :                 case TAG_SVG_ATT_stop_opacity:
     379             :                 case TAG_SVG_ATT_stroke:
     380             :                 case TAG_SVG_ATT_stroke_dasharray:
     381             :                 case TAG_SVG_ATT_stroke_dashoffset:
     382             :                 case TAG_SVG_ATT_stroke_linecap:
     383             :                 case TAG_SVG_ATT_stroke_linejoin:
     384             :                 case TAG_SVG_ATT_stroke_miterlimit:
     385             :                 case TAG_SVG_ATT_stroke_opacity:
     386             :                 case TAG_SVG_ATT_stroke_width:
     387             :                 case TAG_SVG_ATT_text_align:
     388             :                 case TAG_SVG_ATT_text_anchor:
     389             :                 case TAG_SVG_ATT_text_rendering:
     390             :                 case TAG_SVG_ATT_vector_effect:
     391             :                 case TAG_SVG_ATT_viewport_fill:
     392             :                 case TAG_SVG_ATT_viewport_fill_opacity:
     393             :                 case TAG_SVG_ATT_visibility:
     394             :                         return 1;
     395          22 :                 default:
     396          22 :                         return 0;
     397             :                 }
     398             :         }
     399             :         else {
     400             :                 return 0;
     401             :         }
     402             : }
     403             : 
     404             : /* TODO: Check that all possibly inherited types are treated */
     405        1673 : Bool gf_svg_is_inherit(GF_FieldInfo *a)
     406             : {
     407        1673 :         if (!a->far_ptr) return 1;
     408             : 
     409        1670 :         switch (a->fieldType) {
     410           0 :         case SVG_Color_datatype:
     411           0 :                 return (((SVG_Color *)a->far_ptr)->type == SVG_COLOR_INHERIT);
     412             :                 break;
     413         610 :         case SVG_Paint_datatype:
     414         610 :                 return (((SVG_Paint *)a->far_ptr)->type == SVG_PAINT_INHERIT);
     415             :                 break;
     416        1026 :         case SVG_FontSize_datatype:
     417             :         case SVG_Number_datatype:
     418        1026 :                 return (((SVG_Number *)a->far_ptr)->type == SVG_NUMBER_INHERIT);
     419             :                 break;
     420           3 :         case SVG_RenderingHint_datatype:
     421           3 :                 return (*((SVG_RenderingHint *)a->far_ptr) == SVG_RENDERINGHINT_INHERIT);
     422             :                 break;
     423           2 :         case SVG_Display_datatype:
     424           2 :                 return (*((SVG_Display *)a->far_ptr) == SVG_DISPLAY_INHERIT);
     425             :                 break;
     426           1 :         case SVG_DisplayAlign_datatype:
     427           1 :                 return (*((SVG_DisplayAlign *)a->far_ptr) == SVG_DISPLAYALIGN_INHERIT);
     428             :                 break;
     429           0 :         case SVG_TextAlign_datatype:
     430           0 :                 return (*((SVG_TextAlign *)a->far_ptr) == SVG_TEXTALIGN_INHERIT);
     431             :                 break;
     432           1 :         case SVG_FillRule_datatype:
     433           1 :                 return (*((SVG_FillRule *)a->far_ptr) == SVG_FILLRULE_INHERIT);
     434             :                 break;
     435           1 :         case SVG_FontFamily_datatype:
     436           1 :                 return (((SVG_FontFamily *)a->far_ptr)->type == SVG_FONTFAMILY_INHERIT);
     437             :                 break;
     438           2 :         case SVG_FontStyle_datatype:
     439           2 :                 return (*((SVG_FontStyle *)a->far_ptr) == SVG_FONTSTYLE_INHERIT);
     440             :                 break;
     441           1 :         case SVG_FontWeight_datatype:
     442           1 :                 return (*((SVG_FontWeight *)a->far_ptr) == SVG_FONTWEIGHT_INHERIT);
     443             :                 break;
     444           0 :         case SVG_PointerEvents_datatype:
     445           0 :                 return (*((SVG_PointerEvents *)a->far_ptr) == SVG_POINTEREVENTS_INHERIT);
     446             :                 break;
     447           1 :         case SVG_StrokeDashArray_datatype:
     448           1 :                 return (((SVG_StrokeDashArray *)a->far_ptr)->type == SVG_STROKEDASHARRAY_INHERIT);
     449             :                 break;
     450           0 :         case SVG_StrokeLineCap_datatype:
     451           0 :                 return (*((SVG_StrokeLineCap *)a->far_ptr) == SVG_STROKELINECAP_INHERIT);
     452             :                 break;
     453           0 :         case SVG_StrokeLineJoin_datatype:
     454           0 :                 return (*((SVG_StrokeLineJoin *)a->far_ptr) == SVG_STROKELINEJOIN_INHERIT);
     455             :                 break;
     456           0 :         case SVG_TextAnchor_datatype:
     457           0 :                 return (*((SVG_TextAnchor *)a->far_ptr) == SVG_TEXTANCHOR_INHERIT);
     458             :                 break;
     459           0 :         case SVG_VectorEffect_datatype:
     460           0 :                 return (*((SVG_VectorEffect *)a->far_ptr) == SVG_VECTOREFFECT_INHERIT);
     461             :                 break;
     462           0 :         case SVG_Visibility_datatype:
     463           0 :                 return (*((SVG_Visibility *)a->far_ptr) == SVG_VISIBILITY_INHERIT);
     464             :                 break;
     465           0 :         case SVG_Overflow_datatype:
     466           0 :                 return (*((SVG_Overflow *)a->far_ptr) == SVG_OVERFLOW_INHERIT);
     467             :                 break;
     468             :         default:
     469             :                 return 0;
     470             :         }
     471             : }
     472             : 
     473             : 
     474         231 : u32 gf_svg_get_modification_flags(SVG_Element *n, GF_FieldInfo *info)
     475             : {
     476             : //      return 0xFFFFFFFF;
     477         231 :         switch (info->fieldType) {
     478          20 :         case SVG_Paint_datatype:
     479          20 :                 if (info->fieldIndex == TAG_SVG_ATT_fill)    return GF_SG_SVG_FILL_DIRTY;
     480           1 :                 if (info->fieldIndex == TAG_SVG_ATT_stroke) return GF_SG_SVG_STROKE_DIRTY;
     481           1 :                 if (info->fieldIndex == TAG_SVG_ATT_solid_color) return GF_SG_SVG_SOLIDCOLOR_OR_OPACITY_DIRTY;
     482           0 :                 if (info->fieldIndex == TAG_SVG_ATT_stop_color) return GF_SG_SVG_STOPCOLOR_OR_OPACITY_DIRTY;
     483           0 :                 if (info->fieldIndex == TAG_SVG_ATT_color) return GF_SG_SVG_COLOR_DIRTY;
     484             :                 break;
     485          36 :         case SVG_Number_datatype:
     486          36 :                 if (info->fieldIndex == TAG_SVG_ATT_opacity) return GF_SG_SVG_OPACITY_DIRTY;
     487          18 :                 if (info->fieldIndex == TAG_SVG_ATT_fill_opacity) return GF_SG_SVG_FILLOPACITY_DIRTY;
     488          17 :                 if (info->fieldIndex == TAG_SVG_ATT_stroke_opacity) return GF_SG_SVG_STROKEOPACITY_DIRTY;
     489          16 :                 if (info->fieldIndex == TAG_SVG_ATT_solid_opacity) return GF_SG_SVG_SOLIDCOLOR_OR_OPACITY_DIRTY;
     490          16 :                 if (info->fieldIndex == TAG_SVG_ATT_stop_opacity) return GF_SG_SVG_STOPCOLOR_OR_OPACITY_DIRTY;
     491          16 :                 if (info->fieldIndex == TAG_SVG_ATT_line_increment) return GF_SG_SVG_LINEINCREMENT_DIRTY;
     492           0 :                 if (info->fieldIndex == TAG_SVG_ATT_stroke_miterlimit) return GF_SG_SVG_STROKEMITERLIMIT_DIRTY;
     493             :                 break;
     494          34 :         case SVG_Length_datatype:
     495          34 :                 if (info->fieldIndex == TAG_SVG_ATT_stroke_dashoffset) return GF_SG_SVG_STROKEDASHOFFSET_DIRTY;
     496          34 :                 if (info->fieldIndex == TAG_SVG_ATT_stroke_width) return GF_SG_SVG_STROKEWIDTH_DIRTY;
     497             :                 break;
     498             :         case SVG_DisplayAlign_datatype:
     499             :                 return GF_SG_SVG_DISPLAYALIGN_DIRTY;
     500           1 :         case SVG_FillRule_datatype:
     501           1 :                 return GF_SG_SVG_FILLRULE_DIRTY;
     502          17 :         case SVG_FontFamily_datatype:
     503          17 :                 return GF_SG_SVG_FONTFAMILY_DIRTY;
     504          17 :         case SVG_FontSize_datatype:
     505          17 :                 return GF_SG_SVG_FONTSIZE_DIRTY;
     506           9 :         case SVG_FontStyle_datatype:
     507           9 :                 return GF_SG_SVG_FONTSTYLE_DIRTY;
     508           0 :         case SVG_FontVariant_datatype:
     509           0 :                 return GF_SG_SVG_FONTVARIANT_DIRTY;
     510           5 :         case SVG_FontWeight_datatype:
     511           5 :                 return GF_SG_SVG_FONTWEIGHT_DIRTY;
     512           1 :         case SVG_StrokeDashArray_datatype:
     513           1 :                 return GF_SG_SVG_STROKEDASHARRAY_DIRTY;
     514           0 :         case SVG_StrokeLineCap_datatype:
     515           0 :                 return GF_SG_SVG_STROKELINECAP_DIRTY;
     516           0 :         case SVG_StrokeLineJoin_datatype:
     517           0 :                 return GF_SG_SVG_STROKELINEJOIN_DIRTY;
     518          16 :         case SVG_TextAlign_datatype:
     519          16 :                 return GF_SG_SVG_TEXTPOSITION_DIRTY;
     520           0 :         case SVG_TextAnchor_datatype:
     521           0 :                 return GF_SG_SVG_TEXTPOSITION_DIRTY;
     522           2 :         case SVG_Display_datatype:
     523           2 :                 return GF_SG_SVG_DISPLAY_DIRTY;
     524           0 :         case SVG_VectorEffect_datatype:
     525           0 :                 return GF_SG_SVG_VECTOREFFECT_DIRTY;
     526             :         }
     527             : 
     528             :         /* this is not a property but a regular attribute, the animatable attributes are at the moment:
     529             :                 focusable, focusHighlight, gradientUnits, nav-*, target, xlink:href, xlink:type,
     530             : 
     531             : 
     532             :                 the following affect the geometry of the element (some affect the positioning):
     533             :                 cx, cy, d, height, offset, pathLength, points, r, rx, ry, width, x, x1, x2, y, y1, y2, rotate
     534             : 
     535             :                 the following affect the positioning and are computed at each frame:
     536             :                 transform, motion
     537             :         */
     538             :         switch (info->fieldType) {
     539             :         case SVG_Number_datatype:
     540             :         case SVG_Length_datatype:
     541             :         case SVG_Coordinate_datatype:
     542             :         case SVG_Numbers_datatype:
     543             :         case SVG_Points_datatype:
     544             :         case SVG_Coordinates_datatype:
     545             :         case SVG_PathData_datatype:
     546             :         case SVG_Rotate_datatype:
     547             :                 return GF_SG_SVG_GEOMETRY_DIRTY;
     548             : 
     549           2 :         case XMLRI_datatype:
     550           2 :                 return GF_SG_SVG_XLINK_HREF_DIRTY;
     551             :         /*for viewbox & PAR, use node dirty to force recomputing of the viewbox*/
     552             :         case SVG_PreserveAspectRatio_datatype:
     553             :         case SVG_ViewBox_datatype:
     554             :                 return GF_SG_NODE_DIRTY;
     555             : 
     556             :         //case SVG_Matrix_datatype:
     557             :         //case SVG_Motion_datatype:
     558             : 
     559           9 :         default:
     560           9 :                 return 0;
     561             :         }
     562             : }
     563             : 
     564             : /* NOTE: Some properties (audio-level, display, opacity, solid*, stop*, vector-effect, viewport*)
     565             :          are inherited only when they are  specified with the value 'inherit'
     566             :          otherwise they default to their initial value
     567             :                  which for the function below means NULL, the compositor will take care of the rest
     568             :  */
     569             : GF_EXPORT
     570       40700 : u32 gf_svg_apply_inheritance(SVGAllAttributes *all_atts, SVGPropertiesPointers *render_svg_props)
     571             : {
     572             :         u32 inherited_flags_mask = GF_SG_NODE_DIRTY | GF_SG_CHILD_DIRTY;
     573       40700 :         if(!all_atts || !render_svg_props) return ~inherited_flags_mask;
     574             : 
     575       40700 :         if (!all_atts->audio_level) {
     576       40401 :                 render_svg_props->audio_level = NULL;
     577             :         } else {
     578         299 :                 Fixed par_val = render_svg_props->computed_audio_level;
     579             :                 Fixed val;
     580         299 :                 if (all_atts->audio_level->type != SVG_NUMBER_INHERIT) {
     581         299 :                         render_svg_props->audio_level = all_atts->audio_level;
     582         299 :                         val = all_atts->audio_level->value;
     583           0 :                 } else if (render_svg_props->audio_level) {
     584           0 :                         val = render_svg_props->audio_level->value;
     585             :                 } else {
     586             :                         val = FIX_ONE;
     587             :                 }
     588         299 :                 par_val = MIN(FIX_ONE, MAX( par_val, 0));
     589         299 :                 val = MIN(FIX_ONE, MAX( val, 0));
     590         299 :                 render_svg_props->computed_audio_level = gf_mulfix(val, par_val);
     591             :         }
     592             : 
     593       40700 :         if (all_atts->color && all_atts->color->type == SVG_PAINT_COLOR
     594        2330 :                 && all_atts->color->color.type != SVG_COLOR_INHERIT) {
     595         150 :                 render_svg_props->color = all_atts->color;
     596             :         } else {
     597             :                 inherited_flags_mask |= GF_SG_SVG_COLOR_DIRTY;
     598             :         }
     599       40700 :         if (all_atts->color_rendering && *(all_atts->color_rendering) != SVG_RENDERINGHINT_INHERIT) {
     600         202 :                 render_svg_props->color_rendering = all_atts->color_rendering;
     601             :         }
     602       40700 :         if (all_atts->display && *(all_atts->display) != SVG_DISPLAY_INHERIT) {
     603         330 :                 render_svg_props->display = all_atts->display;
     604       40370 :         } else if (!all_atts->display) {
     605       40250 :                 render_svg_props->display = NULL;
     606             :         } else {
     607         120 :                 inherited_flags_mask |= GF_SG_SVG_DISPLAY_DIRTY;
     608             :         }
     609             : 
     610       40700 :         if (all_atts->display_align && *(all_atts->display_align) != SVG_DISPLAYALIGN_INHERIT) {
     611          34 :                 render_svg_props->display_align = all_atts->display_align;
     612             :         } else {
     613       40666 :                 inherited_flags_mask |= GF_SG_SVG_DISPLAYALIGN_DIRTY;
     614             :         }
     615       40700 :         if (all_atts->fill && all_atts->fill->type != SVG_PAINT_INHERIT) {
     616        9487 :                 render_svg_props->fill = all_atts->fill;
     617        9487 :                 if (all_atts->fill->type == SVG_PAINT_COLOR &&
     618             :                         all_atts->fill->color.type == SVG_COLOR_CURRENTCOLOR) {
     619          45 :                         render_svg_props->fill = render_svg_props->color;
     620          45 :                         if (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY) {
     621          45 :                                 inherited_flags_mask |= GF_SG_SVG_FILL_DIRTY;
     622             :                         }
     623             :                 }
     624             :         } else {
     625       31213 :                 inherited_flags_mask |= GF_SG_SVG_FILL_DIRTY;
     626             :         }
     627       40700 :         if (all_atts->fill_opacity && all_atts->fill_opacity->type != SVG_NUMBER_INHERIT) {
     628        1131 :                 render_svg_props->fill_opacity = all_atts->fill_opacity;
     629             :         } else {
     630       39569 :                 inherited_flags_mask |= GF_SG_SVG_FILLOPACITY_DIRTY;
     631             :         }
     632       40700 :         if (all_atts->fill_rule && *(all_atts->fill_rule) != SVG_FILLRULE_INHERIT) {
     633         113 :                 render_svg_props->fill_rule = all_atts->fill_rule;
     634             :         } else {
     635       40587 :                 inherited_flags_mask |= GF_SG_SVG_FILLRULE_DIRTY;
     636             :         }
     637       40700 :         if (all_atts->font_family && all_atts->font_family->type != SVG_FONTFAMILY_INHERIT) {
     638         956 :                 render_svg_props->font_family = all_atts->font_family;
     639             :         } else {
     640       39744 :                 inherited_flags_mask |= GF_SG_SVG_FONTFAMILY_DIRTY;
     641             :         }
     642       40700 :         if (all_atts->font_size && all_atts->font_size->type != SVG_NUMBER_INHERIT) {
     643        3549 :                 render_svg_props->font_size = all_atts->font_size;
     644             :         } else {
     645       37151 :                 inherited_flags_mask |= GF_SG_SVG_FONTSIZE_DIRTY;
     646             :         }
     647       40700 :         if (all_atts->font_style && *(all_atts->font_style) != SVG_FONTSTYLE_INHERIT) {
     648          36 :                 render_svg_props->font_style = all_atts->font_style;
     649             :         } else {
     650       40664 :                 inherited_flags_mask |= GF_SG_SVG_FONTSTYLE_DIRTY;
     651             :         }
     652       40700 :         if (all_atts->font_variant && *(all_atts->font_variant) != SVG_FONTVARIANT_INHERIT) {
     653         150 :                 render_svg_props->font_variant = all_atts->font_variant;
     654             :         } else {
     655       40550 :                 inherited_flags_mask |= GF_SG_SVG_FONTVARIANT_DIRTY;
     656             :         }
     657       40700 :         if (all_atts->font_weight && *(all_atts->font_weight) != SVG_FONTWEIGHT_INHERIT) {
     658         110 :                 render_svg_props->font_weight = all_atts->font_weight;
     659             :         } else {
     660       40590 :                 inherited_flags_mask |= GF_SG_SVG_FONTWEIGHT_DIRTY;
     661             :         }
     662       40700 :         if (all_atts->image_rendering && *(all_atts->image_rendering) != SVG_RENDERINGHINT_INHERIT) {
     663         101 :                 render_svg_props->image_rendering = all_atts->image_rendering;
     664             :         }
     665       40700 :         if (all_atts->line_increment && all_atts->line_increment->type != SVG_NUMBER_INHERIT) {
     666         184 :                 render_svg_props->line_increment = all_atts->line_increment;
     667             :         } else {
     668       40516 :                 inherited_flags_mask |= GF_SG_SVG_LINEINCREMENT_DIRTY;
     669             :         }
     670       40700 :         if (all_atts->opacity && all_atts->opacity->type != SVG_NUMBER_INHERIT) {
     671         468 :                 render_svg_props->opacity = all_atts->opacity;
     672       40232 :         } else if (!all_atts->opacity) {
     673       40232 :                 render_svg_props->opacity = NULL;
     674             :         } else {
     675           0 :                 inherited_flags_mask |= GF_SG_SVG_OPACITY_DIRTY;
     676             :         }
     677             : 
     678       40700 :         if (all_atts->pointer_events && *(all_atts->pointer_events) != SVG_POINTEREVENTS_INHERIT) {
     679         150 :                 render_svg_props->pointer_events = all_atts->pointer_events;
     680             :         }
     681       40700 :         if (all_atts->shape_rendering && *(all_atts->shape_rendering) != SVG_RENDERINGHINT_INHERIT) {
     682         150 :                 render_svg_props->shape_rendering = all_atts->shape_rendering;
     683             :         }
     684       40700 :         if (all_atts->solid_color && all_atts->solid_color->type != SVG_PAINT_INHERIT) {
     685         306 :                 render_svg_props->solid_color = all_atts->solid_color;
     686         306 :                 if (all_atts->solid_color->type == SVG_PAINT_COLOR &&
     687             :                         all_atts->solid_color->color.type == SVG_COLOR_CURRENTCOLOR) {
     688           0 :                         render_svg_props->solid_color = render_svg_props->color;
     689           0 :                         if (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY) {
     690           0 :                                 inherited_flags_mask |= GF_SG_SVG_SOLIDCOLOR_OR_OPACITY_DIRTY;
     691             :                         }
     692             :                 }
     693       40394 :         } else if (!all_atts->solid_color) {
     694       40394 :                 render_svg_props->solid_color = NULL;
     695             :         } else {
     696           0 :                 inherited_flags_mask |= GF_SG_SVG_SOLIDCOLOR_OR_OPACITY_DIRTY;
     697             :         }
     698       40700 :         if (all_atts->solid_opacity && all_atts->solid_opacity->type != SVG_NUMBER_INHERIT) {
     699         150 :                 render_svg_props->solid_opacity = all_atts->solid_opacity;
     700       40550 :         } else if (!all_atts->solid_opacity) {
     701       40550 :                 render_svg_props->solid_opacity = NULL;
     702             :         } else {
     703           0 :                 inherited_flags_mask |= GF_SG_SVG_SOLIDCOLOR_OR_OPACITY_DIRTY;
     704             :         }
     705       40700 :         if (all_atts->stop_color && all_atts->stop_color->type != SVG_PAINT_INHERIT) {
     706         606 :                 render_svg_props->stop_color = all_atts->stop_color;
     707         606 :                 if (all_atts->stop_color->type == SVG_PAINT_COLOR &&
     708             :                         all_atts->stop_color->color.type == SVG_COLOR_CURRENTCOLOR) {
     709           0 :                         render_svg_props->stop_color = render_svg_props->color;
     710           0 :                         if (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY) {
     711           0 :                                 inherited_flags_mask |= GF_SG_SVG_STOPCOLOR_OR_OPACITY_DIRTY;
     712             :                         }
     713             :                 }
     714       40094 :         } else if (!all_atts->stop_color) {
     715       40094 :                 render_svg_props->stop_color = NULL;
     716             :         } else {
     717           0 :                 inherited_flags_mask |= GF_SG_SVG_STOPCOLOR_OR_OPACITY_DIRTY;
     718             :         }
     719       40700 :         if (all_atts->stop_opacity && all_atts->stop_opacity->type != SVG_NUMBER_INHERIT) {
     720         756 :                 render_svg_props->stop_opacity = all_atts->stop_opacity;
     721       39944 :         } else if (!all_atts->stop_opacity) {
     722       39944 :                 render_svg_props->stop_opacity = NULL;
     723             :         } else {
     724           0 :                 inherited_flags_mask |= GF_SG_SVG_STOPCOLOR_OR_OPACITY_DIRTY;
     725             :         }
     726       40700 :         if (all_atts->stroke && all_atts->stroke->type != SVG_PAINT_INHERIT) {
     727        6809 :                 render_svg_props->stroke = all_atts->stroke;
     728        6809 :                 if (all_atts->stroke->type == SVG_PAINT_COLOR &&
     729             :                         all_atts->stroke->color.type == SVG_COLOR_CURRENTCOLOR) {
     730           0 :                         render_svg_props->stroke = render_svg_props->color;
     731           0 :                         if (inherited_flags_mask & GF_SG_SVG_COLOR_DIRTY) {
     732           0 :                                 inherited_flags_mask |= GF_SG_SVG_STROKE_DIRTY;
     733             :                         }
     734             :                 }
     735             :         } else {
     736       33891 :                 inherited_flags_mask |= GF_SG_SVG_STROKE_DIRTY;
     737             :         }
     738       40700 :         if (all_atts->stroke_dasharray && all_atts->stroke_dasharray->type != SVG_STROKEDASHARRAY_INHERIT) {
     739         300 :                 render_svg_props->stroke_dasharray = all_atts->stroke_dasharray;
     740             :         } else {
     741       40400 :                 inherited_flags_mask |= GF_SG_SVG_STROKEDASHARRAY_DIRTY;
     742             :         }
     743       40700 :         if (all_atts->stroke_dashoffset && all_atts->stroke_dashoffset->type != SVG_NUMBER_INHERIT) {
     744         150 :                 render_svg_props->stroke_dashoffset = all_atts->stroke_dashoffset;
     745             :         } else {
     746       40550 :                 inherited_flags_mask |= GF_SG_SVG_STROKEDASHOFFSET_DIRTY;
     747             :         }
     748       40700 :         if (all_atts->stroke_linecap && *(all_atts->stroke_linecap) != SVG_STROKELINECAP_INHERIT) {
     749         150 :                 render_svg_props->stroke_linecap = all_atts->stroke_linecap;
     750             :         } else {
     751       40550 :                 inherited_flags_mask |= GF_SG_SVG_STROKELINECAP_DIRTY;
     752             :         }
     753       40700 :         if (all_atts->stroke_linejoin && *(all_atts->stroke_linejoin) != SVG_STROKELINEJOIN_INHERIT) {
     754         150 :                 render_svg_props->stroke_linejoin = all_atts->stroke_linejoin;
     755             :         } else {
     756       40550 :                 inherited_flags_mask |= GF_SG_SVG_STROKELINEJOIN_DIRTY;
     757             :         }
     758       40700 :         if (all_atts->stroke_miterlimit && all_atts->stroke_miterlimit->type != SVG_NUMBER_INHERIT) {
     759         150 :                 render_svg_props->stroke_miterlimit = all_atts->stroke_miterlimit;
     760             :         } else {
     761       40550 :                 inherited_flags_mask |= GF_SG_SVG_STROKEMITERLIMIT_DIRTY;
     762             :         }
     763       40700 :         if (all_atts->stroke_opacity && all_atts->stroke_opacity->type != SVG_NUMBER_INHERIT) {
     764         151 :                 render_svg_props->stroke_opacity = all_atts->stroke_opacity;
     765             :         } else {
     766       40549 :                 inherited_flags_mask |= GF_SG_SVG_STROKEOPACITY_DIRTY;
     767             :         }
     768       40700 :         if (all_atts->stroke_width && all_atts->stroke_width->type != SVG_NUMBER_INHERIT) {
     769        3333 :                 render_svg_props->stroke_width = all_atts->stroke_width;
     770             :         } else {
     771       37367 :                 inherited_flags_mask |= GF_SG_SVG_STROKEWIDTH_DIRTY;
     772             :         }
     773       40700 :         if (all_atts->text_align && *(all_atts->text_align) != SVG_TEXTALIGN_INHERIT) {
     774          34 :                 render_svg_props->text_align = all_atts->text_align;
     775             :         } else {
     776       40666 :                 inherited_flags_mask |= GF_SG_SVG_TEXTPOSITION_DIRTY;
     777             :         }
     778       40700 :         if (all_atts->text_anchor && *(all_atts->text_anchor) != SVG_TEXTANCHOR_INHERIT) {
     779        2205 :                 render_svg_props->text_anchor = all_atts->text_anchor;
     780             :         } else {
     781       38495 :                 inherited_flags_mask |= GF_SG_SVG_TEXTPOSITION_DIRTY;
     782             :         }
     783       40700 :         if (all_atts->text_rendering && *(all_atts->text_rendering) != SVG_RENDERINGHINT_INHERIT) {
     784           0 :                 render_svg_props->text_rendering = all_atts->text_rendering;
     785             :         }
     786       40700 :         if (all_atts->vector_effect && *(all_atts->vector_effect) != SVG_VECTOREFFECT_INHERIT) {
     787         150 :                 render_svg_props->vector_effect = all_atts->vector_effect;
     788       40550 :         } else if (!all_atts->vector_effect) {
     789       40550 :                 render_svg_props->vector_effect = NULL;
     790             :         } else {
     791           0 :                 inherited_flags_mask |= GF_SG_SVG_VECTOREFFECT_DIRTY;
     792             :         }
     793       40700 :         if (all_atts->viewport_fill && all_atts->viewport_fill->type != SVG_PAINT_INHERIT) {
     794         152 :                 render_svg_props->viewport_fill = all_atts->viewport_fill;
     795       40548 :         } else if (!all_atts->viewport_fill) {
     796       40548 :                 render_svg_props->viewport_fill = NULL;
     797             :         }
     798       40700 :         if (all_atts->viewport_fill_opacity && all_atts->viewport_fill_opacity->type != SVG_NUMBER_INHERIT) {
     799         150 :                 render_svg_props->viewport_fill_opacity = all_atts->viewport_fill_opacity;
     800       40550 :         } else if (!all_atts->viewport_fill_opacity) {
     801       40550 :                 render_svg_props->viewport_fill_opacity = NULL;
     802             :         }
     803       40700 :         if (all_atts->visibility && *(all_atts->visibility) != SVG_VISIBILITY_INHERIT) {
     804         150 :                 render_svg_props->visibility = all_atts->visibility;
     805             :         }
     806             :         return inherited_flags_mask;
     807             : }
     808             : 
     809             : 
     810             : 
     811             : GF_EXPORT
     812       46001 : void gf_svg_flatten_attributes(SVG_Element *e, SVGAllAttributes *all_atts)
     813             : {
     814             :         SVGAttribute *att;
     815             :         memset(all_atts, 0, sizeof(SVGAllAttributes));
     816       46001 :         if (e->sgprivate->tag <= GF_NODE_FIRST_DOM_NODE_TAG) return;
     817       46001 :         att = e->attributes;
     818      253426 :         while (att) {
     819      161424 :                 switch(att->tag) {
     820        2653 :                 case TAG_XML_ATT_id:
     821        2653 :                         all_atts->xml_id = (SVG_ID *)att->data;
     822        2653 :                         break;
     823         305 :                 case TAG_XML_ATT_base:
     824         305 :                         all_atts->xml_base = (XMLRI *)att->data;
     825         305 :                         break;
     826         305 :                 case TAG_XML_ATT_lang:
     827         305 :                         all_atts->xml_lang = (SVG_LanguageID *)att->data;
     828         305 :                         break;
     829         456 :                 case TAG_XML_ATT_space:
     830         456 :                         all_atts->xml_space = (XML_Space *)att->data;
     831         456 :                         break;
     832             : 
     833         307 :                 case TAG_XLINK_ATT_type:
     834         307 :                         all_atts->xlink_type = (SVG_String *)att->data;
     835         307 :                         break;
     836         307 :                 case TAG_XLINK_ATT_role:
     837         307 :                         all_atts->xlink_role = (XMLRI *)att->data;
     838         307 :                         break;
     839         307 :                 case TAG_XLINK_ATT_arcrole:
     840         307 :                         all_atts->xlink_arcrole = (XMLRI *)att->data;
     841         307 :                         break;
     842         307 :                 case TAG_XLINK_ATT_title:
     843         307 :                         all_atts->xlink_title = (SVG_String *)att->data;
     844         307 :                         break;
     845        4500 :                 case TAG_XLINK_ATT_href:
     846        4500 :                         all_atts->xlink_href = (XMLRI *)att->data;
     847        4500 :                         break;
     848         307 :                 case TAG_XLINK_ATT_show:
     849         307 :                         all_atts->xlink_show = (SVG_String *)att->data;
     850         307 :                         break;
     851         307 :                 case TAG_XLINK_ATT_actuate:
     852         307 :                         all_atts->xlink_actuate = (SVG_String *)att->data;
     853         307 :                         break;
     854             : 
     855        1240 :                 case TAG_XMLEV_ATT_event:
     856        1240 :                         all_atts->event = (XMLEV_Event *)att->data;
     857        1240 :                         break;
     858         163 :                 case TAG_XMLEV_ATT_phase:
     859         163 :                         all_atts->phase = (XMLEV_Phase *)att->data;
     860         163 :                         break;
     861         163 :                 case TAG_XMLEV_ATT_propagate:
     862         163 :                         all_atts->propagate = (XMLEV_Propagate *)att->data;
     863         163 :                         break;
     864         163 :                 case TAG_XMLEV_ATT_defaultAction:
     865         163 :                         all_atts->defaultAction = (XMLEV_DefaultAction *)att->data;
     866         163 :                         break;
     867           0 :                 case TAG_XMLEV_ATT_observer:
     868           0 :                         all_atts->observer = (XML_IDREF *)att->data;
     869           0 :                         break;
     870        1079 :                 case TAG_XMLEV_ATT_target:
     871        1079 :                         all_atts->listener_target = (XML_IDREF *)att->data;
     872        1079 :                         break;
     873        1240 :                 case TAG_XMLEV_ATT_handler:
     874        1240 :                         all_atts->handler = (XMLRI *)att->data;
     875        1240 :                         break;
     876             : 
     877         175 :                 case TAG_LSR_ATT_enabled:
     878         175 :                         all_atts->lsr_enabled = (SVG_Boolean *)att->data;
     879         175 :                         break;
     880             : 
     881        7079 :                 case TAG_SVG_ATT_id:
     882        7079 :                         all_atts->id = (SVG_ID *)att->data;
     883        7079 :                         break;
     884        1448 :                 case TAG_SVG_ATT__class:
     885        1448 :                         all_atts->_class = (SVG_String *)att->data;
     886        1448 :                         break;
     887         381 :                 case TAG_SVG_ATT_requiredFeatures:
     888         381 :                         all_atts->requiredFeatures = (SVG_ListOfIRI *)att->data;
     889         381 :                         break;
     890         304 :                 case TAG_SVG_ATT_requiredExtensions:
     891         304 :                         all_atts->requiredExtensions = (SVG_ListOfIRI *)att->data;
     892         304 :                         break;
     893         153 :                 case TAG_SVG_ATT_requiredFormats:
     894         153 :                         all_atts->requiredFormats = (SVG_FormatList *)att->data;
     895         153 :                         break;
     896         154 :                 case TAG_SVG_ATT_requiredFonts:
     897         154 :                         all_atts->requiredFonts = (SVG_FontList *)att->data;
     898         154 :                         break;
     899         307 :                 case TAG_SVG_ATT_systemLanguage:
     900         307 :                         all_atts->systemLanguage = (SVG_LanguageIDs *)att->data;
     901         307 :                         break;
     902         768 :                 case TAG_SVG_ATT_display:
     903         768 :                         all_atts->display = (SVG_Display *)att->data;
     904         768 :                         break;
     905         304 :                 case TAG_SVG_ATT_visibility:
     906         304 :                         all_atts->visibility = (SVG_Visibility *)att->data;
     907         304 :                         break;
     908         305 :                 case TAG_SVG_ATT_image_rendering:
     909         305 :                         all_atts->image_rendering = (SVG_RenderingHint *)att->data;
     910         305 :                         break;
     911         306 :                 case TAG_SVG_ATT_pointer_events:
     912         306 :                         all_atts->pointer_events = (SVG_PointerEvents *)att->data;
     913         306 :                         break;
     914         306 :                 case TAG_SVG_ATT_shape_rendering:
     915         306 :                         all_atts->shape_rendering = (SVG_RenderingHint *)att->data;
     916         306 :                         break;
     917         306 :                 case TAG_SVG_ATT_text_rendering:
     918         306 :                         all_atts->text_rendering = (SVG_RenderingHint *)att->data;
     919         306 :                         break;
     920         303 :                 case TAG_SVG_ATT_audio_level:
     921         303 :                         all_atts->audio_level = (SVG_Number *)att->data;
     922         303 :                         break;
     923         157 :                 case TAG_SVG_ATT_viewport_fill:
     924         157 :                         all_atts->viewport_fill = (SVG_Paint *)att->data;
     925         157 :                         break;
     926         153 :                 case TAG_SVG_ATT_viewport_fill_opacity:
     927         153 :                         all_atts->viewport_fill_opacity = (SVG_Number *)att->data;
     928         153 :                         break;
     929         152 :                 case TAG_SVG_ATT_overflow:
     930         152 :                         all_atts->overflow = (SVG_String *)att->data;
     931         152 :                         break;
     932        1438 :                 case TAG_SVG_ATT_fill_opacity:
     933        1438 :                         all_atts->fill_opacity = (SVG_Number *)att->data;
     934        1438 :                         break;
     935         309 :                 case TAG_SVG_ATT_stroke_opacity:
     936         309 :                         all_atts->stroke_opacity = (SVG_Number *)att->data;
     937         309 :                         break;
     938       10745 :                 case TAG_SVG_ATT_fill:
     939       10745 :                         all_atts->fill = (SVG_Paint *)att->data;
     940       10745 :                         break;
     941         152 :                 case TAG_SVG_ATT_filter:
     942         152 :                         all_atts->filter = (SVG_Paint *)att->data;
     943         152 :                         break;
     944         306 :                 case TAG_SVG_ATT_fill_rule:
     945         306 :                         all_atts->fill_rule = (SVG_FillRule *)att->data;
     946         306 :                         break;
     947        7409 :                 case TAG_SVG_ATT_stroke:
     948        7409 :                         all_atts->stroke = (SVG_Paint *)att->data;
     949        7409 :                         break;
     950         614 :                 case TAG_SVG_ATT_stroke_dasharray:
     951         614 :                         all_atts->stroke_dasharray = (SVG_StrokeDashArray *)att->data;
     952         614 :                         break;
     953         306 :                 case TAG_SVG_ATT_stroke_dashoffset:
     954         306 :                         all_atts->stroke_dashoffset = (SVG_Length *)att->data;
     955         306 :                         break;
     956         306 :                 case TAG_SVG_ATT_stroke_linecap:
     957         306 :                         all_atts->stroke_linecap = (SVG_StrokeLineCap *)att->data;
     958         306 :                         break;
     959         306 :                 case TAG_SVG_ATT_stroke_linejoin:
     960         306 :                         all_atts->stroke_linejoin = (SVG_StrokeLineJoin *)att->data;
     961         306 :                         break;
     962         306 :                 case TAG_SVG_ATT_stroke_miterlimit:
     963         306 :                         all_atts->stroke_miterlimit = (SVG_Number *)att->data;
     964         306 :                         break;
     965        3769 :                 case TAG_SVG_ATT_stroke_width:
     966        3769 :                         all_atts->stroke_width = (SVG_Length *)att->data;
     967        3769 :                         break;
     968        2638 :                 case TAG_SVG_ATT_color:
     969        2638 :                         all_atts->color = (SVG_Paint *)att->data;
     970        2638 :                         break;
     971         460 :                 case TAG_SVG_ATT_color_rendering:
     972         460 :                         all_atts->color_rendering = (SVG_RenderingHint *)att->data;
     973         460 :                         break;
     974         153 :                 case TAG_SVG_ATT_vector_effect:
     975         153 :                         all_atts->vector_effect = (SVG_VectorEffect *)att->data;
     976         153 :                         break;
     977         318 :                 case TAG_SVG_ATT_solid_color:
     978         318 :                         all_atts->solid_color = (SVG_SVGColor *)att->data;
     979         318 :                         break;
     980         154 :                 case TAG_SVG_ATT_solid_opacity:
     981         154 :                         all_atts->solid_opacity = (SVG_Number *)att->data;
     982         154 :                         break;
     983         188 :                 case TAG_SVG_ATT_display_align:
     984         188 :                         all_atts->display_align = (SVG_DisplayAlign *)att->data;
     985         188 :                         break;
     986         496 :                 case TAG_SVG_ATT_line_increment:
     987         496 :                         all_atts->line_increment = (SVG_Number *)att->data;
     988         496 :                         break;
     989         982 :                 case TAG_SVG_ATT_stop_color:
     990         982 :                         all_atts->stop_color = (SVG_SVGColor *)att->data;
     991         982 :                         break;
     992        1134 :                 case TAG_SVG_ATT_stop_opacity:
     993        1134 :                         all_atts->stop_opacity = (SVG_Number *)att->data;
     994        1134 :                         break;
     995        1164 :                 case TAG_SVG_ATT_font_family:
     996        1164 :                         all_atts->font_family = (SVG_FontFamily *)att->data;
     997        1164 :                         break;
     998        3936 :                 case TAG_SVG_ATT_font_size:
     999        3936 :                         all_atts->font_size = (SVG_FontSize *)att->data;
    1000        3936 :                         break;
    1001         342 :                 case TAG_SVG_ATT_font_style:
    1002         342 :                         all_atts->font_style = (SVG_FontStyle *)att->data;
    1003         342 :                         break;
    1004         307 :                 case TAG_SVG_ATT_font_variant:
    1005         307 :                         all_atts->font_variant = (SVG_FontVariant *)att->data;
    1006         307 :                         break;
    1007         326 :                 case TAG_SVG_ATT_font_weight:
    1008         326 :                         all_atts->font_weight = (SVG_FontWeight *)att->data;
    1009         326 :                         break;
    1010        2572 :                 case TAG_SVG_ATT_text_anchor:
    1011        2572 :                         all_atts->text_anchor = (SVG_TextAnchor *)att->data;
    1012        2572 :                         break;
    1013          34 :                 case TAG_SVG_ATT_text_align:
    1014          34 :                         all_atts->text_align = (SVG_TextAlign *)att->data;
    1015          34 :                         break;
    1016         156 :                 case TAG_SVG_ATT_text_decoration:
    1017         156 :                         all_atts->text_decoration = (SVG_String *)att->data;
    1018         156 :                         break;
    1019         153 :                 case TAG_SVG_ATT_focusHighlight:
    1020         153 :                         all_atts->focusHighlight = (SVG_FocusHighlight *)att->data;
    1021         153 :                         break;
    1022         152 :                 case TAG_SVG_ATT_externalResourcesRequired:
    1023         152 :                         all_atts->externalResourcesRequired = (SVG_Boolean *)att->data;
    1024         152 :                         break;
    1025         154 :                 case TAG_SVG_ATT_focusable:
    1026         154 :                         all_atts->focusable = (SVG_Focusable *)att->data;
    1027         154 :                         break;
    1028         154 :                 case TAG_SVG_ATT_nav_next:
    1029         154 :                         all_atts->nav_next = (SVG_Focus *)att->data;
    1030         154 :                         break;
    1031         154 :                 case TAG_SVG_ATT_nav_prev:
    1032         154 :                         all_atts->nav_prev = (SVG_Focus *)att->data;
    1033         154 :                         break;
    1034         154 :                 case TAG_SVG_ATT_nav_up:
    1035         154 :                         all_atts->nav_up = (SVG_Focus *)att->data;
    1036         154 :                         break;
    1037         154 :                 case TAG_SVG_ATT_nav_up_right:
    1038         154 :                         all_atts->nav_up_right = (SVG_Focus *)att->data;
    1039         154 :                         break;
    1040         154 :                 case TAG_SVG_ATT_nav_right:
    1041         154 :                         all_atts->nav_right = (SVG_Focus *)att->data;
    1042         154 :                         break;
    1043         154 :                 case TAG_SVG_ATT_nav_down_right:
    1044         154 :                         all_atts->nav_down_right = (SVG_Focus *)att->data;
    1045         154 :                         break;
    1046         154 :                 case TAG_SVG_ATT_nav_down:
    1047         154 :                         all_atts->nav_down = (SVG_Focus *)att->data;
    1048         154 :                         break;
    1049         154 :                 case TAG_SVG_ATT_nav_down_left:
    1050         154 :                         all_atts->nav_down_left = (SVG_Focus *)att->data;
    1051         154 :                         break;
    1052         154 :                 case TAG_SVG_ATT_nav_left:
    1053         154 :                         all_atts->nav_left = (SVG_Focus *)att->data;
    1054         154 :                         break;
    1055         154 :                 case TAG_SVG_ATT_nav_up_left:
    1056         154 :                         all_atts->nav_up_left = (SVG_Focus *)att->data;
    1057         154 :                         break;
    1058        4620 :                 case TAG_SVG_ATT_transform:
    1059        4620 :                         all_atts->transform = (SVG_Transform *)att->data;
    1060        4620 :                         break;
    1061         307 :                 case TAG_SVG_ATT_target:
    1062         307 :                         all_atts->target = (SVG_String *)att->data;
    1063         307 :                         break;
    1064         234 :                 case TAG_SVG_ATT_attributeName:
    1065         234 :                         all_atts->attributeName = (SMIL_AttributeName *)att->data;
    1066         234 :                         break;
    1067           1 :                 case TAG_SVG_ATT_attributeType:
    1068           1 :                         all_atts->attributeType = (SMIL_AttributeType *)att->data;
    1069           1 :                         break;
    1070        1447 :                 case TAG_SVG_ATT_begin:
    1071        1447 :                         all_atts->begin = (SMIL_Times *)att->data;
    1072        1447 :                         break;
    1073        1754 :                 case TAG_SVG_ATT_dur:
    1074        1754 :                         all_atts->dur = (SMIL_Duration *)att->data;
    1075        1754 :                         break;
    1076        1785 :                 case TAG_SVG_ATT_end:
    1077        1785 :                         all_atts->end = (SMIL_Times *)att->data;
    1078        1785 :                         break;
    1079         198 :                 case TAG_SVG_ATT_repeatCount:
    1080         198 :                         all_atts->repeatCount = (SMIL_RepeatCount *)att->data;
    1081         198 :                         break;
    1082         162 :                 case TAG_SVG_ATT_repeatDur:
    1083         162 :                         all_atts->repeatDur = (SMIL_Duration *)att->data;
    1084         162 :                         break;
    1085           5 :                 case TAG_SVG_ATT_restart:
    1086           5 :                         all_atts->restart = (SMIL_Restart *)att->data;
    1087           5 :                         break;
    1088         265 :                 case TAG_SVG_ATT_smil_fill:
    1089         265 :                         all_atts->smil_fill = (SMIL_Fill *)att->data;
    1090         265 :                         break;
    1091           5 :                 case TAG_SVG_ATT_min:
    1092           5 :                         all_atts->min = (SMIL_Duration *)att->data;
    1093           5 :                         break;
    1094           5 :                 case TAG_SVG_ATT_max:
    1095           5 :                         all_atts->max = (SMIL_Duration *)att->data;
    1096           5 :                         break;
    1097         127 :                 case TAG_SVG_ATT_to:
    1098         127 :                         all_atts->to = (SMIL_AnimateValue *)att->data;
    1099         127 :                         break;
    1100          42 :                 case TAG_SVG_ATT_calcMode:
    1101          42 :                         all_atts->calcMode = (SMIL_CalcMode *)att->data;
    1102          42 :                         break;
    1103          83 :                 case TAG_SVG_ATT_values:
    1104          83 :                         all_atts->values = (SMIL_AnimateValues *)att->data;
    1105          83 :                         break;
    1106           9 :                 case TAG_SVG_ATT_keyTimes:
    1107           9 :                         all_atts->keyTimes = (SMIL_KeyTimes *)att->data;
    1108           9 :                         break;
    1109           5 :                 case TAG_SVG_ATT_keySplines:
    1110           5 :                         all_atts->keySplines = (SMIL_KeySplines *)att->data;
    1111           5 :                         break;
    1112         123 :                 case TAG_SVG_ATT_from:
    1113         123 :                         all_atts->from = (SMIL_AnimateValue *)att->data;
    1114         123 :                         break;
    1115          12 :                 case TAG_SVG_ATT_by:
    1116          12 :                         all_atts->by = (SMIL_AnimateValue *)att->data;
    1117          12 :                         break;
    1118           9 :                 case TAG_SVG_ATT_additive:
    1119           9 :                         all_atts->additive = (SMIL_Additive *)att->data;
    1120           9 :                         break;
    1121           5 :                 case TAG_SVG_ATT_accumulate:
    1122           5 :                         all_atts->accumulate = (SMIL_Accumulate *)att->data;
    1123           5 :                         break;
    1124           7 :                 case TAG_SVG_ATT_path:
    1125           7 :                         all_atts->path = (SVG_PathData *)att->data;
    1126           7 :                         break;
    1127           7 :                 case TAG_SVG_ATT_keyPoints:
    1128           7 :                         all_atts->keyPoints = (SMIL_KeyPoints *)att->data;
    1129           7 :                         break;
    1130          11 :                 case TAG_SVG_ATT_rotate:
    1131          11 :                         all_atts->rotate = (SVG_Rotate *)att->data;
    1132          11 :                         break;
    1133           3 :                 case TAG_SVG_ATT_origin:
    1134           3 :                         all_atts->origin = (SVG_String *)att->data;
    1135           3 :                         break;
    1136         144 :                 case TAG_SVG_ATT_transform_type:
    1137         144 :                         all_atts->transform_type = (SVG_TransformType *)att->data;
    1138         144 :                         break;
    1139           2 :                 case TAG_SVG_ATT_clipBegin:
    1140           2 :                         all_atts->clipBegin = (SVG_Clock *)att->data;
    1141           2 :                         break;
    1142           0 :                 case TAG_SVG_ATT_clipEnd:
    1143           0 :                         all_atts->clipEnd = (SVG_Clock *)att->data;
    1144           0 :                         break;
    1145         154 :                 case TAG_SVG_ATT_syncBehavior:
    1146         154 :                         all_atts->syncBehavior = (SMIL_SyncBehavior *)att->data;
    1147         154 :                         break;
    1148         307 :                 case TAG_SVG_ATT_syncTolerance:
    1149         307 :                         all_atts->syncTolerance = (SMIL_SyncTolerance *)att->data;
    1150         307 :                         break;
    1151         154 :                 case TAG_SVG_ATT_syncMaster:
    1152         154 :                         all_atts->syncMaster = (SVG_Boolean *)att->data;
    1153         154 :                         break;
    1154         125 :                 case TAG_SVG_ATT_syncReference:
    1155         125 :                         all_atts->syncReference = (XMLRI *)att->data;
    1156         125 :                         break;
    1157        5489 :                 case TAG_SVG_ATT_x:
    1158        5489 :                         all_atts->x = (SVG_Coordinate *)att->data;
    1159        5489 :                         break;
    1160        4831 :                 case TAG_SVG_ATT_y:
    1161        4831 :                         all_atts->y = (SVG_Coordinate *)att->data;
    1162        4831 :                         break;
    1163        7557 :                 case TAG_SVG_ATT_width:
    1164        7557 :                         all_atts->width = (SVG_Length *)att->data;
    1165        7557 :                         break;
    1166        7557 :                 case TAG_SVG_ATT_height:
    1167        7557 :                         all_atts->height = (SVG_Length *)att->data;
    1168        7557 :                         break;
    1169        2128 :                 case TAG_SVG_ATT_preserveAspectRatio:
    1170        2128 :                         all_atts->preserveAspectRatio = (SVG_PreserveAspectRatio *)att->data;
    1171        2128 :                         break;
    1172         153 :                 case TAG_SVG_ATT_initialVisibility:
    1173         153 :                         all_atts->initialVisibility = (SVG_InitialVisibility *)att->data;
    1174         153 :                         break;
    1175           3 :                 case TAG_SVG_ATT_type:
    1176           3 :                         all_atts->type = (SVG_ContentType *)att->data;
    1177           3 :                         break;
    1178        1238 :                 case TAG_SVG_ATT_cx:
    1179        1238 :                         all_atts->cx = (SVG_Coordinate *)att->data;
    1180        1238 :                         break;
    1181        1238 :                 case TAG_SVG_ATT_cy:
    1182        1238 :                         all_atts->cy = (SVG_Coordinate *)att->data;
    1183        1238 :                         break;
    1184         714 :                 case TAG_SVG_ATT_r:
    1185         714 :                         all_atts->r = (SVG_Length *)att->data;
    1186         714 :                         break;
    1187           0 :                 case TAG_SVG_ATT_cursorManager_x:
    1188           0 :                         all_atts->cursorManager_x = (SVG_Length *)att->data;
    1189           0 :                         break;
    1190           0 :                 case TAG_SVG_ATT_cursorManager_y:
    1191           0 :                         all_atts->cursorManager_y = (SVG_Length *)att->data;
    1192           0 :                         break;
    1193         696 :                 case TAG_SVG_ATT_rx:
    1194         696 :                         all_atts->rx = (SVG_Length *)att->data;
    1195         696 :                         break;
    1196         534 :                 case TAG_SVG_ATT_ry:
    1197         534 :                         all_atts->ry = (SVG_Length *)att->data;
    1198         534 :                         break;
    1199          19 :                 case TAG_SVG_ATT_horiz_adv_x:
    1200          19 :                         all_atts->horiz_adv_x = (SVG_Number *)att->data;
    1201          19 :                         break;
    1202           0 :                 case TAG_SVG_ATT_horiz_origin_x:
    1203           0 :                         all_atts->horiz_origin_x = (SVG_Number *)att->data;
    1204           0 :                         break;
    1205         153 :                 case TAG_SVG_ATT_font_stretch:
    1206         153 :                         all_atts->font_stretch = (SVG_String *)att->data;
    1207         153 :                         break;
    1208           1 :                 case TAG_SVG_ATT_unicode_range:
    1209           1 :                         all_atts->unicode_range = (SVG_String *)att->data;
    1210           1 :                         break;
    1211           2 :                 case TAG_SVG_ATT_panose_1:
    1212           2 :                         all_atts->panose_1 = (SVG_String *)att->data;
    1213           2 :                         break;
    1214           1 :                 case TAG_SVG_ATT_widths:
    1215           1 :                         all_atts->widths = (SVG_String *)att->data;
    1216           1 :                         break;
    1217           1 :                 case TAG_SVG_ATT_bbox:
    1218           1 :                         all_atts->bbox = (SVG_String *)att->data;
    1219           1 :                         break;
    1220           2 :                 case TAG_SVG_ATT_units_per_em:
    1221           2 :                         all_atts->units_per_em = (SVG_Number *)att->data;
    1222           2 :                         break;
    1223           1 :                 case TAG_SVG_ATT_stemv:
    1224           1 :                         all_atts->stemv = (SVG_Number *)att->data;
    1225           1 :                         break;
    1226           1 :                 case TAG_SVG_ATT_stemh:
    1227           1 :                         all_atts->stemh = (SVG_Number *)att->data;
    1228           1 :                         break;
    1229           2 :                 case TAG_SVG_ATT_slope:
    1230           2 :                         all_atts->slope = (SVG_Number *)att->data;
    1231           2 :                         break;
    1232           1 :                 case TAG_SVG_ATT_cap_height:
    1233           1 :                         all_atts->cap_height = (SVG_Number *)att->data;
    1234           1 :                         break;
    1235           1 :                 case TAG_SVG_ATT_x_height:
    1236           1 :                         all_atts->x_height = (SVG_Number *)att->data;
    1237           1 :                         break;
    1238           1 :                 case TAG_SVG_ATT_accent_height:
    1239           1 :                         all_atts->accent_height = (SVG_Number *)att->data;
    1240           1 :                         break;
    1241           2 :                 case TAG_SVG_ATT_ascent:
    1242           2 :                         all_atts->ascent = (SVG_Number *)att->data;
    1243           2 :                         break;
    1244           2 :                 case TAG_SVG_ATT_descent:
    1245           2 :                         all_atts->descent = (SVG_Number *)att->data;
    1246           2 :                         break;
    1247           1 :                 case TAG_SVG_ATT_ideographic:
    1248           1 :                         all_atts->ideographic = (SVG_Number *)att->data;
    1249           1 :                         break;
    1250           2 :                 case TAG_SVG_ATT_alphabetic:
    1251           2 :                         all_atts->alphabetic = (SVG_Number *)att->data;
    1252           2 :                         break;
    1253           1 :                 case TAG_SVG_ATT_mathematical:
    1254           1 :                         all_atts->mathematical = (SVG_Number *)att->data;
    1255           1 :                         break;
    1256           1 :                 case TAG_SVG_ATT_hanging:
    1257           1 :                         all_atts->hanging = (SVG_Number *)att->data;
    1258           1 :                         break;
    1259           1 :                 case TAG_SVG_ATT_underline_position:
    1260           1 :                         all_atts->underline_position = (SVG_Number *)att->data;
    1261           1 :                         break;
    1262           1 :                 case TAG_SVG_ATT_underline_thickness:
    1263           1 :                         all_atts->underline_thickness = (SVG_Number *)att->data;
    1264           1 :                         break;
    1265           1 :                 case TAG_SVG_ATT_strikethrough_position:
    1266           1 :                         all_atts->strikethrough_position = (SVG_Number *)att->data;
    1267           1 :                         break;
    1268           1 :                 case TAG_SVG_ATT_strikethrough_thickness:
    1269           1 :                         all_atts->strikethrough_thickness = (SVG_Number *)att->data;
    1270           1 :                         break;
    1271           1 :                 case TAG_SVG_ATT_overline_position:
    1272           1 :                         all_atts->overline_position = (SVG_Number *)att->data;
    1273           1 :                         break;
    1274           1 :                 case TAG_SVG_ATT_overline_thickness:
    1275           1 :                         all_atts->overline_thickness = (SVG_Number *)att->data;
    1276           1 :                         break;
    1277        3703 :                 case TAG_SVG_ATT_d:
    1278        3703 :                         all_atts->d = (SVG_PathData *)att->data;
    1279        3703 :                         break;
    1280          16 :                 case TAG_SVG_ATT_unicode:
    1281          16 :                         all_atts->unicode = (SVG_String *)att->data;
    1282          16 :                         break;
    1283           1 :                 case TAG_SVG_ATT_glyph_name:
    1284           1 :                         all_atts->glyph_name = (SVG_String *)att->data;
    1285           1 :                         break;
    1286           1 :                 case TAG_SVG_ATT_arabic_form:
    1287           1 :                         all_atts->arabic_form = (SVG_String *)att->data;
    1288           1 :                         break;
    1289           1 :                 case TAG_SVG_ATT_lang:
    1290           1 :                         all_atts->lang = (SVG_LanguageIDs *)att->data;
    1291           1 :                         break;
    1292           1 :                 case TAG_SVG_ATT_u1:
    1293           1 :                         all_atts->u1 = (SVG_String *)att->data;
    1294           1 :                         break;
    1295           1 :                 case TAG_SVG_ATT_g1:
    1296           1 :                         all_atts->g1 = (SVG_String *)att->data;
    1297           1 :                         break;
    1298           0 :                 case TAG_SVG_ATT_u2:
    1299           0 :                         all_atts->u2 = (SVG_String *)att->data;
    1300           0 :                         break;
    1301           0 :                 case TAG_SVG_ATT_g2:
    1302           0 :                         all_atts->g2 = (SVG_String *)att->data;
    1303           0 :                         break;
    1304           1 :                 case TAG_SVG_ATT_k:
    1305           1 :                         all_atts->k = (SVG_Number *)att->data;
    1306           1 :                         break;
    1307         638 :                 case TAG_SVG_ATT_opacity:
    1308         638 :                         all_atts->opacity = (SVG_Number *)att->data;
    1309         638 :                         break;
    1310        1827 :                 case TAG_SVG_ATT_x1:
    1311        1827 :                         all_atts->x1 = (SVG_Coordinate *)att->data;
    1312        1827 :                         break;
    1313        1827 :                 case TAG_SVG_ATT_y1:
    1314        1827 :                         all_atts->y1 = (SVG_Coordinate *)att->data;
    1315        1827 :                         break;
    1316        1827 :                 case TAG_SVG_ATT_x2:
    1317        1827 :                         all_atts->x2 = (SVG_Coordinate *)att->data;
    1318        1827 :                         break;
    1319        1827 :                 case TAG_SVG_ATT_y2:
    1320        1827 :                         all_atts->y2 = (SVG_Coordinate *)att->data;
    1321        1827 :                         break;
    1322         664 :                 case TAG_SVG_ATT_gradientUnits:
    1323         664 :                         all_atts->gradientUnits = (SVG_GradientUnit *)att->data;
    1324         664 :                         break;
    1325           1 :                 case TAG_SVG_ATT_filterUnits:
    1326           1 :                         all_atts->focusable = (SVG_GradientUnit *)att->data;
    1327           1 :                         break;
    1328         302 :                 case TAG_SVG_ATT_spreadMethod:
    1329         302 :                         all_atts->spreadMethod = (SVG_SpreadMethod *)att->data;
    1330         302 :                         break;
    1331         302 :                 case TAG_SVG_ATT_gradientTransform:
    1332         302 :                         all_atts->gradientTransform = (SVG_Transform *)att->data;
    1333         302 :                         break;
    1334         152 :                 case TAG_SVG_ATT_pathLength:
    1335         152 :                         all_atts->pathLength = (SVG_Number *)att->data;
    1336         152 :                         break;
    1337        2210 :                 case TAG_SVG_ATT_points:
    1338        2210 :                         all_atts->points = (SVG_Points *)att->data;
    1339        2210 :                         break;
    1340           0 :                 case TAG_SVG_ATT_mediaSize:
    1341           0 :                         all_atts->mediaSize = (SVG_Number *)att->data;
    1342           0 :                         break;
    1343           0 :                 case TAG_SVG_ATT_mediaTime:
    1344           0 :                         all_atts->mediaTime = (SVG_String *)att->data;
    1345           0 :                         break;
    1346           0 :                 case TAG_SVG_ATT_mediaCharacterEncoding:
    1347           0 :                         all_atts->mediaCharacterEncoding = (SVG_String *)att->data;
    1348           0 :                         break;
    1349           0 :                 case TAG_SVG_ATT_mediaContentEncodings:
    1350           0 :                         all_atts->mediaContentEncodings = (SVG_String *)att->data;
    1351           0 :                         break;
    1352           0 :                 case TAG_SVG_ATT_bandwidth:
    1353           0 :                         all_atts->bandwidth = (SVG_Number *)att->data;
    1354           0 :                         break;
    1355         151 :                 case TAG_SVG_ATT_fx:
    1356         151 :                         all_atts->fx = (SVG_Coordinate *)att->data;
    1357         151 :                         break;
    1358         151 :                 case TAG_SVG_ATT_fy:
    1359         151 :                         all_atts->fy = (SVG_Coordinate *)att->data;
    1360         151 :                         break;
    1361           2 :                 case TAG_SVG_ATT_size:
    1362           2 :                         all_atts->size = (LASeR_Size *)att->data;
    1363           2 :                         break;
    1364           6 :                 case TAG_SVG_ATT_choice:
    1365           6 :                         all_atts->choice = (LASeR_Choice *)att->data;
    1366           6 :                         break;
    1367           2 :                 case TAG_SVG_ATT_delta:
    1368           2 :                         all_atts->delta = (LASeR_Size *)att->data;
    1369           2 :                         break;
    1370         621 :                 case TAG_SVG_ATT_offset:
    1371         621 :                         all_atts->offset = (SVG_Number *)att->data;
    1372         621 :                         break;
    1373           0 :                 case TAG_SVG_ATT_syncBehaviorDefault:
    1374           0 :                         all_atts->syncBehaviorDefault = (SMIL_SyncBehavior *)att->data;
    1375           0 :                         break;
    1376           0 :                 case TAG_SVG_ATT_syncToleranceDefault:
    1377           0 :                         all_atts->syncToleranceDefault = (SMIL_SyncTolerance *)att->data;
    1378           0 :                         break;
    1379        1941 :                 case TAG_SVG_ATT_viewBox:
    1380        1941 :                         all_atts->viewBox = (SVG_ViewBox *)att->data;
    1381        1941 :                         break;
    1382         153 :                 case TAG_SVG_ATT_zoomAndPan:
    1383         153 :                         all_atts->zoomAndPan = (SVG_ZoomAndPan *)att->data;
    1384         153 :                         break;
    1385        1578 :                 case TAG_SVG_ATT_version:
    1386        1578 :                         all_atts->version = (SVG_String *)att->data;
    1387        1578 :                         break;
    1388         586 :                 case TAG_SVG_ATT_baseProfile:
    1389         586 :                         all_atts->baseProfile = (SVG_String *)att->data;
    1390         586 :                         break;
    1391           0 :                 case TAG_SVG_ATT_contentScriptType:
    1392           0 :                         all_atts->contentScriptType = (SVG_ContentType *)att->data;
    1393           0 :                         break;
    1394           0 :                 case TAG_SVG_ATT_snapshotTime:
    1395           0 :                         all_atts->snapshotTime = (SVG_Clock *)att->data;
    1396           0 :                         break;
    1397           0 :                 case TAG_SVG_ATT_timelineBegin:
    1398           0 :                         all_atts->timelineBegin = (SVG_TimelineBegin *)att->data;
    1399           0 :                         break;
    1400           0 :                 case TAG_SVG_ATT_playbackOrder:
    1401           0 :                         all_atts->playbackOrder = (SVG_PlaybackOrder *)att->data;
    1402           0 :                         break;
    1403           0 :                 case TAG_SVG_ATT_editable:
    1404           0 :                         all_atts->editable = (SVG_Boolean *)att->data;
    1405           0 :                         break;
    1406       11020 :                 case TAG_SVG_ATT_text_x:
    1407       11020 :                         all_atts->text_x = (SVG_Coordinates *)att->data;
    1408       11020 :                         break;
    1409        5167 :                 case TAG_SVG_ATT_text_y:
    1410        5167 :                         all_atts->text_y = (SVG_Coordinates *)att->data;
    1411        5167 :                         break;
    1412         152 :                 case TAG_SVG_ATT_text_rotate:
    1413         152 :                         all_atts->text_rotate = (SVG_Numbers *)att->data;
    1414         152 :                         break;
    1415           0 :                 case TAG_SVG_ATT_transformBehavior:
    1416           0 :                         all_atts->transformBehavior = (SVG_TransformBehavior *)att->data;
    1417           0 :                         break;
    1418           0 :                 case TAG_SVG_ATT_overlay:
    1419           0 :                         all_atts->overlay = (SVG_Overlay *)att->data;
    1420           0 :                         break;
    1421         153 :                 case TAG_SVG_ATT_fullscreen:
    1422         153 :                         all_atts->fullscreen = (SVG_Boolean *)att->data;
    1423         153 :                         break;
    1424         452 :                 case TAG_SVG_ATT_motionTransform:
    1425         452 :                         all_atts->motionTransform = (SVG_Motion *)att->data;
    1426         452 :                         break;
    1427             : 
    1428           0 :                 case TAG_GSVG_ATT_useAsPrimary:
    1429           0 :                         all_atts->gpac_useAsPrimary = (SVG_Boolean *)att->data;
    1430           0 :                         break;
    1431           0 :                 case TAG_GSVG_ATT_depthOffset:
    1432           0 :                         all_atts->gpac_depthOffset = (SVG_Number *)att->data;
    1433           0 :                         break;
    1434           0 :                 case TAG_GSVG_ATT_depthGain:
    1435           0 :                         all_atts->gpac_depthGain = (SVG_Number *)att->data;
    1436           0 :                         break;
    1437             :                 }
    1438             : 
    1439      161424 :                 att = att->next;
    1440             :         }
    1441             : }
    1442             : 
    1443             : #endif
    1444             : 

Generated by: LCOV version 1.13