diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-05-07 19:18:04 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-05-07 19:18:04 +0400 |
commit | 008863daec1249d1f17bc69e1105e336db690d63 (patch) | |
tree | 78a4001857b26a287125a3f5fa31496052f6ebdd /source/blender/imbuf/intern/filter.c | |
parent | 1613829e8e821321da99cad4790b7e6a1d90cea8 (diff) |
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
Diffstat (limited to 'source/blender/imbuf/intern/filter.c')
-rw-r--r-- | source/blender/imbuf/intern/filter.c | 95 |
1 files changed, 87 insertions, 8 deletions
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index 5692686a9bc..3ee05da15c9 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -29,14 +29,13 @@ * $Id$ */ -#include "BLI_blenlib.h" +#include "BKE_utildefines.h" -#include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_filter.h" +#include "imbuf.h" /************************************************************************/ /* FILTERS */ @@ -375,17 +374,97 @@ void IMB_makemipmap(ImBuf *ibuf, int use_filter) { ImBuf *hbuf = ibuf; int curmap = 0; - while (curmap < IB_MIPMAP_LEVELS) { - if (use_filter) { + + ibuf->miptot= 1; + + while(curmap < IB_MIPMAP_LEVELS) { + if(use_filter) { ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect, 0); IMB_filterN(nbuf, hbuf); ibuf->mipmap[curmap] = IMB_onehalf(nbuf); IMB_freeImBuf(nbuf); } - else ibuf->mipmap[curmap] = IMB_onehalf(hbuf); - hbuf = ibuf->mipmap[curmap]; - if (hbuf->x == 1 && hbuf->y == 1) break; + else + ibuf->mipmap[curmap] = IMB_onehalf(hbuf); + + ibuf->miptot= curmap+2; + hbuf= ibuf->mipmap[curmap]; + hbuf->miplevel= curmap+1; + + if(!hbuf || (hbuf->x == 1 && hbuf->y == 1)) + break; + curmap++; } } +ImBuf *IMB_getmipmap(ImBuf *ibuf, int level) +{ + CLAMP(level, 0, ibuf->miptot-1); + return (level == 0)? ibuf: ibuf->mipmap[level-1]; +} + +void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h) +{ + char *cp; + int x, y, val; + + if(depth == 24) { /* put alpha at 255 */ + cp= (char *)(rect); + + for(y=0; y<h; y++) + for(x=0; x<w; x++, cp+=4) + cp[3]= 255; + } + else { + cp= (char *)(rect); + + for(y=0; y<h; y++) { + for(x=0; x<w; x++, cp+=4) { + val= cp[3]; + cp[0]= (cp[0]*val)>>8; + cp[1]= (cp[1]*val)>>8; + cp[2]= (cp[2]*val)>>8; + } + } + } +} + +void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h) +{ + float val, *cp; + int x, y; + + if(depth==24) { /* put alpha at 1.0 */ + cp= rect_float; + + for(y=0; y<h; y++) + for(x=0; x<w; x++, cp+=4) + cp[3]= 1.0; + } + else { + cp= rect_float; + for(y=0; y<h; y++) { + for(x=0; x<w; x++, cp+=4) { + val= cp[3]; + cp[0]= cp[0]*val; + cp[1]= cp[1]*val; + cp[2]= cp[2]*val; + } + } + } + +} + +void IMB_premultiply_alpha(ImBuf *ibuf) +{ + if(ibuf==NULL) + return; + + if(ibuf->rect) + IMB_premultiply_rect(ibuf->rect, ibuf->depth, ibuf->x, ibuf->y); + + if(ibuf->rect_float) + IMB_premultiply_rect_float(ibuf->rect_float, ibuf->depth, ibuf->x, ibuf->y); +} + |