Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4437 → Rev 4438

/contrib/media/fplay/winlib/fontlib.c
0,0 → 1,184
 
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <memory.h>
//#include "font_droid.h"
#include <ft2build.h>
#include FT_FREETYPE_H
#include <pixlib2.h>
 
extern char res_def_font[];
 
typedef struct
{
int l;
int t;
int r;
int b;
}rect_t;
 
typedef unsigned int color_t;
 
unsigned int ansi2utf32(unsigned char ch);
 
void my_draw_bitmap(bitmap_t *win, FT_Bitmap *bitmap, int dstx, int dsty, int col)
{
uint8_t *dst;
uint8_t *src, *tmpsrc;
 
uint32_t *tmpdst;
int i, j;
 
dst = win->data + dsty * win->pitch + dstx*4;
src = bitmap->buffer;
 
for( i = 0; i < bitmap->rows; i++ )
{
tmpdst = (uint32_t*)dst;
tmpsrc = src;
 
dst+= win->pitch;
src+= bitmap->pitch;
 
for( j = 0; j < bitmap->width; j++)
{
int a = *tmpsrc++;
int sr, sg, sb;
int dr, dg, db;
 
if( a != 0) a++;
 
db = *tmpdst & 0xFF;
dg = (*tmpdst >> 8) & 0xFF;
dr = (*tmpdst >> 16) &0xFF;
 
sb = col & 0xFF;
sg = (col >> 8) & 0xFF;
sr = (col >> 16) &0xFF;
 
db = (a*sb + db*(256-a))/256;
dg = (a*sg + dg*(256-a))/256;
dr = (a*sr + dr*(256-a))/256;
 
*tmpdst++ = 0xFF000000|(dr<<16)|(dg<<8)|db;
};
}
};
 
 
int draw_text_ext(bitmap_t *winbitmap, FT_Face face, char *text, rect_t *rc, int color)
{
FT_UInt glyph_index;
FT_Bool use_kerning = 0;
FT_UInt previous;
int x, y, w;
char ch;
int err = 0;
 
use_kerning = FT_HAS_KERNING( face );
previous = 0;
 
x = rc->l << 6;
y = rc->b;
 
w = (rc->r - rc->l) << 6;
 
while( ch = *text++ )
{
glyph_index = FT_Get_Char_Index( face, ansi2utf32(ch) );
 
if ( use_kerning && previous && glyph_index )
{
FT_Vector delta;
FT_Get_Kerning( face, previous, glyph_index, FT_KERNING_DEFAULT, &delta );
x += delta.x ;
}
 
if( x + face->glyph->advance.x > w)
break;
 
err = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT );
if ( err )
continue;
 
err = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_NORMAL );
if ( err )
continue;
 
my_draw_bitmap(winbitmap, &face->glyph->bitmap, (x >> 6) + face->glyph->bitmap_left,
y - face->glyph->bitmap_top, color);
 
x += face->glyph->advance.x;
previous = glyph_index;
};
 
return err;
};
 
 
int init_fontlib()
{
int err;
 
static FT_Library library;
FT_Face face = NULL;
 
err = FT_Init_FreeType( &library );
if ( err )
{
printf("an error occurred during FreeType initialization\n");
goto done;
}
 
// err = FT_New_Face( library, "/hd0/1/IstokWeb.ttf", 0, &face );
 
err = FT_New_Memory_Face( library, res_def_font, 277996, 0, &face );
printf("err %d\n", err);
if ( err == FT_Err_Unknown_File_Format )
{
printf("font format is unsupported\n");
goto done;
 
}
else if ( err )
{
printf("font file could not be read or broken\n");
goto done;
 
}
 
err = FT_Set_Char_Size( face, 0, 11*64, 96, 96 );
// err = FT_Set_Pixel_Sizes( face, 0, 100 );
 
done:
 
return (int)face;
};
 
// draw_text(face,"/hd0/1/demo", 10, 80, 0x00000000);
 
 
unsigned int ansi2utf32(unsigned char ch)
{
if(ch < 0x80)
return ch;
 
if(ch < 0xB0)
return 0x410-0x80 + ch;
 
if(ch < 0xE0)
return 0;
 
if(ch < 0xF0)
return 0x440-0xE0 + ch;
 
if(ch == 0xF0)
return 0x401;
else if(ch==0xF1)
return 0x451;
else return 0;
}