From 5bd9b45758a91f7b792d7da5657cfcec9b081481 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Tue, 3 Feb 2015 19:51:55 +0000 Subject: File missing from previous commit --- amiga/font_bitmap.c | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 amiga/font_bitmap.c (limited to 'amiga') diff --git a/amiga/font_bitmap.c b/amiga/font_bitmap.c new file mode 100644 index 000000000..d620ea90c --- /dev/null +++ b/amiga/font_bitmap.c @@ -0,0 +1,215 @@ +/* + * Copyright 2008 - 2015 Chris Young + * + * 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 . + */ + +#include "amiga/os3support.h" + +#include + +#include +#include +#include +#include +#include + +#include + +#include "utils/log.h" +#include "utils/utf8.h" +#include "utils/utils.h" +#include "utils/nsoption.h" +#include "desktop/browser.h" +#include "desktop/font.h" +#include "desktop/gui_window.h" + +#include "amiga/font.h" +#include "amiga/gui.h" +#include "amiga/utf8.h" + +static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_style_t *fstyle) +{ + struct TextFont *bmfont = NULL; + struct TextAttr tattr; + char *fontname, font; + + if(rp == NULL) return NULL; + + switch(fstyle->family) + { + case PLOT_FONT_FAMILY_SANS_SERIF: + fontname = nsoption_charp(font_sans); + break; + case PLOT_FONT_FAMILY_SERIF: + fontname = nsoption_charp(font_serif); + break; + case PLOT_FONT_FAMILY_MONOSPACE: + fontname = nsoption_charp(font_mono); + break; + case PLOT_FONT_FAMILY_CURSIVE: + fontname = nsoption_charp(font_cursive); + break; + case PLOT_FONT_FAMILY_FANTASY: + fontname = nsoption_charp(font_fantasy); + break; + default: + return NULL; + break; + } + + tattr.ta_Style = FS_NORMAL; + + if (fstyle->flags & FONTF_OBLIQUE) + tattr.ta_Style = FSF_ITALIC; + + if (fstyle->flags & FONTF_ITALIC) + tattr.ta_Style = FSF_ITALIC; + + if (fstyle->weight >= 700) + tattr.ta_Style |= FSF_BOLD; + + if(font = ASPrintf("%s.font", fontname)) { + tattr.ta_Name = font; + tattr.ta_YSize = fstyle->size / FONT_SIZE_SCALE; + + if(bmfont = OpenDiskFont(&tattr)) { + SetRPAttrs(rp, RPTAG_Font, bmfont, TAG_DONE); + } + FreeVec(font); + } + + return bmfont; +} + +static void ami_font_bm_close(struct TextFont *bmfont) +{ + CloseFont(bmfont); +} + +bool amiga_bm_nsfont_width(const plot_font_style_t *fstyle, + const char *string, size_t length, + int *width) +{ + struct TextFont *bmfont = ami_font_bm_open(glob->rp, fstyle); +// convert to local charset + *width = TextLength(glob->rp, string, length); + ami_font_bm_close(bmfont); + + return true; +} + +/** + * Find the position in a string where an x coordinate falls. + * + * \param fstyle style for this text + * \param string UTF-8 string to measure + * \param length length of string + * \param x x coordinate to search for + * \param char_offset updated to offset in string of actual_x, [0..length] + * \param actual_x updated to x coordinate of character closest to x + * \return true on success, false on error and error reported + */ + +bool amiga_bm_nsfont_position_in_string(const plot_font_style_t *fstyle, + const char *string, size_t length, + int x, size_t *char_offset, int *actual_x) +{ + struct TextExtent extent; + struct TextFont *bmfont; + + bmfont = ami_font_bm_open(glob->rp, fstyle); + + // convert to local charset + *char_offset = TextFit(glob->rp, string, length, + &extent, NULL, 1, x, 32767); + + *actual_x = extent.te_Extent.MaxX; + + ami_font_bm_close(bmfont); + + return true; +} + + +/** + * Find where to split a string to make it fit a width. + * + * \param fstyle style for this text + * \param string UTF-8 string to measure + * \param length length of string + * \param x width available + * \param char_offset updated to offset in string of actual_x, [1..length] + * \param actual_x updated to x coordinate of character closest to x + * \return true on success, false on error and error reported + * + * On exit, char_offset indicates first character after split point. + * + * Note: char_offset of 0 should never be returned. + * + * Returns: + * char_offset giving split point closest to x, where actual_x <= x + * else + * char_offset giving split point closest to x, where actual_x > x + * + * Returning char_offset == length means no split possible + */ + +bool amiga_bm_nsfont_split(const plot_font_style_t *fstyle, + const char *string, size_t length, + int x, size_t *char_offset, int *actual_x) +{ + struct TextExtent extent; + ULONG co; + char *charp; + struct TextFont *bmfont = ami_font_bm_open(glob->rp, fstyle); + + co = TextFit(glob->rp, string, length, + &extent, NULL, 1, x, 32767); + + charp = string + co; + + while(((*charp != ' ')) && (charp > string)) { + charp--; + co--; + } + + *char_offset = co; + if(string && co) { + *actual_x = TextLength(glob->rp, string, co); + } else { + *actual_x = 0; + } + + ami_font_bm_close(bmfont); + + return true; +} + +ULONG ami_font_bm_text(struct RastPort *rp, const char *string, ULONG length, + const plot_font_style_t *fstyle, ULONG dx, ULONG dy) +{ + struct TextFont *bmfont = ami_font_bm_open(rp, fstyle); + char *localtext = NULL; + if(bmfont == NULL) return 0; + if(utf8_to_local_encoding(string, length, &localtext) == NSERROR_OK) { + Move(rp, dx, dy); + Text(rp, localtext, length); + free(localtext); + } + + return 0; +} + -- cgit v1.2.3