double _rsvg_css_normalize_length (const RsvgLength * in, RsvgDrawingCtx * ctx, char dir) { if (in->factor == '\0') return in->length; else if (in->factor == 'p') { if (dir == 'h') return in->length * ctx->vb.w; if (dir == 'v') return in->length * ctx->vb.h; if (dir == 'o') return in->length * rsvg_viewport_percentage (ctx->vb.w, ctx->vb.h); } else if (in->factor == 'm' || in->factor == 'x') { double font = _rsvg_css_hand_normalize_length (&rsvg_state_current (ctx)->font_size, ctx->dpi_y, ctx->vb.h, 1); if (in->factor == 'm') return in->length * font; else return in->length * font / 2.; } else if (in->factor == 'i') { if (dir == 'h') return in->length * ctx->dpi_x; if (dir == 'v') return in->length * ctx->dpi_y; if (dir == 'o') return in->length * rsvg_viewport_percentage (ctx->dpi_x, ctx->dpi_y); } else if (in->factor == 'l') { /* todo: "larger" */ } else if (in->factor == 's') { /* todo: "smaller" */ } return 0; }
double _rsvg_css_normalize_length (const RsvgLength * in, RsvgDrawingCtx * ctx, char dir) { if (in->factor == '\0') return in->length; else if (in->factor == 'p') { if (dir == 'h') return in->length * ctx->vb.rect.width; if (dir == 'v') return in->length * ctx->vb.rect.height; if (dir == 'o') return in->length * rsvg_viewport_percentage (ctx->vb.rect.width, ctx->vb.rect.height); } else if (in->factor == 'm' || in->factor == 'x') { double font = _rsvg_css_normalize_font_size (rsvg_current_state (ctx), ctx); if (in->factor == 'm') return in->length * font; else return in->length * font / 2.; } else if (in->factor == 'i') { if (dir == 'h') return in->length * ctx->dpi_x; if (dir == 'v') return in->length * ctx->dpi_y; if (dir == 'o') return in->length * rsvg_viewport_percentage (ctx->dpi_x, ctx->dpi_y); } else if (in->factor == 'l') { /* todo: "larger" */ } else if (in->factor == 's') { /* todo: "smaller" */ } return 0; }