Edit

kc3-lang/freetype/src/raster/ftrend1.c

Branch :

  • Show log

    Commit

  • Author : Ben Wagner
    Date : 2023-06-01 19:38:36
    Hash : 2fb8eda5
    Message : */*: Remove many function pointer casts. In C it is undefined behavior to call a function through a function pointer of a different type. This is now detected by the Control Flow Integrity Sanitizer. All known issues have already been fixed. Prevent any accidental re-introduction by removing function pointer casts when defining services. The services will call the service functions through the function pointers on the service. As a result the functions must have the same type so there should be no need to cast. Removing the casts allows compilers to warn about assignment to an incompatible function pointer type.

  • src/raster/ftrend1.c
  • /****************************************************************************
     *
     * ftrend1.c
     *
     *   The FreeType glyph rasterizer interface (body).
     *
     * Copyright (C) 1996-2023 by
     * David Turner, Robert Wilhelm, and Werner Lemberg.
     *
     * This file is part of the FreeType project, and may only be used,
     * modified, and distributed under the terms of the FreeType project
     * license, LICENSE.TXT.  By continuing to use, modify, or distribute
     * this file you indicate that you have read the license and
     * understand and accept it fully.
     *
     */
    
    
    #include <freetype/internal/ftdebug.h>
    #include <freetype/internal/ftobjs.h>
    #include <freetype/ftoutln.h>
    #include "ftrend1.h"
    #include "ftraster.h"
    
    #include "rasterrs.h"
    
    
      /* initialize renderer -- init its raster */
      static FT_Error
      ft_raster1_init( FT_Module  module )   /* FT_Renderer */
      {
        FT_Renderer  render = (FT_Renderer)module;
    
    
        render->clazz->raster_class->raster_reset( render->raster, NULL, 0 );
    
        return FT_Err_Ok;
      }
    
    
      /* set render-specific mode */
      static FT_Error
      ft_raster1_set_mode( FT_Renderer  render,
                           FT_ULong     mode_tag,
                           FT_Pointer   data )
      {
        /* we simply pass it to the raster */
        return render->clazz->raster_class->raster_set_mode( render->raster,
                                                             mode_tag,
                                                             data );
      }
    
    
      /* transform a given glyph image */
      static FT_Error
      ft_raster1_transform( FT_Renderer       render,
                            FT_GlyphSlot      slot,
                            const FT_Matrix*  matrix,
                            const FT_Vector*  delta )
      {
        FT_Error error = FT_Err_Ok;
    
    
        if ( slot->format != render->glyph_format )
        {
          error = FT_THROW( Invalid_Argument );
          goto Exit;
        }
    
        if ( matrix )
          FT_Outline_Transform( &slot->outline, matrix );
    
        if ( delta )
          FT_Outline_Translate( &slot->outline, delta->x, delta->y );
    
      Exit:
        return error;
      }
    
    
      /* return the glyph's control box */
      static void
      ft_raster1_get_cbox( FT_Renderer   render,
                           FT_GlyphSlot  slot,
                           FT_BBox*      cbox )
      {
        FT_ZERO( cbox );
    
        if ( slot->format == render->glyph_format )
          FT_Outline_Get_CBox( &slot->outline, cbox );
      }
    
    
      /* convert a slot's glyph image into a bitmap */
      static FT_Error
      ft_raster1_render( FT_Renderer       render,
                         FT_GlyphSlot      slot,
                         FT_Render_Mode    mode,
                         const FT_Vector*  origin )
      {
        FT_Error     error   = FT_Err_Ok;
        FT_Outline*  outline = &slot->outline;
        FT_Bitmap*   bitmap  = &slot->bitmap;
        FT_Memory    memory  = render->root.memory;
        FT_Pos       x_shift = 0;
        FT_Pos       y_shift = 0;
    
        FT_Raster_Params  params;
    
    
        /* check glyph image format */
        if ( slot->format != render->glyph_format )
        {
          error = FT_THROW( Invalid_Argument );
          goto Exit;
        }
    
        /* check rendering mode */
        if ( mode != FT_RENDER_MODE_MONO )
        {
          /* raster1 is only capable of producing monochrome bitmaps */
          return FT_THROW( Cannot_Render_Glyph );
        }
    
        /* release old bitmap buffer */
        if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
        {
          FT_FREE( bitmap->buffer );
          slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
        }
    
        if ( ft_glyphslot_preset_bitmap( slot, mode, origin ) )
        {
          error = FT_THROW( Raster_Overflow );
          goto Exit;
        }
    
        /* allocate new one */
        if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) )
          goto Exit;
    
        slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
    
        x_shift = -slot->bitmap_left * 64;
        y_shift = ( (FT_Int)bitmap->rows - slot->bitmap_top ) * 64;
    
        if ( origin )
        {
          x_shift += origin->x;
          y_shift += origin->y;
        }
    
        /* translate outline to render it into the bitmap */
        if ( x_shift || y_shift )
          FT_Outline_Translate( outline, x_shift, y_shift );
    
        /* set up parameters */
        params.target = bitmap;
        params.source = outline;
        params.flags  = FT_RASTER_FLAG_DEFAULT;
    
        /* render outline into the bitmap */
        error = render->raster_render( render->raster, &params );
    
      Exit:
        if ( !error )
          /* everything is fine; the glyph is now officially a bitmap */
          slot->format = FT_GLYPH_FORMAT_BITMAP;
        else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
        {
          FT_FREE( bitmap->buffer );
          slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
        }
    
        if ( x_shift || y_shift )
          FT_Outline_Translate( outline, -x_shift, -y_shift );
    
        return error;
      }
    
    
      FT_DEFINE_RENDERER(
        ft_raster1_renderer_class,
    
          FT_MODULE_RENDERER,
          sizeof ( FT_RendererRec ),
    
          "raster1",
          0x10000L,
          0x20000L,
    
          NULL,    /* module specific interface */
    
          ft_raster1_init,  /* FT_Module_Constructor module_init   */
          NULL,             /* FT_Module_Destructor  module_done   */
          NULL,             /* FT_Module_Requester   get_interface */
    
        FT_GLYPH_FORMAT_OUTLINE,
    
        ft_raster1_render,     /* FT_Renderer_RenderFunc    render_glyph    */
        ft_raster1_transform,  /* FT_Renderer_TransformFunc transform_glyph */
        ft_raster1_get_cbox,   /* FT_Renderer_GetCBoxFunc   get_glyph_cbox  */
        ft_raster1_set_mode,   /* FT_Renderer_SetModeFunc   set_mode        */
    
        &ft_standard_raster    /* FT_Raster_Funcs*          raster_class    */
      )
    
    
    /* END */