亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ftbench.c

?? Demo for Free type 2.2.1
?? C
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************************************/
/*                                                                          */
/*  The FreeType project -- a free and portable quality TrueType renderer.  */
/*                                                                          */
/*  Copyright 2002, 2003, 2004, 2005, 2006 by                               */
/*  D. Turner, R.Wilhelm, and W. Lemberg                                    */
/*                                                                          */
/*  ftbench: bench some common FreeType call paths                          */
/*                                                                          */
/****************************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_CACHE_H
#include FT_CACHE_CHARMAP_H
#include FT_CACHE_IMAGE_H
#include FT_CACHE_SMALL_BITMAPS_H


#ifdef UNIX
#include <sys/time.h>
#endif

#include "common.h"


typedef struct {
  double  t0;
  double  total;
} btimer_t;

typedef int
(*bcall_t)( btimer_t*  timer,
            FT_Face    face,
            void*      user_data );

typedef struct {
  const char*  title;
  bcall_t      bench;
  int          cache_first;
  void*        user_data;
} btest_t;

typedef struct
{
  FT_Int     size;
  FT_ULong*  code;
} bcharset_t;

FT_Error
get_face( FT_Face*     face );


/*
 * Globals
 */

#define CACHE_SIZE 1024
#define BENCH_TIME 2.0f
#define FACE_SIZE  10

FT_Library        lib;
FTC_Manager       cache_man;
FTC_CMapCache     cmap_cache;
FTC_ImageCache    image_cache;
FTC_SBitCache     sbit_cache;
FTC_ImageTypeRec  font_type;

enum {
  FT_BENCH_LOAD_GLYPH,
  FT_BENCH_RENDER,
  FT_BENCH_GET_GLYPH,
  FT_BENCH_GET_CBOX,
  FT_BENCH_CMAP,
  FT_BENCH_CMAP_ITER,
  FT_BENCH_NEW_FACE,
  N_FT_BENCH
};

const char* bench_desc[] = {
  "Load a glyph",
  "Render a glyph",
  "Get FT_Glyph",
  "Get glyph cbox",
  "Get glyph index",
  "Iterate CMap",
  "Open a new face",
  NULL
};

int             preload;
char*           filename;

FT_Render_Mode  render_mode = FT_RENDER_MODE_NORMAL;
FT_Int32        load_flags  = FT_LOAD_DEFAULT;


/*
 * Dummy face requester (the face object is already loaded)
 */

FT_Error
face_requester( FTC_FaceID  face_id,
                FT_Library  library,
                FT_Pointer  request_data,
                FT_Face*    aface )
{
  FT_UNUSED( face_id );
  FT_UNUSED( library );

  *aface = (FT_Face)request_data;

  return 0;
}


/*
 * timer
 */

double
get_time(void)
{
#ifdef UNIX
  struct timeval tv;

  gettimeofday(&tv, NULL);
  return (double)tv.tv_sec + (double)tv.tv_usec / 1E6;
#else
  /* clock() has an awful precision (~10ms) under Linux 2.4 + glibc 2.2 */
  return (double)clock() / (double)CLOCKS_PER_SEC;
#endif
}

#define TIMER_START( timer )   ( timer )->t0 = get_time()
#define TIMER_STOP( timer )    ( timer )->total += get_time() - ( timer )->t0
#define TIMER_GET( timer )     ( timer )->total
#define TIMER_RESET( timer )   ( timer )->total = 0


/*
 * Bench code
 */

void
benchmark( FT_Face   face,
           btest_t*  test,
           int       max_iter,
           double    max_time )
{
  int       n, done;
  btimer_t  timer, elapsed;


  if ( test->cache_first )
  {
    if ( !cache_man )
    {
      printf( "%-25s : no cache manager\n", test->title );

      return;
    }

    TIMER_RESET( &timer );
    test->bench( &timer, face, test->user_data );
  }

  printf( "%-25s : ", test->title );
  fflush( stdout );

  n = done = 0;
  TIMER_RESET( &timer );
  TIMER_RESET( &elapsed );

  for ( n = 0; !max_iter || n < max_iter; n++ )
  {
    TIMER_START( &elapsed );

    done += test->bench( &timer, face, test->user_data );

    TIMER_STOP( &elapsed );

    if ( TIMER_GET( &elapsed ) > max_time )
      break;
  }

  printf("%5.3f us/op\n", TIMER_GET( &timer ) * 1E6 / (double)done);
}


/*
 * Various tests
 */

int
test_load( btimer_t*  timer,
           FT_Face    face,
           void*      user_data )
{
  int  i, done = 0;


  FT_UNUSED( user_data );

  TIMER_START( timer );

  for ( i = 0; i < face->num_glyphs; i++ )
  {
    if ( !FT_Load_Glyph( face, i, load_flags ) )
      done++;
  }

  TIMER_STOP( timer );

  return done;
}


int
test_render( btimer_t*  timer,
             FT_Face    face,
             void*      user_data )
{
  int  i, done = 0;


  FT_UNUSED( user_data );

  for ( i = 0; i < face->num_glyphs; i++ )
  {
    if ( FT_Load_Glyph( face, i, load_flags ) )
      continue;

    TIMER_START( timer );
    if ( !FT_Render_Glyph( face->glyph, render_mode ) )
      done++;
    TIMER_STOP( timer );
  }

  return done;
}


int
test_get_glyph( btimer_t*  timer,
                FT_Face    face,
                void*      user_data )
{
  FT_Glyph  glyph;
  int       i, done = 0;


  FT_UNUSED( user_data );

  for ( i = 0; i < face->num_glyphs; i++ )
  {
    if ( FT_Load_Glyph( face, i, load_flags ) )
      continue;

    TIMER_START( timer );
    if ( !FT_Get_Glyph( face->glyph, &glyph ) )
    {
      FT_Done_Glyph( glyph );
      done++;
    }
    TIMER_STOP( timer );
  }

  return done;
}


int
test_get_cbox( btimer_t*  timer,
               FT_Face    face,
               void*      user_data )
{
  FT_Glyph  glyph;
  FT_BBox   bbox;
  int       i, done = 0;


  FT_UNUSED( user_data );

  for ( i = 0; i < face->num_glyphs; i++ )
  {
    if ( FT_Load_Glyph( face, i, load_flags ) )
      continue;

    if ( FT_Get_Glyph( face->glyph, &glyph ) )
      continue;

    TIMER_START( timer );
    FT_Glyph_Get_CBox( glyph, FT_GLYPH_BBOX_PIXELS, &bbox );
    TIMER_STOP( timer );

    FT_Done_Glyph( glyph );
    done++;
  }

  return done;
}


int
test_get_char_index( btimer_t*  timer,
                     FT_Face    face,
                     void*      user_data )
{
  bcharset_t*  charset = (bcharset_t*)user_data;
  int          i, done = 0;


  TIMER_START( timer );

  for ( i = 0; i < charset->size; i++ )
  {
    if ( FT_Get_Char_Index(face, charset->code[i]) )
      done++;
  }

  TIMER_STOP( timer );

  return done;
}


int
test_cmap_cache( btimer_t*  timer,
                 FT_Face    face,
                 void*      user_data )
{
  bcharset_t*  charset = (bcharset_t*)user_data;
  int          i, done = 0;


  FT_UNUSED( face );

  if ( !cmap_cache )
  {
    if ( FTC_CMapCache_New(cache_man, &cmap_cache) )
      return 0;
  }

  TIMER_START( timer );

  for ( i = 0; i < charset->size; i++ )
  {
    if ( FTC_CMapCache_Lookup( cmap_cache, font_type.face_id, 0, charset->code[i] ) )
      done++;
  }

  TIMER_STOP( timer );

  return done;
}


int
test_image_cache( btimer_t*  timer,
                  FT_Face    face,
                  void*      user_data )
{
  FT_Glyph  glyph;
  int       i, done = 0;


  FT_UNUSED( user_data );

  if ( !image_cache )
  {
    if ( FTC_ImageCache_New(cache_man, &image_cache) )
      return 0;
  }

  TIMER_START( timer );

  for ( i = 0; i < face->num_glyphs; i++ )
  {
    if ( !FTC_ImageCache_Lookup(image_cache, &font_type, i, &glyph, NULL) )
      done++;
  }

  TIMER_STOP( timer );

  return done;
}


int
test_sbit_cache( btimer_t*  timer,
                 FT_Face    face,
                 void*      user_data )
{
  FTC_SBit  glyph;
  int       i, done = 0;


  FT_UNUSED( user_data );

  if ( !sbit_cache )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区免费高清| 91精品国产一区二区三区蜜臀| 国产精品成人免费在线| 成人爱爱电影网址| 亚洲自拍偷拍欧美| 一本大道久久精品懂色aⅴ | 色婷婷精品久久二区二区蜜臂av| 亚洲一区二区三区四区在线 | 麻豆成人免费电影| 久久久久久久久免费| 99久久伊人网影院| 午夜国产精品一区| 2021国产精品久久精品| 亚洲免费av在线| 制服丝袜日韩国产| 懂色av一区二区三区免费看| 亚洲美女屁股眼交| 91麻豆精品国产91久久久久| 国产麻豆精品视频| 国产欧美日韩不卡| 色素色在线综合| 国产综合久久久久久久久久久久| 亚洲欧美国产三级| 日韩免费一区二区| 色诱亚洲精品久久久久久| 免费在线观看日韩欧美| 中文字幕在线一区二区三区| 日韩一级大片在线| 色综合网站在线| 99久久夜色精品国产网站| 丝袜国产日韩另类美女| 日韩欧美国产一区二区在线播放| 亚洲卡通欧美制服中文| 午夜一区二区三区在线观看| 国产精品伦一区二区三级视频| 欧美肥妇bbw| 日本韩国欧美一区| 国产精一品亚洲二区在线视频| 婷婷国产v国产偷v亚洲高清| 中文字幕一区视频| 精品国产免费一区二区三区四区| 91香蕉视频污在线| 国产成人精品免费在线| 奇米在线7777在线精品| 亚洲一线二线三线视频| 国产精品免费视频网站| 久久亚区不卡日本| 欧美一级高清片| 欧美性色aⅴ视频一区日韩精品| 成a人片国产精品| 国产高清亚洲一区| 精品亚洲国内自在自线福利| 亚洲国产aⅴ成人精品无吗| 久久久久88色偷偷免费| 欧美电影免费提供在线观看| 欧美日韩视频专区在线播放| 色婷婷久久一区二区三区麻豆| 免费av成人在线| 亚洲欧美成aⅴ人在线观看| 国产三级精品视频| 久久免费午夜影院| 亚洲精品一区二区三区99| 亚洲成人综合在线| 亚洲国产精品一区二区尤物区| 亚洲欧洲制服丝袜| 1024成人网色www| 亚洲国产高清在线观看视频| 2023国产精品自拍| 精品精品欲导航| 欧美v国产在线一区二区三区| 日韩一级片在线观看| 欧美一区二区三区免费| 欧美精品777| 日韩色视频在线观看| 欧美一区二区三区免费视频| 日韩欧美中文字幕精品| 欧美va天堂va视频va在线| 日韩欧美国产三级电影视频| 欧美丰满少妇xxxxx高潮对白 | 精品1区2区3区| 欧美日韩情趣电影| 欧美久久婷婷综合色| 色8久久人人97超碰香蕉987| 成人国产在线观看| 91视视频在线直接观看在线看网页在线看 | 97久久精品人人做人人爽| 成人app在线观看| 色综合激情久久| 欧美乱熟臀69xxxxxx| 日韩女优av电影| 国产亚洲人成网站| 中文字幕五月欧美| 一个色在线综合| 日韩二区在线观看| 国内精品久久久久影院薰衣草| 青青草一区二区三区| 国产福利一区二区三区视频| aaa亚洲精品| 欧美日韩国产一二三| 日韩欧美一区二区在线视频| 久久精品网站免费观看| 亚洲欧洲成人精品av97| 国产精品美女一区二区在线观看| 国产亚洲精品aa| 亚洲激情六月丁香| 精品一区二区三区免费播放 | 欧美mv日韩mv国产网站| 欧美一级理论片| 亚洲精品在线三区| 自拍视频在线观看一区二区| 日韩二区三区四区| 国产91丝袜在线播放0| 欧美三级电影网站| 久久免费电影网| 亚洲精品乱码久久久久久久久| 日韩av电影天堂| 大陆成人av片| 欧美美女喷水视频| 亚洲国产精品激情在线观看| 三级影片在线观看欧美日韩一区二区| 国产麻豆成人精品| 欧美天堂亚洲电影院在线播放| 久久久五月婷婷| 亚洲高清免费视频| 国产最新精品免费| 欧美日韩一区国产| 国产精品久久免费看| 老司机免费视频一区二区| av高清久久久| 精品剧情v国产在线观看在线| 一区二区三区四区高清精品免费观看| 韩国欧美一区二区| 成人短视频下载| 日韩精品中文字幕一区二区三区| 亚洲三级在线免费| 国产一区二区毛片| 日韩一区二区免费电影| 亚洲一区精品在线| www.欧美.com| 91精品福利在线一区二区三区| 亚洲天堂免费看| 国产精品123区| 欧美成人国产一区二区| 偷拍自拍另类欧美| 一本高清dvd不卡在线观看| 欧美电影免费提供在线观看| 亚洲va韩国va欧美va精品 | 国产91精品精华液一区二区三区| 日韩欧美国产综合一区 | 91福利在线观看| 国产女人18水真多18精品一级做| 国产综合色视频| 国产婷婷色一区二区三区| 国产成人免费高清| 国产精品久久久久久久蜜臀| 91免费国产在线| 亚洲成人免费影院| 欧美一区二区久久| 狠狠久久亚洲欧美| 中文在线资源观看网站视频免费不卡| 成人午夜精品在线| 亚洲人午夜精品天堂一二香蕉| 日本精品视频一区二区三区| 亚洲国产精品久久人人爱| 91精品国产一区二区三区香蕉| 激情综合五月婷婷| 成人免费一区二区三区视频| 欧美视频中文一区二区三区在线观看| 午夜精品视频在线观看| 精品区一区二区| 粉嫩一区二区三区性色av| 又紧又大又爽精品一区二区| 欧美日韩成人综合天天影院 | 久久久久国色av免费看影院| 成人在线综合网| 亚洲午夜影视影院在线观看| 日韩三级精品电影久久久| 成人黄色在线网站| 亚洲成人午夜电影| 国产日产欧美精品一区二区三区| 97精品电影院| 久久精品国产久精国产| 中文乱码免费一区二区| 欧美日韩亚洲综合在线| 国产在线一区观看| 亚洲欧美另类综合偷拍| 91精品综合久久久久久| 国产mv日韩mv欧美| 亚洲h精品动漫在线观看| 26uuuu精品一区二区| 色婷婷综合激情| 韩国v欧美v亚洲v日本v| 一区二区三区不卡视频在线观看 | 亚洲欧洲av在线| 91精品综合久久久久久| 97国产一区二区| 精品在线一区二区| 亚洲精品视频免费看| 精品国产一区二区三区久久久蜜月| 91视频免费看|