summaryrefslogtreecommitdiff
path: root/amiga/font_bitmap.c
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2016-01-13 18:32:17 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2016-01-13 18:32:17 +0000
commitbc8bf0e57517f30d5143004d6b0b679552a74870 (patch)
treee1b487e20defc12909a258c002b7fbd2ffe6c38a /amiga/font_bitmap.c
parent93fbed0f2cdbd84def2af8c444f2a63a7e9f5f22 (diff)
downloadnetsurf-bc8bf0e57517f30d5143004d6b0b679552a74870.tar.gz
netsurf-bc8bf0e57517f30d5143004d6b0b679552a74870.tar.bz2
Fix the bitmap font layout a bit
Diffstat (limited to 'amiga/font_bitmap.c')
-rw-r--r--amiga/font_bitmap.c75
1 files changed, 58 insertions, 17 deletions
diff --git a/amiga/font_bitmap.c b/amiga/font_bitmap.c
index 01815effc..eed43dbd2 100644
--- a/amiga/font_bitmap.c
+++ b/amiga/font_bitmap.c
@@ -100,20 +100,38 @@ static void ami_font_bm_close(struct TextFont *bmfont)
CloseFont(bmfont);
}
+static size_t ami_font_bm_convert_local_to_utf8_offset(const char *utf8string, int length, size_t offset)
+{
+ size_t chr = 0;
+
+ for(int i = 0; i < offset; i++) {
+ chr = utf8_next(utf8string, length, chr);
+ }
+
+ return chr;
+}
+
+
bool amiga_bm_nsfont_width(const plot_font_style_t *fstyle,
const char *string, size_t length,
int *width)
{
- *width = length;
+ char *localtext = NULL;
if((glob == NULL) || (glob->rp == NULL)) return false;
+ *width = length;
struct TextFont *bmfont = ami_font_bm_open(glob->rp, fstyle);
-
if(bmfont == NULL) return false;
-// convert to local charset
- *width = TextLength(glob->rp, string, length);
+ if(utf8_to_local_encoding(string, length, &localtext) != NSERROR_OK) {
+ ami_font_bm_close(bmfont);
+ return false;
+ }
+
+ *width = TextLength(glob->rp, localtext, strlen(localtext));
+ free(localtext);
+
ami_font_bm_close(bmfont);
return true;
@@ -137,19 +155,25 @@ bool amiga_bm_nsfont_position_in_string(const plot_font_style_t *fstyle,
{
struct TextExtent extent;
struct TextFont *bmfont;
+ char *localtext = NULL;
+ size_t co = 0;
if((glob == NULL) || (glob->rp == NULL)) return false;
bmfont = ami_font_bm_open(glob->rp, fstyle);
-
if(bmfont == NULL) return false;
- // convert to local charset
- *char_offset = TextFit(glob->rp, string, length,
- &extent, NULL, 1, x, 32767);
+ if(utf8_to_local_encoding(string, length, &localtext) != NSERROR_OK) {
+ ami_font_bm_close(bmfont);
+ return false;
+ }
+ co = TextFit(glob->rp, localtext, strlen(localtext),
+ &extent, NULL, 1, x, 32767);
+ *char_offset = ami_font_bm_convert_local_to_utf8_offset(string, length, co);
*actual_x = extent.te_Extent.MaxX;
+ free(localtext);
ami_font_bm_close(bmfont);
return true;
@@ -184,33 +208,50 @@ bool amiga_bm_nsfont_split(const plot_font_style_t *fstyle,
int x, size_t *char_offset, int *actual_x)
{
struct TextExtent extent;
- ULONG co;
+ size_t co, offset;
char *charp;
+ char *localtext;
if((glob == NULL) || (glob->rp == NULL)) return false;
struct TextFont *bmfont = ami_font_bm_open(glob->rp, fstyle);
-
if(bmfont == NULL) return false;
- co = TextFit(glob->rp, string, length,
+ if(utf8_to_local_encoding(string, length, &localtext) != NSERROR_OK) {
+ ami_font_bm_close(bmfont);
+ return false;
+ }
+
+ offset = TextFit(glob->rp, localtext, strlen(localtext),
&extent, NULL, 1, x, 32767);
- charp = string + co;
+ co = offset;
+ charp = localtext + co;
+
- while(((*charp != ' ')) && (charp > string)) {
+ while((*charp != ' ') && (co > 0)) {
charp--;
co--;
}
- if(co > 0) {
- *actual_x = TextLength(glob->rp, string, co);
- *char_offset = co;
+ if(co == 0) {
+ co = offset;
+ charp = localtext + co;
+ while((*charp != ' ') && (co < strlen(localtext))) {
+ charp++;
+ co++;
+ }
+ }
+
+ if((co > 0) && (co < strlen(localtext))) {
+ *actual_x = TextLength(glob->rp, localtext, co);
+ *char_offset = ami_font_bm_convert_local_to_utf8_offset(string, length, co);
} else {
*actual_x = x;
*char_offset = length;
}
+ free(localtext);
ami_font_bm_close(bmfont);
return true;
@@ -224,7 +265,7 @@ ULONG ami_font_bm_text(struct RastPort *rp, const char *string, ULONG length,
if(bmfont == NULL) return 0;
if(utf8_to_local_encoding(string, length, &localtext) == NSERROR_OK) {
Move(rp, dx, dy);
- Text(rp, localtext, length);
+ Text(rp, localtext, strlen(localtext));
free(localtext);
}