Example #1
0
  tt_size_run_prep( TT_Size  size )
  {
    TT_Face         face = (TT_Face)size->root.face;
    TT_ExecContext  exec;
    FT_Error        error;


    /* debugging instances have their own context */
    if ( size->debug )
      exec = size->context;
    else
      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;

    if ( !exec )
      return TT_Err_Could_Not_Find_Context;

    TT_Load_Context( exec, face, size );

    exec->callTop = 0;
    exec->top     = 0;

    exec->instruction_trap = FALSE;

    TT_Set_CodeRange( exec,
                      tt_coderange_cvt,
                      face->cvt_program,
                      face->cvt_program_size );

    TT_Clear_CodeRange( exec, tt_coderange_glyph );

    if ( face->cvt_program_size > 0 )
    {
      error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );

      if ( !error && !size->debug )
        error = face->interpreter( exec );
    }
    else
      error = TT_Err_Ok;

    /* save as default graphics state */
    size->GS = exec->GS;

    TT_Save_Context( exec, size );

    return error;
  }
Example #2
0
LOCAL_DEF
FT_Error  TT_Reset_Size(TT_Size size)
{
	TT_Face face;
	FT_Error error = TT_Err_Ok;

	FT_Size_Metrics  *metrics;


	if(size->ttmetrics.valid)
	{
		return TT_Err_Ok;
	}

	face = (TT_Face)size->root.face;

	metrics = &size->root.metrics;

	if(metrics->x_ppem < 1 || metrics->y_ppem < 1)
	{
		return TT_Err_Invalid_PPem;
	}

	/* compute new transformation */
	if(metrics->x_ppem >= metrics->y_ppem)
	{
		size->ttmetrics.scale   = metrics->x_scale;
		size->ttmetrics.ppem    = metrics->x_ppem;
		size->ttmetrics.x_ratio = 0x10000L;
		size->ttmetrics.y_ratio = FT_MulDiv(metrics->y_ppem,
		                                    0x10000L,
		                                    metrics->x_ppem);
	}
	else
	{
		size->ttmetrics.scale   = metrics->y_scale;
		size->ttmetrics.ppem    = metrics->y_ppem;
		size->ttmetrics.x_ratio = FT_MulDiv(metrics->x_ppem,
		                                    0x10000L,
		                                    metrics->y_ppem);
		size->ttmetrics.y_ratio = 0x10000L;
	}

	/* Compute root ascender, descender, test height, and max_advance */
	metrics->ascender    = (FT_MulFix(face->root.ascender,
	                                  metrics->y_scale) + 32) & - 64;
	metrics->descender   = (FT_MulFix(face->root.descender,
	                                  metrics->y_scale) + 32) & - 64;
	metrics->height      = (FT_MulFix(face->root.height,
	                                  metrics->y_scale) + 32) & - 64;
	metrics->max_advance = (FT_MulFix(face->root.max_advance_width,
	                                  metrics->x_scale) + 32) & - 64;

#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER

	{
		TT_ExecContext exec;
		FT_UInt i, j;


		/* Scale the cvt values to the new ppem.          */
		/* We use by default the y ppem to scale the CVT. */
		for(i = 0; i < size->cvt_size; i++)
			size->cvt[i] = FT_MulFix(face->cvt[i], size->ttmetrics.scale);

		/* All twilight points are originally zero */
		for(j = 0; j < size->twilight.n_points; j++)
		{
			size->twilight.org[j].x = 0;
			size->twilight.org[j].y = 0;
			size->twilight.cur[j].x = 0;
			size->twilight.cur[j].y = 0;
		}

		/* clear storage area */
		for(i = 0; i < size->storage_size; i++)
			size->storage[i] = 0;

		size->GS = tt_default_graphics_state;

		/* get execution context and run prep program */
		if(size->debug)
		{
			exec = size->context;
		}
		else
		{
			exec = TT_New_Context(face);
		}

		/* debugging instances have their own context */

		if(!exec)
		{
			return TT_Err_Could_Not_Find_Context;
		}

		TT_Load_Context(exec, face, size);

		TT_Set_CodeRange(exec,
		                 tt_coderange_cvt,
		                 face->cvt_program,
		                 face->cvt_program_size);

		TT_Clear_CodeRange(exec, tt_coderange_glyph);

		exec->instruction_trap = FALSE;

		exec->top     = 0;
		exec->callTop = 0;

		if(face->cvt_program_size > 0)
		{
			error = TT_Goto_CodeRange(exec, tt_coderange_cvt, 0);

			if(error)
			{
				goto End;
			}

			if(!size->debug)
			{
				error = face->interpreter(exec);
			}
		}
		else
		{
			error = TT_Err_Ok;
		}

		size->GS = exec->GS;
		/* save default graphics state */

End:
		TT_Save_Context(exec, size);

		if(!size->debug)
		{
			TT_Done_Context(exec);
		}

		/* debugging instances keep their context */
	}

#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */

	if(!error)
	{
		size->ttmetrics.valid = TRUE;
	}

	return error;
}
Example #3
0
LOCAL_DEF
FT_Error  TT_Init_Size(TT_Size size)
{
	FT_Error error = TT_Err_Ok;


#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER

	TT_Face face   = (TT_Face)size->root.face;
	FT_Memory memory = face->root.memory;
	FT_Int i;

	TT_ExecContext exec;
	FT_UShort n_twilight;
	TT_MaxProfile  *maxp = &face->max_profile;


	size->ttmetrics.valid = FALSE;

	size->max_function_defs    = maxp->maxFunctionDefs;
	size->max_instruction_defs = maxp->maxInstructionDefs;

	size->num_function_defs    = 0;
	size->num_instruction_defs = 0;

	size->max_func = 0;
	size->max_ins  = 0;

	size->cvt_size     = face->cvt_size;
	size->storage_size = maxp->maxStorage;

	/* Set default metrics */
	{
		FT_Size_Metrics  *metrics  = &size->root.metrics;
		TT_Size_Metrics  *metrics2 = &size->ttmetrics;


		metrics->x_ppem = 0;
		metrics->y_ppem = 0;

		metrics2->rotated   = FALSE;
		metrics2->stretched = FALSE;

		/* set default compensation (all 0) */
		for(i = 0; i < 4; i++)
			metrics2->compensations[i] = 0;
	}

	/* allocate function defs, instruction defs, cvt, and storage area */
	if(ALLOC_ARRAY(size->function_defs,
	               size->max_function_defs,
	               TT_DefRecord)                ||

	        ALLOC_ARRAY(size->instruction_defs,
	                    size->max_instruction_defs,
	                    TT_DefRecord)                ||

	        ALLOC_ARRAY(size->cvt,
	                    size->cvt_size, FT_Long)     ||

	        ALLOC_ARRAY(size->storage,
	                    size->storage_size, FT_Long))
	{

		goto Fail_Memory;
	}

	/* reserve twilight zone */
	n_twilight = maxp->maxTwilightPoints;
	error = TT_New_GlyphZone(memory, n_twilight, 0, &size->twilight);

	if(error)
	{
		goto Fail_Memory;
	}

	size->twilight.n_points = n_twilight;

	/* set `face->interpreter' according to the debug hook present */
	{
		FT_Library library = face->root.driver->root.library;


		face->interpreter = (TT_Interpreter)
		                    library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];

		if(!face->interpreter)
		{
			face->interpreter = (TT_Interpreter)TT_RunIns;
		}
	}

	/* Fine, now execute the font program! */
	exec = size->context;

	/* size objects used during debugging have their own context */
	if(!size->debug)
	{
		exec = TT_New_Context(face);
	}

	if(!exec)
	{
		error = TT_Err_Could_Not_Find_Context;
		goto Fail_Memory;
	}

	size->GS = tt_default_graphics_state;
	TT_Load_Context(exec, face, size);

	exec->callTop   = 0;
	exec->top       = 0;

	exec->period    = 64;
	exec->phase     = 0;
	exec->threshold = 0;

	{
		FT_Size_Metrics  *metrics    = &exec->metrics;
		TT_Size_Metrics  *tt_metrics = &exec->tt_metrics;


		metrics->x_ppem   = 0;
		metrics->y_ppem   = 0;
		metrics->x_scale  = 0;
		metrics->y_scale  = 0;

		tt_metrics->ppem  = 0;
		tt_metrics->scale = 0;
		tt_metrics->ratio = 0x10000L;
	}

	exec->instruction_trap = FALSE;

	exec->cvtSize = size->cvt_size;
	exec->cvt     = size->cvt;

	exec->F_dot_P = 0x10000L;

	/* allow font program execution */
	TT_Set_CodeRange(exec,
	                 tt_coderange_font,
	                 face->font_program,
	                 face->font_program_size);

	/* disable CVT and glyph programs coderange */
	TT_Clear_CodeRange(exec, tt_coderange_cvt);
	TT_Clear_CodeRange(exec, tt_coderange_glyph);

	if(face->font_program_size > 0)
	{
		error = TT_Goto_CodeRange(exec, tt_coderange_font, 0);

		if(!error)
		{
			error = face->interpreter(exec);
		}

		if(error)
		{
			goto Fail_Exec;
		}
	}
	else
	{
		error = TT_Err_Ok;
	}

	TT_Save_Context(exec, size);

	if(!size->debug)
	{
		TT_Done_Context(exec);
	}

#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */

	size->ttmetrics.valid = FALSE;
	return error;

#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER

Fail_Exec:

	if(!size->debug)
	{
		TT_Done_Context(exec);
	}

Fail_Memory:

#endif

	TT_Done_Size(size);
	return error;
}
Example #4
0
tt_size_run_prep( TT_Size  size,
                  FT_Bool  pedantic )
{
    TT_Face         face = (TT_Face)size->root.face;
    TT_ExecContext  exec;
    FT_Error        error;


    exec = size->context;

    error = TT_Load_Context( exec, face, size );
    if ( error )
        return error;

    exec->callTop = 0;
    exec->top     = 0;

    exec->instruction_trap = FALSE;

    exec->pedantic_hinting = pedantic;

    TT_Set_CodeRange( exec,
                      tt_coderange_cvt,
                      face->cvt_program,
                      (FT_Long)face->cvt_program_size );

    TT_Clear_CodeRange( exec, tt_coderange_glyph );

    if ( face->cvt_program_size > 0 )
    {
        TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );

        FT_TRACE4(( "Executing `prep' table.\n" ));

        error = face->interpreter( exec );
    }
    else
        error = FT_Err_Ok;

    size->cvt_ready = error;

    /* UNDOCUMENTED!  The MS rasterizer doesn't allow the following */
    /* graphics state variables to be modified by the CVT program.  */

    exec->GS.dualVector.x = 0x4000;
    exec->GS.dualVector.y = 0;
    exec->GS.projVector.x = 0x4000;
    exec->GS.projVector.y = 0x0;
    exec->GS.freeVector.x = 0x4000;
    exec->GS.freeVector.y = 0x0;

    exec->GS.rp0 = 0;
    exec->GS.rp1 = 0;
    exec->GS.rp2 = 0;

    exec->GS.gep0 = 1;
    exec->GS.gep1 = 1;
    exec->GS.gep2 = 1;

    exec->GS.loop = 1;

    /* save as default graphics state */
    size->GS = exec->GS;

    TT_Save_Context( exec, size );

    return error;
}
Example #5
0
tt_size_run_fpgm( TT_Size  size,
                  FT_Bool  pedantic )
{
    TT_Face         face = (TT_Face)size->root.face;
    TT_ExecContext  exec;
    FT_Error        error;


    exec = size->context;

    error = TT_Load_Context( exec, face, size );
    if ( error )
        return error;

    exec->callTop = 0;
    exec->top     = 0;

    exec->period    = 64;
    exec->phase     = 0;
    exec->threshold = 0;

    exec->instruction_trap = FALSE;
    exec->F_dot_P          = 0x4000L;

    exec->pedantic_hinting = pedantic;

    {
        FT_Size_Metrics*  metrics    = &exec->metrics;
        TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;


        metrics->x_ppem   = 0;
        metrics->y_ppem   = 0;
        metrics->x_scale  = 0;
        metrics->y_scale  = 0;

        tt_metrics->ppem  = 0;
        tt_metrics->scale = 0;
        tt_metrics->ratio = 0x10000L;
    }

    /* allow font program execution */
    TT_Set_CodeRange( exec,
                      tt_coderange_font,
                      face->font_program,
                      (FT_Long)face->font_program_size );

    /* disable CVT and glyph programs coderange */
    TT_Clear_CodeRange( exec, tt_coderange_cvt );
    TT_Clear_CodeRange( exec, tt_coderange_glyph );

    if ( face->font_program_size > 0 )
    {
        TT_Goto_CodeRange( exec, tt_coderange_font, 0 );

        FT_TRACE4(( "Executing `fpgm' table.\n" ));
        error = face->interpreter( exec );
    }
    else
        error = FT_Err_Ok;

    size->bytecode_ready = error;

    if ( !error )
        TT_Save_Context( exec, size );

    return error;
}
Example #6
0
  tt_size_run_fpgm( TT_Size  size )
  {
    TT_Face         face = (TT_Face)size->root.face;
    TT_ExecContext  exec;
    FT_Error        error;


    /* debugging instances have their own context */
    if ( size->debug )
      exec = size->context;
    else
      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;

    if ( !exec )
      return TT_Err_Could_Not_Find_Context;

    TT_Load_Context( exec, face, size );

    exec->callTop   = 0;
    exec->top       = 0;

    exec->period    = 64;
    exec->phase     = 0;
    exec->threshold = 0;

    exec->instruction_trap = FALSE;
    exec->F_dot_P = 0x10000L;

    {
      FT_Size_Metrics*  metrics    = &exec->metrics;
      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;


      metrics->x_ppem   = 0;
      metrics->y_ppem   = 0;
      metrics->x_scale  = 0;
      metrics->y_scale  = 0;

      tt_metrics->ppem  = 0;
      tt_metrics->scale = 0;
      tt_metrics->ratio = 0x10000L;
    }

    /* allow font program execution */
    TT_Set_CodeRange( exec,
                      tt_coderange_font,
                      face->font_program,
                      face->font_program_size );

    /* disable CVT and glyph programs coderange */
    TT_Clear_CodeRange( exec, tt_coderange_cvt );
    TT_Clear_CodeRange( exec, tt_coderange_glyph );

    if ( face->font_program_size > 0 )
    {
      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );

      if ( !error )
        error = face->interpreter( exec );
    }
    else
      error = TT_Err_Ok;

    if ( !error )
      TT_Save_Context( exec, size );

    return error;
  }