Ejemplo n.º 1
0
BASE_FUNC(FT_Short)  FT_Read_ShortLE(FT_Stream stream,
                                     FT_Error   *error)
{
    FT_Byte reads[2];
    FT_Byte  *p = 0;
    FT_Short result = 0;


    FT_Assert(stream);

    *error = FT_Err_Ok;

    if(stream->pos + 1 < stream->size)
    {
        if(stream->read)
        {
            if(stream->read(stream, stream->pos, reads, 2L) != 2L)
            {
                goto Fail;
            }

            p = reads;
        }
        else
        {
            p = stream->base + stream->pos;
        }

        if(p)
        {
            result = NEXT_ShortLE(p);
        }
    }
    else
    {
        goto Fail;
    }

    stream->pos += 2;

    return result;

Fail:
    *error = FT_Err_Invalid_Stream_Operation;
    FT_ERROR(("FT_Read_Short:"));
    FT_ERROR((" invalid i/o; pos = 0x%lx, size = 0x%lx\n",
              stream->pos, stream->size));

    return 0;
}
Ejemplo n.º 2
0
BASE_FUNC(FT_Short)  FT_Get_ShortLE(FT_Stream stream)
{
    FT_Byte  *p;
    FT_Short result;


    FT_Assert(stream && stream->cursor);

    result         = 0;
    p              = stream->cursor;

    if(p + 1 < stream->limit)
    {
        result       = NEXT_ShortLE(p);
    }

    stream->cursor = p;

    return result;
}
Ejemplo n.º 3
0
  static FT_Error
  FNT_Load_Glyph( FT_GlyphSlot  slot,
                  FNT_Size      size,
                  FT_UInt       glyph_index,
                  FT_Int        load_flags )
  {
    FNT_Font*   font  = size->font;
    FT_Error    error = 0;
    FT_Byte*    p;
    FT_Int      len;
    FT_Bitmap*  bitmap = &slot->bitmap;
    FT_ULong    offset;
    FT_Bool     new_format;

    FT_UNUSED( slot );
    FT_UNUSED( load_flags );


    if ( !font )
    {
      error = FNT_Err_Invalid_Argument;
      goto Exit;
    }

    if ( glyph_index > 0 )
      glyph_index--;
    else
      glyph_index = font->header.default_char - font->header.first_char;

    new_format = FT_BOOL( font->header.version == 0x300 );
    len        = new_format ? 6 : 4;

    /* jump to glyph entry */
    p = font->fnt_frame + 118 + len * glyph_index;

    bitmap->width = NEXT_ShortLE(p);

    if ( new_format )
      offset = NEXT_ULongLE(p);
    else
      offset = NEXT_UShortLE(p);

    /* jump to glyph data */
    p = font->fnt_frame + /* font->header.bits_offset */ + offset;

    /* allocate and build bitmap */
    {
      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
      FT_Int     pitch  = ( bitmap->width + 7 ) >> 3;
      FT_Byte*   column;
      FT_Byte*   write;


      bitmap->pitch      = pitch;
      bitmap->rows       = font->header.pixel_height;
      bitmap->pixel_mode = ft_pixel_mode_mono;

      if ( ALLOC( bitmap->buffer, pitch * bitmap->rows ) )
        goto Exit;

      column = (FT_Byte*)bitmap->buffer;

      for ( ; pitch > 0; pitch--, column++ )
      {
        FT_Byte*  limit = p + bitmap->rows;


        for ( write = column; p < limit; p++, write += bitmap->pitch )
          write[0] = p[0];
      }
    }

    slot->flags       = ft_glyph_own_bitmap;
    slot->bitmap_left = 0;
    slot->bitmap_top  = font->header.ascent;
    slot->format      = ft_glyph_format_bitmap;

    /* now set up metrics */
    slot->metrics.horiAdvance  = bitmap->width << 6;
    slot->metrics.horiBearingX = 0;
    slot->metrics.horiBearingY = slot->bitmap_top << 6;

    slot->linearHoriAdvance    = (FT_Fixed)bitmap->width << 16;
    slot->format               = ft_glyph_format_bitmap;

  Exit:
    return error;
  }