mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-17 17:52:43 +03:00
17be8cf216
The netsurf core is driven from numerous operation tables most of which are now set through a common netsurf_register() interface. The font and plotting interfaces are currently separate and unlike all the other operation tables are modified for differing contexts. This change moves the font operations alongside all the other operations table and remove unnecessary interaction with the renderers font internals. Further this also removes the need for css internals to be visible in frontends.
162 lines
3.8 KiB
C
162 lines
3.8 KiB
C
/*
|
|
* 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
|
|
*
|
|
* Renderer internal font handling implementation.
|
|
*/
|
|
|
|
#include "css/css.h"
|
|
#include "css/utils.h"
|
|
#include "utils/nsoption.h"
|
|
|
|
#include "render/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 render/font_internal.h */
|
|
void font_plot_style_from_css(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));
|
|
|
|
css_computed_font_size(css, &length, &unit);
|
|
fstyle->size = FIXTOINT(FMUL(nscss_len2pt(length, unit),
|
|
INTTOFIX(FONT_SIZE_SCALE)));
|
|
|
|
/* Clamp font size to configured minimum */
|
|
if (fstyle->size < (nsoption_int(font_min_size) * FONT_SIZE_SCALE) / 10)
|
|
fstyle->size = (nsoption_int(font_min_size) * FONT_SIZE_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;
|
|
}
|