diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_brush.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/brush.c | 157 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/icons.c | 7 |
3 files changed, 142 insertions, 24 deletions
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h index a2168d2a888..75fdb719a62 100644 --- a/source/blender/blenkernel/BKE_brush.h +++ b/source/blender/blenkernel/BKE_brush.h @@ -45,7 +45,7 @@ void make_local_brush(struct Brush *brush); void free_brush(struct Brush *brush); /* image icon function */ -struct Image *get_brush_icon(struct Brush *brush); +struct ImBuf *get_brush_icon(struct Brush *brush); /* brush library operations used by different paint panels */ int brush_set_nr(struct Brush **current_brush, int nr, const char *name); 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 */ diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c index ad2c857be75..c1e00e091e8 100644 --- a/source/blender/blenkernel/intern/icons.c +++ b/source/blender/blenkernel/intern/icons.c @@ -177,6 +177,9 @@ void BKE_previewimg_free_id(ID *id) } else if (GS(id->name) == ID_IM) { Image *img = (Image*)id; BKE_previewimg_free(&img->preview); + } else if (GS(id->name) == ID_BR) { + Brush *br = (Brush*)br; + BKE_previewimg_free(&br->preview); } } @@ -204,6 +207,10 @@ PreviewImage* BKE_previewimg_get(ID *id) Image *img = (Image*)id; if (!img->preview) img->preview = BKE_previewimg_create(); prv_img = img->preview; + } else if (GS(id->name) == ID_BR) { + Brush *br = (Brush*)id; + if (!br->preview) br->preview = BKE_previewimg_create(); + prv_img = br->preview; } return prv_img; |