Fix T54310: Assert when enable Brush custom icon.
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 16 Mar 2018 16:06:43 +0000 (17:06 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 16 Mar 2018 16:06:43 +0000 (17:06 +0100)
We had a mix of two issues here actually:
* First, Brush are currently using their own sauce for custom previews,
this is not great, but moving them to use common ImagePreview system of
IDs is a low-priority TODO. For now, they should totally ignore their
own ImagePreview.
* Second, BKE_icon_changed() would systematically create a PreviewImage
for ID types supporting it, which does not really makes sense, this
function is merely here to 'tag' previews as outdated. Actual creation
of previews is deferred to later, when we actually need them.

source/blender/blenkernel/intern/icons.c
source/blender/makesrna/intern/rna_brush.c

index 447a68e345a7127270a539b2d9bd9bf96948f241..d56d758d4f0debd0689eb697faa1c66712783be7 100644 (file)
@@ -440,14 +440,16 @@ void BKE_icon_changed(const int icon_id)
        icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
        
        if (icon) {
-               PreviewImage *prv = BKE_previewimg_id_ensure((ID *)icon->obj);
+               /* Do not enforce creation of previews for valid ID types using BKE_previewimg_id_ensure() here ,
+                * we only want to ensure *existing* preview images are properly tagged as changed/invalid, that's all. */
+               PreviewImage **p_prv = BKE_previewimg_id_get_p((ID *)icon->obj);
 
-               /* all previews changed */
-               if (prv) {
+               /* If we have previews, they all are now invalid changed. */
+               if (p_prv && *p_prv) {
                        int i;
                        for (i = 0; i < NUM_ICON_SIZES; ++i) {
-                               prv->flag[i] |= PRV_CHANGED;
-                               prv->changed_timestamp[i]++;
+                               (*p_prv)->flag[i] |= PRV_CHANGED;
+                               (*p_prv)->changed_timestamp[i]++;
                        }
                }
        }
index 6a67e036c5d3ca78b4cab635f4cc753038b98cb7..1fd17afdc6008851a80c00f79158523042bd6697 100644 (file)
@@ -430,7 +430,6 @@ static void rna_Brush_icon_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Poi
        br->id.icon_id = 0;
 
        if (br->flag & BRUSH_CUSTOM_ICON) {
-               BKE_previewimg_id_ensure(&br->id);
                BKE_icon_changed(BKE_icon_id_ensure(&br->id));
        }