You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
3.9 KiB
166 lines
3.9 KiB
/*
|
|
* Copyright 2009 John-Mark Bell <jmb@netsurf-browser.org>
|
|
*
|
|
* This file is part of NetSurf, http://www.netsurf-browser.org/
|
|
*
|
|
* NetSurf is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* NetSurf is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* \file
|
|
*
|
|
* HTML internal font handling implementation.
|
|
*/
|
|
|
|
#include "utils/nsoption.h"
|
|
#include "netsurf/plot_style.h"
|
|
#include "css/utils.h"
|
|
|
|
#include "html/font.h"
|
|
|
|
/**
|
|
* Map a generic CSS font family to a generic plot font family
|
|
*
|
|
* \param css Generic CSS font family
|
|
* \return Plot font family
|
|
*/
|
|
static plot_font_generic_family_t
|
|
plot_font_generic_family(enum css_font_family_e css)
|
|
{
|
|
plot_font_generic_family_t plot;
|
|
|
|
switch (css) {
|
|
case CSS_FONT_FAMILY_SERIF:
|
|
plot = PLOT_FONT_FAMILY_SERIF;
|
|
break;
|
|
case CSS_FONT_FAMILY_MONOSPACE:
|
|
plot = PLOT_FONT_FAMILY_MONOSPACE;
|
|
break;
|
|
case CSS_FONT_FAMILY_CURSIVE:
|
|
plot = PLOT_FONT_FAMILY_CURSIVE;
|
|
break;
|
|
case CSS_FONT_FAMILY_FANTASY:
|
|
plot = PLOT_FONT_FAMILY_FANTASY;
|
|
break;
|
|
case CSS_FONT_FAMILY_SANS_SERIF:
|
|
default:
|
|
plot = PLOT_FONT_FAMILY_SANS_SERIF;
|
|
break;
|
|
}
|
|
|
|
return plot;
|
|
}
|
|
|
|
/**
|
|
* Map a CSS font weight to a plot weight value
|
|
*
|
|
* \param css CSS font weight
|
|
* \return Plot weight
|
|
*/
|
|
static int plot_font_weight(enum css_font_weight_e css)
|
|
{
|
|
int weight;
|
|
|
|
switch (css) {
|
|
case CSS_FONT_WEIGHT_100:
|
|
weight = 100;
|
|
break;
|
|
case CSS_FONT_WEIGHT_200:
|
|
weight = 200;
|
|
break;
|
|
case CSS_FONT_WEIGHT_300:
|
|
weight = 300;
|
|
break;
|
|
case CSS_FONT_WEIGHT_400:
|
|
case CSS_FONT_WEIGHT_NORMAL:
|
|
default:
|
|
weight = 400;
|
|
break;
|
|
case CSS_FONT_WEIGHT_500:
|
|
weight = 500;
|
|
break;
|
|
case CSS_FONT_WEIGHT_600:
|
|
weight = 600;
|
|
break;
|
|
case CSS_FONT_WEIGHT_700:
|
|
case CSS_FONT_WEIGHT_BOLD:
|
|
weight = 700;
|
|
break;
|
|
case CSS_FONT_WEIGHT_800:
|
|
weight = 800;
|
|
break;
|
|
case CSS_FONT_WEIGHT_900:
|
|
weight = 900;
|
|
break;
|
|
}
|
|
|
|
return weight;
|
|
}
|
|
|
|
/**
|
|
* Map a CSS font style and font variant to plot font flags
|
|
*
|
|
* \param style CSS font style
|
|
* \param variant CSS font variant
|
|
* \return Computed plot flags
|
|
*/
|
|
static plot_font_flags_t plot_font_flags(enum css_font_style_e style,
|
|
enum css_font_variant_e variant)
|
|
{
|
|
plot_font_flags_t flags = FONTF_NONE;
|
|
|
|
if (style == CSS_FONT_STYLE_ITALIC)
|
|
flags |= FONTF_ITALIC;
|
|
else if (style == CSS_FONT_STYLE_OBLIQUE)
|
|
flags |= FONTF_OBLIQUE;
|
|
|
|
if (variant == CSS_FONT_VARIANT_SMALL_CAPS)
|
|
flags |= FONTF_SMALLCAPS;
|
|
|
|
return flags;
|
|
}
|
|
|
|
|
|
/* exported function documented in html/font.h */
|
|
void font_plot_style_from_css(
|
|
const css_unit_ctx *unit_len_ctx,
|
|
const css_computed_style *css,
|
|
plot_font_style_t *fstyle)
|
|
{
|
|
lwc_string **families;
|
|
css_fixed length = 0;
|
|
css_unit unit = CSS_UNIT_PX;
|
|
css_color col;
|
|
|
|
fstyle->family = plot_font_generic_family(
|
|
css_computed_font_family(css, &families));
|
|
fstyle->families = families;
|
|
|
|
css_computed_font_size(css, &length, &unit);
|
|
fstyle->size = FIXTOINT(FMUL(css_unit_font_size_len2pt(css,
|
|
unit_len_ctx, length, unit),
|
|
INTTOFIX(PLOT_STYLE_SCALE)));
|
|
|
|
/* Clamp font size to configured minimum */
|
|
if (fstyle->size < (nsoption_int(font_min_size) * PLOT_STYLE_SCALE) / 10)
|
|
fstyle->size = (nsoption_int(font_min_size) * PLOT_STYLE_SCALE) / 10;
|
|
|
|
fstyle->weight = plot_font_weight(css_computed_font_weight(css));
|
|
fstyle->flags = plot_font_flags(css_computed_font_style(css),
|
|
css_computed_font_variant(css));
|
|
|
|
css_computed_color(css, &col);
|
|
fstyle->foreground = nscss_color_to_ns(col);
|
|
fstyle->background = 0;
|
|
}
|