Пример #1
0
int
main(int argc, char** argv)
{
  /* Check command arguments */
  if(argc != 3) {
    printf("usage: %s RB_DRIVER FONT\n", argv[0]);
    return -1;
  }
  const char* driver_name = argv[1];
  const char* font_name = argv[2];

  FILE* file = fopen(driver_name, "r");
  if(!file) {
    fprintf(stderr, "Invalid driver %s\n", driver_name);
    return -1;
  }
  fclose(file);

  file = fopen(font_name, "r");
  if(!file) {
    fprintf(stderr, "Invalid font name %s\n", font_name);
    return -1;
  }
  fclose(file);

  /* Spawn a drawable windows */
  struct wm_device* device = NULL;
  struct wm_window* window = NULL;
  const struct wm_window_desc win_desc =
    { .width = 640, .height = 480, .fullscreen = false };
  WM(create_device(NULL, &device));
  WM(create_window(device, &win_desc, &window));

  /* Create a render backend */
  struct rbi rbi;
  struct rb_context* rb_ctxt = NULL;
  CHECK(rbi_init(driver_name, &rbi), 0);
  RBI(&rbi, create_context(NULL, &rb_ctxt));

  /* Load font resource */
  struct font_system* font_sys = NULL;
  struct font_rsrc* font_rsrc = NULL;
  bool is_font_scalable = false;
  int line_space = 0;
  FONT(system_create(NULL, &font_sys));
  FONT(rsrc_create(font_sys, font_name, &font_rsrc));
  FONT(rsrc_get_line_space(font_rsrc, &line_space));
  FONT(rsrc_is_scalable(font_rsrc, &is_font_scalable));
  if(is_font_scalable) {
    FONT(rsrc_set_size(font_rsrc, 24, 24));
  }

  /* Build x charset description */
  int glyph_min_width = INT_MAX;
  const wchar_t* charset =
    L"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    L" &~\"#'{([-|`_\\^@)]=}+$%*,?;.:/!<>";
  const size_t charset_len = wcslen(charset);
  size_t i = 0;
  struct lp_font_glyph_desc lp_font_glyph_desc_list[512];
  unsigned char* glyph_bitmap_list[512];
  ASSERT(charset_len <= 512);

  for(i = 0; i < charset_len; ++i) {
    struct font_glyph_desc font_glyph_desc;
    struct font_glyph* font_glyph = NULL;
    int width = 0;
    int height = 0;
    int Bpp = 0;

    FONT(rsrc_get_glyph(font_rsrc, charset[i], &font_glyph));

    FONT(glyph_get_desc(font_glyph, &font_glyph_desc));
    glyph_min_width = MIN(font_glyph_desc.width, glyph_min_width);
    lp_font_glyph_desc_list[i].width = font_glyph_desc.width;
    lp_font_glyph_desc_list[i].character = font_glyph_desc.character;
    lp_font_glyph_desc_list[i].bitmap_left = font_glyph_desc.bbox.x_min;
    lp_font_glyph_desc_list[i].bitmap_top = font_glyph_desc.bbox.y_min;

    FONT(glyph_get_bitmap(font_glyph, true, &width, &height, &Bpp, NULL));
    if(width && height ) {
      glyph_bitmap_list[i] = MEM_CALLOC
        (&mem_default_allocator, (size_t)(width*height), (size_t)Bpp);
      NCHECK(glyph_bitmap_list[i], NULL);
      FONT(glyph_get_bitmap
        (font_glyph, true, &width, &height, &Bpp, glyph_bitmap_list[i]));
    }

    lp_font_glyph_desc_list[i].bitmap.width = width;
    lp_font_glyph_desc_list[i].bitmap.height = height;
    lp_font_glyph_desc_list[i].bitmap.bytes_per_pixel = Bpp;
    lp_font_glyph_desc_list[i].bitmap.buffer = glyph_bitmap_list[i];

    FONT(glyph_ref_put(font_glyph));
  }

  /* Create the lp system and font  */
  struct lp* lp = NULL;
  struct lp_font* lp_font = NULL;
  LP(create(&rbi, rb_ctxt, NULL, &lp));
  LP(font_create(lp, &lp_font));
  LP(font_set_data
    (lp_font, line_space, (int)charset_len, lp_font_glyph_desc_list));

  /* Create the printer */
  struct lp_printer* lp_printer = NULL;
  LP(printer_create(lp, &lp_printer));
  LP(printer_set_font(lp_printer, lp_font));
  LP(printer_set_viewport(lp_printer, 0, 0, win_desc.width, win_desc.height));
  enum wm_state esc = WM_STATE_UNKNOWN;
  do {
    int cur[2] = { 0, 0 };

    RBI(&rbi, clear
      (rb_ctxt, RB_CLEAR_COLOR_BIT, (float[]){0.05f, 0.05f, 0.05f}, 0.f, 0));
    LP(printer_print_wstring
      (lp_printer, 50, 70, L">$ ",
       (float[]){0.f, 1.f, 0.f}, cur+0, cur+1));
    LP(printer_print_wstring
      (lp_printer, cur[0], cur[1], L"Hello",
       (float[]){1.f, 1.f, 1.f}, cur+0, cur+1));
Пример #2
0
bool bbruntime_create(){
	if( blitz_create() ){
				if( hook_create() ){
						if( event_create() ){
								if( math_create() ){
										if( string_create() ){
												if( stdio_create() ){
														if( stream_create() ){
																if( sockets_create() ){
																		if( enet_create() ){
																				if( runtime_create() ){
																						if( system_create() ){
																								if( bank_create() ){
																										if( system_windows_create() ){
																												if( filesystem_create() ){
																														if( filesystem_windows_create() ){
																																if( timer_windows_create() ){
																																		if( input_create() ){
																																				if( input_directinput8_create() ){
																																						if( audio_create() ){
																																								if( audio_fmod_create() ){
																																										if( userlibs_create() ){
																																												if( pixmap_create() ){
																																														if( blitz2d_create() ){
																																																if( graphics_create() ){
																																																		if( runtime_glfw3_create() ){
																																																				return true;
																									}else sue( "runtime_glfw3_create failed" );
																									graphics_destroy();
																								}else sue( "graphics_create failed" );
																								blitz2d_destroy();
																							}else sue( "blitz2d_create failed" );
																							pixmap_destroy();
																						}else sue( "pixmap_create failed" );
																						userlibs_destroy();
																					}else sue( "userlibs_create failed" );
																					audio_fmod_destroy();
																				}else sue( "audio_fmod_create failed" );
																				audio_destroy();
																			}else sue( "audio_create failed" );
																			input_directinput8_destroy();
																		}else sue( "input_directinput8_create failed" );
																		input_destroy();
																	}else sue( "input_create failed" );
																	timer_windows_destroy();
																}else sue( "timer_windows_create failed" );
																filesystem_windows_destroy();
															}else sue( "filesystem_windows_create failed" );
															filesystem_destroy();
														}else sue( "filesystem_create failed" );
														system_windows_destroy();
													}else sue( "system_windows_create failed" );
													bank_destroy();
												}else sue( "bank_create failed" );
												system_destroy();
											}else sue( "system_create failed" );
											runtime_destroy();
										}else sue( "runtime_create failed" );
										enet_destroy();
									}else sue( "enet_create failed" );
									sockets_destroy();
								}else sue( "sockets_create failed" );
								stream_destroy();
							}else sue( "stream_create failed" );
							stdio_destroy();
						}else sue( "stdio_create failed" );
						string_destroy();
					}else sue( "string_create failed" );
					math_destroy();
				}else sue( "math_create failed" );
				event_destroy();
			}else sue( "event_create failed" );
			hook_destroy();
		}else sue( "hook_create failed" );
		blitz_destroy();
	}else sue( "blitz_create failed" );
	return false;
}
Пример #3
0
arcus_system *system_from_xml(scew_element *element)
{
    arcus_system *sys;
    scew_attribute *attr;
    const char *attr_val;
    scew_list *list;
    scew_element *e;
    const char *contents;
    
    if (!element)
    {
        set_error_string("system_from_xml: NULL element");
        return NULL;
    }
    if (strcmp(scew_element_name(element), "system") != 0)
    {
        set_error_string("system_from_xml: element name != 'system'");
        return NULL;
    }
    
    sys = system_create();
    if (!sys)
        return NULL;
    
    // Get system id
    attr = scew_element_attribute_by_name(element, "id");
    if (!attr)
    {
        set_error_string("system_from_xml: system without id");
        
        system_destroy(sys);
        return NULL;
    }
    
    attr_val = scew_attribute_value(attr);
    if (!attr_val)
    {
        set_error_string("system_from_xml: attribute without value (scew bug?)");
        
        system_destroy(sys);
        return NULL;
    }
    
    sys->id = strdup(attr_val);
    
    // Load metric
    list = scew_element_list_by_name(element, "metric");
    if (!list)
    {
        set_error_string("system_create: no metric in system");
        
        system_destroy(sys);
        return NULL;
    }
    
    if (scew_list_size(list) != 1)
    {
        set_error_string("system_create: more than one metric in system");
        
        system_destroy(sys);
        return NULL;
    }
    
    sys->metric = metric_from_xml((scew_element *)scew_list_data(list));
    if (!sys->metric)
    {
        system_destroy(sys);
        return NULL;
    }
    
    
    // Load christoffel symbols
    sys->cs = christoffel_from_xml(element);
    if (!sys->cs)
    {
        system_destroy(sys);
        return NULL;
    }
    
    // Load range
    list = scew_element_list_by_name(element, "range");
    if (!list)
    {
        set_error_string("system_create: no range in system");
        
        system_destroy(sys);
        return NULL;
    }
    
    if (scew_list_size(list) != 1)
    {
        set_error_string("system_create: more than one range in system");
        
        system_destroy(sys);
        return NULL;
    }
    
    e = (scew_element *)scew_list_data(list);
    if (!e || strcmp(scew_element_name(e), "range") != 0)
    {
        set_error_string("system_create: no/wrong range element in list (SCEW bug?)");
        
        system_destroy(sys);
        return NULL;
    }
    
    contents = scew_element_contents(e);
    if (!contents || !contents[0])
    {
        set_error_string("system_create: no contents in range element");
        
        system_destroy(sys);
        return NULL;
    }
    
    if (!af_formula_setexpr(sys->range, contents))
    {
        set_error_string("system_create: cannot set range function expression");
        
        system_destroy(sys);
        return NULL;
    }
    
    return sys;
}