diff options
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r-- | source/blender/imbuf/IMB_imbuf.h | 1 | ||||
-rw-r--r-- | source/blender/imbuf/IMB_imbuf_types.h | 3 | ||||
-rw-r--r-- | source/blender/imbuf/intern/IMB_filter.h | 2 | ||||
-rw-r--r-- | source/blender/imbuf/intern/filter.c | 37 | ||||
-rw-r--r-- | source/blender/imbuf/intern/scaling.c | 33 |
5 files changed, 62 insertions, 14 deletions
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index a22168e06a3..2accad35859 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -244,6 +244,7 @@ void IMB_filter(struct ImBuf *ibuf); void IMB_filterN(struct ImBuf *out, struct ImBuf *in); void IMB_filter_extend(struct ImBuf *ibuf, char *mask); void IMB_makemipmap(struct ImBuf *ibuf, int use_filter); +void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter); struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level); /** diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index a12976fa813..f60c6d03547 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -131,11 +131,12 @@ typedef struct ImBuf { /* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */ /** - * \brief Flags used internally by blender for imagebuffers + * \brief userflags: Flags used internally by blender for imagebuffers */ #define IB_BITMAPFONT (1 << 0) /* this image is a font */ #define IB_BITMAPDIRTY (1 << 1) /* image needs to be saved is not the same as filename */ +#define IB_MIPMAP_INVALID (1 << 2) /* image mipmaps are invalid, need recreate */ /* From iff.h. This was once moved away by Frank, now Nzc moves it * back. Such is the way it is... It is a long list of defines, and diff --git a/source/blender/imbuf/intern/IMB_filter.h b/source/blender/imbuf/intern/IMB_filter.h index 84ad72c520a..0d414cb4702 100644 --- a/source/blender/imbuf/intern/IMB_filter.h +++ b/source/blender/imbuf/intern/IMB_filter.h @@ -44,5 +44,7 @@ void imb_filterx(struct ImBuf *ibuf); void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h); void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h); +void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1); + #endif diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index 3c2c276b6e4..13c0e6cf632 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -371,11 +371,48 @@ void IMB_filter_extend(struct ImBuf *ibuf, char *mask) } } +/* threadsafe version, only recreates existing maps */ +void IMB_remakemipmap(ImBuf *ibuf, int use_filter) +{ + ImBuf *hbuf = ibuf; + int curmap = 0; + + ibuf->miptot= 1; + + while(curmap < IB_MIPMAP_LEVELS) { + + if(ibuf->mipmap[curmap]) { + + if(use_filter) { + ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect); + IMB_filterN(nbuf, hbuf); + imb_onehalf_no_alloc(ibuf->mipmap[curmap], nbuf); + IMB_freeImBuf(nbuf); + } + else + imb_onehalf_no_alloc(ibuf->mipmap[curmap], hbuf); + } + + ibuf->miptot= curmap+2; + hbuf= ibuf->mipmap[curmap]; + if(hbuf) + hbuf->miplevel= curmap+1; + + if(!hbuf || (hbuf->x <= 2 && hbuf->y <= 2)) + break; + + curmap++; + } +} + +/* frees too (if there) and recreates new data */ void IMB_makemipmap(ImBuf *ibuf, int use_filter) { ImBuf *hbuf = ibuf; int curmap = 0; + imb_freemipmapImBuf(ibuf); + ibuf->miptot= 1; while(curmap < IB_MIPMAP_LEVELS) { diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index 73dcc0c8ea9..1f50deaee2a 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -286,26 +286,16 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1) return (ibuf2); } - -struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1) +/* result in ibuf2, scaling should be done correctly */ +void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1) { - struct ImBuf *ibuf2; uchar *p1, *p2 = NULL, *dest; float *p1f, *destf, *p2f = NULL; int x,y; int do_rect, do_float; - if (ibuf1==NULL) return (0); - if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0); - do_rect= (ibuf1->rect != NULL); - - if (ibuf1->x <= 1) return(IMB_half_y(ibuf1)); - if (ibuf1->y <= 1) return(IMB_half_x(ibuf1)); - ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags); - if (ibuf2==NULL) return (0); - p1f = ibuf1->rect_float; destf=ibuf2->rect_float; p1 = (uchar *) ibuf1->rect; @@ -343,9 +333,26 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1) if (do_float) p1f+=4; } } - return (ibuf2); + } +struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1) +{ + struct ImBuf *ibuf2; + + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0); + + if (ibuf1->x <= 1) return(IMB_half_y(ibuf1)); + if (ibuf1->y <= 1) return(IMB_half_x(ibuf1)); + + ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags); + if (ibuf2==NULL) return (0); + + imb_onehalf_no_alloc(ibuf2, ibuf1); + + return (ibuf2); +} /* q_scale_linear_interpolation helper functions */ |