Prima
view release on metacpan or search on metacpan
unix/font.c view on Meta::CPAN
if ( !kf || !kf-> id) {
dump_font( font);
if ( DISP) warn( "internal error (kf:%p)", kf); /* the font was not cached, can't be */
return false;
}
reload = XX-> font != kf && XX-> font != NULL;
if ( reload) {
kf-> refCnt++;
if ( XX-> font && ( --XX-> font-> refCnt <= 0)) {
prima_free_rotated_entry( XX-> font);
XX-> font-> refCnt = 0;
}
}
XX-> font = kf;
if ( XX-> flags. paint) {
XX-> flags. reload_font = reload;
XSetFont( DISP, XX-> gc, XX-> font-> id);
XCHECKPOINT;
}
return true;
}
Bool
apc_menu_set_font( Handle self, PFont font)
{
DEFMM;
Bool xft_metrics = 0;
PCachedFont kf = NULL;
font-> direction = 0; /* skip unnecessary logic */
#ifdef USE_XFT
if ( guts. use_xft) {
kf = prima_xft_get_cache( font, NULL);
if ( kf) xft_metrics = 1;
}
#endif
if ( !kf) {
kf = prima_find_known_font( font, false, false);
if ( !kf || !kf-> id) {
dump_font( font);
warn( "internal error (kf:%p)", kf); /* the font was not cached, can't be */
return false;
}
}
XX-> font = kf;
if ( !xft_metrics) {
XX-> guillemots = XTextWidth( kf-> fs, ">>", 2);
} else {
#ifdef USE_XFT
XX-> guillemots = prima_xft_get_text_width( kf, ">>", 2, toAddOverhangs, NULL, NULL);
#endif
}
if ( !XX-> type. popup && X_WINDOW) {
if (( kf-> font. height + 4) != X(PComponent(self)-> owner)-> menuHeight) {
prima_window_reset_menu( PComponent(self)-> owner, kf-> font. height + MENU_ITEM_GAP * 2);
XResizeWindow( DISP, X_WINDOW, XX-> w-> sz.x, XX-> w-> sz.y = kf-> font. height + MENU_ITEM_GAP * 2);
} else if ( !XX-> paint_pending) {
XClearArea( DISP, X_WINDOW, 0, 0, XX-> w-> sz.x, XX-> w-> sz.y, true);
XX-> paint_pending = true;
}
}
return true;
}
int
apc_gp_get_glyph_outline( Handle self, int index, int flags, int ** buffer)
{
#ifdef USE_XFT
if ( guts.use_xft && X(self)-> font-> xft)
return prima_xft_get_glyph_outline( self, index, flags, buffer);
#endif
return -1;
}
Bool
prima_update_rotated_fonts( PCachedFont f, const char * text, int len, Bool wide, double direction, Matrix matrix, PRotatedFont * result,
Bool * ok_to_not_rotate)
{
Fixed fm[4], im[4];
Matrix cm;
PRotatedFont * pr = &f-> rotated;
PRotatedFont r = NULL;
int i;
while ( direction < 0) direction += 360.0;
while ( direction > 360.0) direction -= 360.0;
/* granulate direction and matrix */
{
int i;
Matrix m1, inv;
double d, ad, bc;
prima_matrix_set_identity(m1);
if ( direction != 0.0 ) {
double s = sin( direction / 57.29577951);
double c = cos( direction / 57.29577951);
m1[0] = c;
m1[1] = s;
m1[2] = -s;
m1[3] = c;
}
if ( prima_matrix_is_identity(matrix)) {
COPY_MATRIX(m1, cm);
} else {
Matrix m2;
COPY_MATRIX_WITHOUT_TRANSLATION( matrix, m2 );
prima_matrix_multiply( m1, m2, cm);
}
/* can inverse? */
ad = cm[0] * cm[3];
bc = cm[1] * cm[2];
( run in 0.772 second using v1.01-cache-2.11-cpan-364913b4093 )