Edit

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

Branch :

  • Show log

    Commit

  • Author : Alexei Podtelezhnikov
    Date : 2024-01-27 11:11:22
    Hash : 47574f7e
    Message : Update all copyright notices.

  • src/raster/ftrend1.c
  • /****************************************************************************
     *
     * ftrend1.c
     *
     *   The FreeType glyph rasterizer interface (body).
     *
     * Copyright (C) 1996-2024 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 */