From b618a335f5e7b5b3d291aa0cba8be232b79e9a4e Mon Sep 17 00:00:00 2001 From: Jason Wilkins Date: Tue, 20 Jul 2010 11:32:30 +0000 Subject: * Made the default sculpt icons an internal part of the executable * Default icons can be selected from a menu * Option to make a custom icon from a file is present but the UI is disabled because of a mysterious crash * New startup.blend that has the appropriate icons selected --- source/blender/blenkernel/intern/brush.c | 157 ++++++++++++++++++++++++++----- 1 file changed, 134 insertions(+), 23 deletions(-) (limited to 'source/blender/blenkernel/intern/brush.c') diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index cea9ba32160..dcc96e65988 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -104,7 +104,7 @@ Brush *add_brush(const char *name) /* brush appearance */ - brush->image_icon= NULL; + brush->icon_imbuf= get_brush_icon(brush); brush->add_col[0]= 1.00; /* add mode color is light red */ brush->add_col[1]= 0.39; @@ -132,6 +132,8 @@ Brush *copy_brush(Brush *brush) if(brush->mtex.tex) id_us_plus((ID*)brush->mtex.tex); + IMB_refImBuf(brushn->icon_imbuf); + brushn->curve= curvemapping_copy(brush->curve); /* enable fake user by default */ @@ -146,7 +148,13 @@ Brush *copy_brush(Brush *brush) /* not brush itself */ void free_brush(Brush *brush) { - if(brush->mtex.tex) brush->mtex.tex->id.us--; + if (brush->mtex.tex) + brush->mtex.tex->id.us--; + + if (brush->icon==BRUSH_ICON_FILE && brush->icon_imbuf) + IMB_freeImBuf(brush->icon_imbuf); + + BKE_previewimg_free(&(brush->preview)); curvemapping_free(brush->curve); } @@ -176,7 +184,7 @@ void make_local_brush(Brush *brush) if(scene->id.lib) lib= 1; else local= 1; } - + if(local && lib==0) { brush->id.lib= 0; brush->id.flag= LIB_LOCAL; @@ -204,34 +212,137 @@ void make_local_brush(Brush *brush) } /* image icon function */ -Image* get_brush_icon(Brush *brush) +ImBuf* get_brush_icon(Brush *brush) { + extern char datatoc_blob_png; + extern char datatoc_clay_png; + extern char datatoc_crease_png; + extern char datatoc_draw_png; + extern char datatoc_fill_png; + extern char datatoc_flatten_png; + extern char datatoc_grab_png; + extern char datatoc_inflate_png; + extern char datatoc_layer_png; + extern char datatoc_nudge_png; + extern char datatoc_pinch_png; + extern char datatoc_scrape_png; + extern char datatoc_smooth_png; + extern char datatoc_snake_hook_png; + extern char datatoc_thumb_png; + extern char datatoc_twist_png; + + extern int datatoc_blob_png_size; + extern int datatoc_clay_png_size; + extern int datatoc_crease_png_size; + extern int datatoc_draw_png_size; + extern int datatoc_fill_png_size; + extern int datatoc_flatten_png_size; + extern int datatoc_grab_png_size; + extern int datatoc_inflate_png_size; + extern int datatoc_layer_png_size; + extern int datatoc_nudge_png_size; + extern int datatoc_pinch_png_size; + extern int datatoc_scrape_png_size; + extern int datatoc_smooth_png_size; + extern int datatoc_snake_hook_png_size; + extern int datatoc_thumb_png_size; + extern int datatoc_twist_png_size; + + void *icon_data[]= { + 0, + &datatoc_blob_png, + &datatoc_clay_png, + &datatoc_crease_png, + &datatoc_draw_png, + &datatoc_fill_png, + &datatoc_flatten_png, + &datatoc_grab_png, + &datatoc_inflate_png, + &datatoc_layer_png, + &datatoc_nudge_png, + &datatoc_pinch_png, + &datatoc_scrape_png, + &datatoc_smooth_png, + &datatoc_snake_hook_png, + &datatoc_thumb_png, + &datatoc_twist_png, + }; + + size_t icon_size[]= { + 0, + datatoc_blob_png_size, + datatoc_clay_png_size, + datatoc_crease_png_size, + datatoc_draw_png_size, + datatoc_fill_png_size, + datatoc_flatten_png_size, + datatoc_grab_png_size, + datatoc_inflate_png_size, + datatoc_layer_png_size, + datatoc_nudge_png_size, + datatoc_pinch_png_size, + datatoc_scrape_png_size, + datatoc_smooth_png_size, + datatoc_snake_hook_png_size, + datatoc_thumb_png_size, + datatoc_twist_png_size, + }; + + static ImBuf *icon_imbuf[BRUSH_ICON_COUNT]= { 0 }; + + static const int flags = IB_rect|IB_multilayer|IB_metadata; + + static const int default_icon = BRUSH_ICON_DRAW; + + char path[240]; + char *folder; + + if (!(brush->icon_imbuf)) { + if (brush->icon==BRUSH_ICON_FILE) { + + if (brush->icon_filepath[0]) { + // first use the path directly to try and load the file + + BLI_strncpy(path, brush->icon_filepath, sizeof(brush->icon_filepath)); + BLI_path_abs(path, G.sce); + + brush->icon_imbuf= IMB_loadiffname(path, flags); + + // otherwise lets try to find it in other directories + if (!(brush->icon_imbuf)) { + folder= BLI_get_folder(BLENDER_DATAFILES, "brushicons"); + + path[0]= 0; + + BLI_make_file_string(G.sce, path, folder, brush->icon_filepath); + + if (path[0]) + brush->icon_imbuf= IMB_loadiffname(path, flags); + } + } - if (!(brush->image_icon) && brush->image_icon_path[0]) { - // first use the path directly to try and load the file - brush->image_icon= BKE_add_image_file(brush->image_icon_path, 1); - - // otherwise lets try to find it in other directories - if (!(brush->image_icon)) { - char path[240]; - char *folder; - - folder= BLI_get_folder(BLENDER_DATAFILES, "brushicons"); - - path[0] = 0; + // if all else fails use a default image + if (!(brush->icon_imbuf)) { + if (!icon_imbuf[default_icon]) + icon_imbuf[default_icon]= IMB_ibImageFromMemory(icon_data[default_icon], icon_size[default_icon], flags); - BLI_make_file_string(G.sce, path, folder, brush->image_icon_path); + brush->icon_imbuf= icon_imbuf[default_icon]; + } + } + else { + if (!icon_imbuf[brush->icon]) + icon_imbuf[brush->icon]= IMB_ibImageFromMemory(icon_data[brush->icon], icon_size[brush->icon], flags); - if (path[0]) - brush->image_icon= BKE_add_image_file(path, 1); + brush->icon_imbuf= icon_imbuf[brush->icon]; } - // remove user count so image isn't saved on exit - if (brush->image_icon) - id_us_min((ID*)(brush->image_icon)); + BKE_icon_changed(BKE_icon_getid(&(brush->id))); } - return brush->image_icon; + if (!(brush->icon_imbuf)) + printf("get_brush_icon: unable to resolve brush icon imbuf\n"); + + return brush->icon_imbuf; } /* Library Operations */ -- cgit v1.2.3