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 )