style cleanup: imbuf & icons

This commit is contained in:
2012-05-13 22:05:51 +00:00
parent e5963aae1d
commit 4f2c83f573
10 changed files with 630 additions and 631 deletions

View File

@@ -216,7 +216,7 @@ test_deprecated:
test_style: test_style:
# run our own checks on C/C++ style # run our own checks on C/C++ style
PYTHONIOENCODING=utf_8 python3.2 $(BLENDER_DIR)/source/tools/check_style_c.py $(BLENDER_DIR)/source/blender $(BLENDER_DIR)/source/creator PYTHONIOENCODING=utf_8 python3.2 $(BLENDER_DIR)/source/tools/check_style_c.py $(BLENDER_DIR)/source/blender $(BLENDER_DIR)/source/creator --no-length-check
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Project Files # Project Files

View File

@@ -2406,7 +2406,7 @@ static void ccgSubSurf__allFaces(CCGSubSurf *ss, CCGFace ***faces, int *numFaces
CCGFace **array; CCGFace **array;
int i, num; int i, num;
if (!*faces) { if (*faces == NULL) {
array = MEM_mallocN(sizeof(*array) * ss->fMap->numEntries, "CCGSubsurf allFaces"); array = MEM_mallocN(sizeof(*array) * ss->fMap->numEntries, "CCGSubsurf allFaces");
num = 0; num = 0;
for (i = 0; i < ss->fMap->curSize; i++) { for (i = 0; i < ss->fMap->curSize; i++) {

View File

@@ -51,11 +51,9 @@
#include "BLO_sys_types.h" // for intptr_t support #include "BLO_sys_types.h" // for intptr_t support
#define GS(a) (*((short *)(a)))
/* GLOBALS */ /* GLOBALS */
static GHash* gIcons = NULL; static GHash *gIcons = NULL;
static int gNextIconId = 1; static int gNextIconId = 1;
@@ -64,7 +62,7 @@ static int gFirstIconId = 1;
static void icon_free(void *val) static void icon_free(void *val)
{ {
Icon* icon = val; Icon *icon = val;
if (icon) { if (icon) {
if (icon->drawinfo_free) { if (icon->drawinfo_free) {
@@ -84,15 +82,15 @@ static int get_next_free_id(void)
int startId = gFirstIconId; int startId = gFirstIconId;
/* if we haven't used up the int number range, we just return the next int */ /* if we haven't used up the int number range, we just return the next int */
if (gNextIconId>=gFirstIconId) if (gNextIconId >= gFirstIconId)
return gNextIconId++; return gNextIconId++;
/* now we try to find the smallest icon id not stored in the gIcons hash */ /* now we try to find the smallest icon id not stored in the gIcons hash */
while (BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(startId)) && startId>=gFirstIconId) while (BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(startId)) && startId >= gFirstIconId)
startId++; startId++;
/* if we found a suitable one that isn't used yet, return it */ /* if we found a suitable one that isn't used yet, return it */
if (startId>=gFirstIconId) if (startId >= gFirstIconId)
return startId; return startId;
/* fail */ /* fail */
@@ -115,14 +113,14 @@ void BKE_icons_free(void)
gIcons = NULL; gIcons = NULL;
} }
struct PreviewImage* BKE_previewimg_create(void) PreviewImage *BKE_previewimg_create(void)
{ {
PreviewImage* prv_img = NULL; PreviewImage *prv_img = NULL;
int i; int i;
prv_img = MEM_callocN(sizeof(PreviewImage), "img_prv"); prv_img = MEM_callocN(sizeof(PreviewImage), "img_prv");
for (i=0; i<NUM_ICON_SIZES; ++i) { for (i = 0; i < NUM_ICON_SIZES; ++i) {
prv_img->changed[i] = 1; prv_img->changed[i] = 1;
prv_img->changed_timestamp[i] = 0; prv_img->changed_timestamp[i] = 0;
} }
@@ -135,7 +133,7 @@ void BKE_previewimg_freefunc(void *link)
if (prv) { if (prv) {
int i; int i;
for (i=0; i<NUM_ICON_SIZES;++i) { for (i = 0; i < NUM_ICON_SIZES; ++i) {
if (prv->rect[i]) { if (prv->rect[i]) {
MEM_freeN(prv->rect[i]); MEM_freeN(prv->rect[i]);
prv->rect[i] = NULL; prv->rect[i] = NULL;
@@ -153,14 +151,14 @@ void BKE_previewimg_free(PreviewImage **prv)
} }
} }
struct PreviewImage* BKE_previewimg_copy(PreviewImage *prv) PreviewImage *BKE_previewimg_copy(PreviewImage *prv)
{ {
PreviewImage* prv_img = NULL; PreviewImage *prv_img = NULL;
int i; int i;
if (prv) { if (prv) {
prv_img = MEM_dupallocN(prv); prv_img = MEM_dupallocN(prv);
for (i=0; i < NUM_ICON_SIZES; ++i) { for (i = 0; i < NUM_ICON_SIZES; ++i) {
if (prv->rect[i]) { if (prv->rect[i]) {
prv_img->rect[i] = MEM_dupallocN(prv->rect[i]); prv_img->rect[i] = MEM_dupallocN(prv->rect[i]);
} }
@@ -175,62 +173,62 @@ struct PreviewImage* BKE_previewimg_copy(PreviewImage *prv)
void BKE_previewimg_free_id(ID *id) void BKE_previewimg_free_id(ID *id)
{ {
if (GS(id->name) == ID_MA) { if (GS(id->name) == ID_MA) {
Material *mat = (Material*)id; Material *mat = (Material *)id;
BKE_previewimg_free(&mat->preview); BKE_previewimg_free(&mat->preview);
} }
else if (GS(id->name) == ID_TE) { else if (GS(id->name) == ID_TE) {
Tex *tex = (Tex*)id; Tex *tex = (Tex *)id;
BKE_previewimg_free(&tex->preview); BKE_previewimg_free(&tex->preview);
} }
else if (GS(id->name) == ID_WO) { else if (GS(id->name) == ID_WO) {
World *wo = (World*)id; World *wo = (World *)id;
BKE_previewimg_free(&wo->preview); BKE_previewimg_free(&wo->preview);
} }
else if (GS(id->name) == ID_LA) { else if (GS(id->name) == ID_LA) {
Lamp *la = (Lamp*)id; Lamp *la = (Lamp *)id;
BKE_previewimg_free(&la->preview); BKE_previewimg_free(&la->preview);
} }
else if (GS(id->name) == ID_IM) { else if (GS(id->name) == ID_IM) {
Image *img = (Image*)id; Image *img = (Image *)id;
BKE_previewimg_free(&img->preview); BKE_previewimg_free(&img->preview);
} }
else if (GS(id->name) == ID_BR) { else if (GS(id->name) == ID_BR) {
Brush *br = (Brush*)id; Brush *br = (Brush *)id;
BKE_previewimg_free(&br->preview); BKE_previewimg_free(&br->preview);
} }
} }
PreviewImage* BKE_previewimg_get(ID *id) PreviewImage *BKE_previewimg_get(ID *id)
{ {
PreviewImage* prv_img = NULL; PreviewImage *prv_img = NULL;
if (GS(id->name) == ID_MA) { if (GS(id->name) == ID_MA) {
Material *mat = (Material*)id; Material *mat = (Material *)id;
if (!mat->preview) mat->preview = BKE_previewimg_create(); if (!mat->preview) mat->preview = BKE_previewimg_create();
prv_img = mat->preview; prv_img = mat->preview;
} }
else if (GS(id->name) == ID_TE) { else if (GS(id->name) == ID_TE) {
Tex *tex = (Tex*)id; Tex *tex = (Tex *)id;
if (!tex->preview) tex->preview = BKE_previewimg_create(); if (!tex->preview) tex->preview = BKE_previewimg_create();
prv_img = tex->preview; prv_img = tex->preview;
} }
else if (GS(id->name) == ID_WO) { else if (GS(id->name) == ID_WO) {
World *wo = (World*)id; World *wo = (World *)id;
if (!wo->preview) wo->preview = BKE_previewimg_create(); if (!wo->preview) wo->preview = BKE_previewimg_create();
prv_img = wo->preview; prv_img = wo->preview;
} }
else if (GS(id->name) == ID_LA) { else if (GS(id->name) == ID_LA) {
Lamp *la = (Lamp*)id; Lamp *la = (Lamp *)id;
if (!la->preview) la->preview = BKE_previewimg_create(); if (!la->preview) la->preview = BKE_previewimg_create();
prv_img = la->preview; prv_img = la->preview;
} }
else if (GS(id->name) == ID_IM) { else if (GS(id->name) == ID_IM) {
Image *img = (Image*)id; Image *img = (Image *)id;
if (!img->preview) img->preview = BKE_previewimg_create(); if (!img->preview) img->preview = BKE_previewimg_create();
prv_img = img->preview; prv_img = img->preview;
} }
else if (GS(id->name) == ID_BR) { else if (GS(id->name) == ID_BR) {
Brush *br = (Brush*)id; Brush *br = (Brush *)id;
if (!br->preview) br->preview = BKE_previewimg_create(); if (!br->preview) br->preview = BKE_previewimg_create();
prv_img = br->preview; prv_img = br->preview;
} }
@@ -240,19 +238,19 @@ PreviewImage* BKE_previewimg_get(ID *id)
void BKE_icon_changed(int id) void BKE_icon_changed(int id)
{ {
Icon* icon = NULL; Icon *icon = NULL;
if (!id || G.background) return; if (!id || G.background) return;
icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(id)); icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(id));
if (icon) { if (icon) {
PreviewImage *prv = BKE_previewimg_get((ID*)icon->obj); PreviewImage *prv = BKE_previewimg_get((ID *)icon->obj);
/* all previews changed */ /* all previews changed */
if (prv) { if (prv) {
int i; int i;
for (i=0; i<NUM_ICON_SIZES; ++i) { for (i = 0; i < NUM_ICON_SIZES; ++i) {
prv->changed[i] = 1; prv->changed[i] = 1;
prv->changed_timestamp[i]++; prv->changed_timestamp[i]++;
} }
@@ -260,9 +258,9 @@ void BKE_icon_changed(int id)
} }
} }
int BKE_icon_getid(struct ID* id) int BKE_icon_getid(struct ID *id)
{ {
Icon* new_icon = NULL; Icon *new_icon = NULL;
if (!id || G.background) if (!id || G.background)
return 0; return 0;
@@ -291,9 +289,9 @@ int BKE_icon_getid(struct ID* id)
return id->icon_id; return id->icon_id;
} }
Icon* BKE_icon_get(int icon_id) Icon *BKE_icon_get(int icon_id)
{ {
Icon* icon = NULL; Icon *icon = NULL;
icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id)); icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
@@ -305,9 +303,9 @@ Icon* BKE_icon_get(int icon_id)
return icon; return icon;
} }
void BKE_icon_set(int icon_id, struct Icon* icon) void BKE_icon_set(int icon_id, struct Icon *icon)
{ {
Icon* old_icon = NULL; Icon *old_icon = NULL;
old_icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id)); old_icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
@@ -319,10 +317,10 @@ void BKE_icon_set(int icon_id, struct Icon* icon)
BLI_ghash_insert(gIcons, SET_INT_IN_POINTER(icon_id), icon); BLI_ghash_insert(gIcons, SET_INT_IN_POINTER(icon_id), icon);
} }
void BKE_icon_delete(struct ID* id) void BKE_icon_delete(struct ID *id)
{ {
if (!id->icon_id) return; /* no icon defined for library object */ if (!id->icon_id) return; /* no icon defined for library object */
BLI_ghash_remove(gIcons, SET_INT_IN_POINTER(id->icon_id), NULL, icon_free); BLI_ghash_remove(gIcons, SET_INT_IN_POINTER(id->icon_id), NULL, icon_free);
id->icon_id = 0; id->icon_id = 0;

View File

@@ -70,7 +70,7 @@ void ED_spacetypes_init(void)
SpaceType *type; SpaceType *type;
/* UI_UNIT_X is now a variable, is used in some spacetype inits? */ /* UI_UNIT_X is now a variable, is used in some spacetype inits? */
U.widget_unit= 20; U.widget_unit = 20;
/* create space types */ /* create space types */
ED_spacetype_outliner(); ED_spacetype_outliner();
@@ -117,7 +117,7 @@ void ED_spacetypes_init(void)
/* register operators */ /* register operators */
spacetypes = BKE_spacetypes_list(); spacetypes = BKE_spacetypes_list();
for (type=spacetypes->first; type; type=type->next) { for (type = spacetypes->first; type; type = type->next) {
if (type->operatortypes) if (type->operatortypes)
type->operatortypes(); type->operatortypes();
} }
@@ -136,7 +136,7 @@ void ED_spacetypes_init(void)
/* register dropboxes (can use macros) */ /* register dropboxes (can use macros) */
spacetypes = BKE_spacetypes_list(); spacetypes = BKE_spacetypes_list();
for (type=spacetypes->first; type; type=type->next) { for (type = spacetypes->first; type; type = type->next) {
if (type->dropboxes) if (type->dropboxes)
type->dropboxes(); type->dropboxes();
} }
@@ -169,10 +169,10 @@ void ED_spacetypes_keymap(wmKeyConfig *keyconf)
UI_view2d_keymap(keyconf); UI_view2d_keymap(keyconf);
spacetypes = BKE_spacetypes_list(); spacetypes = BKE_spacetypes_list();
for (stype=spacetypes->first; stype; stype=stype->next) { for (stype = spacetypes->first; stype; stype = stype->next) {
if (stype->keymap) if (stype->keymap)
stype->keymap(keyconf); stype->keymap(keyconf);
for (atype=stype->regiontypes.first; atype; atype=atype->next) { for (atype = stype->regiontypes.first; atype; atype = atype->next) {
if (atype->keymap) if (atype->keymap)
atype->keymap(keyconf); atype->keymap(keyconf);
} }
@@ -192,15 +192,15 @@ typedef struct RegionDrawCB {
} RegionDrawCB; } RegionDrawCB;
void *ED_region_draw_cb_activate(ARegionType *art, void *ED_region_draw_cb_activate(ARegionType *art,
void (*draw)(const struct bContext *, struct ARegion *, void *), void (*draw)(const struct bContext *, struct ARegion *, void *),
void *customdata, int type) void *customdata, int type)
{ {
RegionDrawCB *rdc= MEM_callocN(sizeof(RegionDrawCB), "RegionDrawCB"); RegionDrawCB *rdc = MEM_callocN(sizeof(RegionDrawCB), "RegionDrawCB");
BLI_addtail(&art->drawcalls, rdc); BLI_addtail(&art->drawcalls, rdc);
rdc->draw= draw; rdc->draw = draw;
rdc->customdata= customdata; rdc->customdata = customdata;
rdc->type= type; rdc->type = type;
return rdc; return rdc;
} }
@@ -209,8 +209,8 @@ void ED_region_draw_cb_exit(ARegionType *art, void *handle)
{ {
RegionDrawCB *rdc; RegionDrawCB *rdc;
for (rdc= art->drawcalls.first; rdc; rdc= rdc->next) { for (rdc = art->drawcalls.first; rdc; rdc = rdc->next) {
if (rdc==(RegionDrawCB *)handle) { if (rdc == (RegionDrawCB *)handle) {
BLI_remlink(&art->drawcalls, rdc); BLI_remlink(&art->drawcalls, rdc);
MEM_freeN(rdc); MEM_freeN(rdc);
return; return;
@@ -227,8 +227,8 @@ void ED_region_draw_cb_draw(const bContext *C, ARegion *ar, int type)
{ {
RegionDrawCB *rdc; RegionDrawCB *rdc;
for (rdc= ar->type->drawcalls.first; rdc; rdc= rdc->next) { for (rdc = ar->type->drawcalls.first; rdc; rdc = rdc->next) {
if (rdc->type==type) if (rdc->type == type)
rdc->draw(C, ar, rdc->customdata); rdc->draw(C, ar, rdc->customdata);
} }
} }
@@ -283,14 +283,14 @@ void ED_spacetype_xxx(void)
{ {
static SpaceType st; static SpaceType st;
st.spaceid= SPACE_VIEW3D; st.spaceid = SPACE_VIEW3D;
st.new= xxx_new; st.new = xxx_new;
st.free= xxx_free; st.free = xxx_free;
st.init= xxx_init; st.init = xxx_init;
st.duplicate= xxx_duplicate; st.duplicate = xxx_duplicate;
st.operatortypes= xxx_operatortypes; st.operatortypes = xxx_operatortypes;
st.keymap= xxx_keymap; st.keymap = xxx_keymap;
BKE_spacetype_register(&st); BKE_spacetype_register(&st);
} }

View File

@@ -51,39 +51,39 @@ void imb_freemipmapImBuf(ImBuf *ibuf)
{ {
int a; int a;
for (a=1; a<ibuf->miptot; a++) { for (a = 1; a < ibuf->miptot; a++) {
if (ibuf->mipmap[a-1]) if (ibuf->mipmap[a - 1])
IMB_freeImBuf(ibuf->mipmap[a-1]); IMB_freeImBuf(ibuf->mipmap[a - 1]);
ibuf->mipmap[a-1]= NULL; ibuf->mipmap[a - 1] = NULL;
} }
ibuf->miptot= 0; ibuf->miptot = 0;
} }
/* any free rect frees mipmaps to be sure, creation is in render on first request */ /* any free rect frees mipmaps to be sure, creation is in render on first request */
void imb_freerectfloatImBuf(ImBuf *ibuf) void imb_freerectfloatImBuf(ImBuf *ibuf)
{ {
if (ibuf==NULL) return; if (ibuf == NULL) return;
if (ibuf->rect_float && (ibuf->mall & IB_rectfloat)) { if (ibuf->rect_float && (ibuf->mall & IB_rectfloat)) {
MEM_freeN(ibuf->rect_float); MEM_freeN(ibuf->rect_float);
ibuf->rect_float=NULL; ibuf->rect_float = NULL;
} }
imb_freemipmapImBuf(ibuf); imb_freemipmapImBuf(ibuf);
ibuf->rect_float= NULL; ibuf->rect_float = NULL;
ibuf->mall &= ~IB_rectfloat; ibuf->mall &= ~IB_rectfloat;
} }
/* any free rect frees mipmaps to be sure, creation is in render on first request */ /* any free rect frees mipmaps to be sure, creation is in render on first request */
void imb_freerectImBuf(ImBuf *ibuf) void imb_freerectImBuf(ImBuf *ibuf)
{ {
if (ibuf==NULL) return; if (ibuf == NULL) return;
if (ibuf->rect && (ibuf->mall & IB_rect)) if (ibuf->rect && (ibuf->mall & IB_rect))
MEM_freeN(ibuf->rect); MEM_freeN(ibuf->rect);
ibuf->rect= NULL; ibuf->rect = NULL;
imb_freemipmapImBuf(ibuf); imb_freemipmapImBuf(ibuf);
@@ -94,14 +94,14 @@ void imb_freetilesImBuf(ImBuf *ibuf)
{ {
int tx, ty; int tx, ty;
if (ibuf==NULL) return; if (ibuf == NULL) return;
if (ibuf->tiles && (ibuf->mall & IB_tiles)) { if (ibuf->tiles && (ibuf->mall & IB_tiles)) {
for (ty=0; ty<ibuf->ytiles; ty++) { for (ty = 0; ty < ibuf->ytiles; ty++) {
for (tx=0; tx<ibuf->xtiles; tx++) { for (tx = 0; tx < ibuf->xtiles; tx++) {
if (ibuf->tiles[ibuf->xtiles*ty + tx]) { if (ibuf->tiles[ibuf->xtiles * ty + tx]) {
imb_tile_cache_tile_free(ibuf, tx, ty); imb_tile_cache_tile_free(ibuf, tx, ty);
MEM_freeN(ibuf->tiles[ibuf->xtiles*ty + tx]); MEM_freeN(ibuf->tiles[ibuf->xtiles * ty + tx]);
} }
} }
} }
@@ -109,13 +109,13 @@ void imb_freetilesImBuf(ImBuf *ibuf)
MEM_freeN(ibuf->tiles); MEM_freeN(ibuf->tiles);
} }
ibuf->tiles= NULL; ibuf->tiles = NULL;
ibuf->mall &= ~IB_tiles; ibuf->mall &= ~IB_tiles;
} }
static void freeencodedbufferImBuf(ImBuf *ibuf) static void freeencodedbufferImBuf(ImBuf *ibuf)
{ {
if (ibuf==NULL) return; if (ibuf == NULL) return;
if (ibuf->encodedbuffer && (ibuf->mall & IB_mem)) if (ibuf->encodedbuffer && (ibuf->mall & IB_mem))
MEM_freeN(ibuf->encodedbuffer); MEM_freeN(ibuf->encodedbuffer);
@@ -128,23 +128,23 @@ static void freeencodedbufferImBuf(ImBuf *ibuf)
void IMB_freezbufImBuf(ImBuf *ibuf) void IMB_freezbufImBuf(ImBuf *ibuf)
{ {
if (ibuf==NULL) return; if (ibuf == NULL) return;
if (ibuf->zbuf && (ibuf->mall & IB_zbuf)) if (ibuf->zbuf && (ibuf->mall & IB_zbuf))
MEM_freeN(ibuf->zbuf); MEM_freeN(ibuf->zbuf);
ibuf->zbuf= NULL; ibuf->zbuf = NULL;
ibuf->mall &= ~IB_zbuf; ibuf->mall &= ~IB_zbuf;
} }
void IMB_freezbuffloatImBuf(ImBuf *ibuf) void IMB_freezbuffloatImBuf(ImBuf *ibuf)
{ {
if (ibuf==NULL) return; if (ibuf == NULL) return;
if (ibuf->zbuf_float && (ibuf->mall & IB_zbuffloat)) if (ibuf->zbuf_float && (ibuf->mall & IB_zbuffloat))
MEM_freeN(ibuf->zbuf_float); MEM_freeN(ibuf->zbuf_float);
ibuf->zbuf_float= NULL; ibuf->zbuf_float = NULL;
ibuf->mall &= ~IB_zbuffloat; ibuf->mall &= ~IB_zbuffloat;
} }
@@ -172,9 +172,9 @@ void IMB_refImBuf(ImBuf *ibuf)
ibuf->refcounter++; ibuf->refcounter++;
} }
ImBuf * IMB_makeSingleUser(ImBuf *ibuf) ImBuf *IMB_makeSingleUser(ImBuf *ibuf)
{ {
ImBuf * rval; ImBuf *rval;
if (!ibuf || ibuf->refcounter == 0) { return ibuf; } if (!ibuf || ibuf->refcounter == 0) { return ibuf; }
@@ -189,11 +189,11 @@ short addzbufImBuf(ImBuf *ibuf)
{ {
int size; int size;
if (ibuf==NULL) return FALSE; if (ibuf == NULL) return FALSE;
IMB_freezbufImBuf(ibuf); IMB_freezbufImBuf(ibuf);
size = ibuf->x *ibuf->y *sizeof(unsigned int); size = ibuf->x * ibuf->y * sizeof(unsigned int);
if ((ibuf->zbuf = MEM_mapallocN(size, "addzbufImBuf"))) { if ((ibuf->zbuf = MEM_mapallocN(size, "addzbufImBuf"))) {
ibuf->mall |= IB_zbuf; ibuf->mall |= IB_zbuf;
ibuf->flags |= IB_zbuf; ibuf->flags |= IB_zbuf;
@@ -207,11 +207,11 @@ short addzbuffloatImBuf(ImBuf *ibuf)
{ {
int size; int size;
if (ibuf==NULL) return FALSE; if (ibuf == NULL) return FALSE;
IMB_freezbuffloatImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf);
size = ibuf->x *ibuf->y *sizeof(float); size = ibuf->x * ibuf->y * sizeof(float);
if ((ibuf->zbuf_float = MEM_mapallocN(size, "addzbuffloatImBuf"))) { if ((ibuf->zbuf_float = MEM_mapallocN(size, "addzbuffloatImBuf"))) {
ibuf->mall |= IB_zbuffloat; ibuf->mall |= IB_zbuffloat;
ibuf->flags |= IB_zbuffloat; ibuf->flags |= IB_zbuffloat;
@@ -224,7 +224,7 @@ short addzbuffloatImBuf(ImBuf *ibuf)
short imb_addencodedbufferImBuf(ImBuf *ibuf) short imb_addencodedbufferImBuf(ImBuf *ibuf)
{ {
if (ibuf==NULL) return FALSE; if (ibuf == NULL) return FALSE;
freeencodedbufferImBuf(ibuf); freeencodedbufferImBuf(ibuf);
@@ -248,14 +248,14 @@ short imb_enlargeencodedbufferImBuf(ImBuf *ibuf)
unsigned int newsize, encodedsize; unsigned int newsize, encodedsize;
void *newbuffer; void *newbuffer;
if (ibuf==NULL) return FALSE; if (ibuf == NULL) return FALSE;
if (ibuf->encodedbuffersize < ibuf->encodedsize) { if (ibuf->encodedbuffersize < ibuf->encodedsize) {
printf("imb_enlargeencodedbufferImBuf: error in parameters\n"); printf("imb_enlargeencodedbufferImBuf: error in parameters\n");
return FALSE; return FALSE;
} }
newsize = 2 *ibuf->encodedbuffersize; newsize = 2 * ibuf->encodedbuffersize;
if (newsize < 10000) newsize = 10000; if (newsize < 10000) newsize = 10000;
newbuffer = MEM_mallocN(newsize, "enlargeencodedbufferImBuf"); newbuffer = MEM_mallocN(newsize, "enlargeencodedbufferImBuf");
@@ -285,14 +285,14 @@ short imb_addrectfloatImBuf(ImBuf *ibuf)
{ {
int size; int size;
if (ibuf==NULL) return FALSE; if (ibuf == NULL) return FALSE;
if (ibuf->rect_float) if (ibuf->rect_float)
imb_freerectfloatImBuf(ibuf); /* frees mipmap too, hrm */ imb_freerectfloatImBuf(ibuf); /* frees mipmap too, hrm */
size = ibuf->x *ibuf->y; size = ibuf->x * ibuf->y;
size = size *4 *sizeof(float); size = size * 4 * sizeof(float);
ibuf->channels= 4; ibuf->channels = 4;
if ((ibuf->rect_float = MEM_mapallocN(size, "imb_addrectfloatImBuf"))) { if ((ibuf->rect_float = MEM_mapallocN(size, "imb_addrectfloatImBuf"))) {
ibuf->mall |= IB_rectfloat; ibuf->mall |= IB_rectfloat;
@@ -308,15 +308,15 @@ short imb_addrectImBuf(ImBuf *ibuf)
{ {
int size; int size;
if (ibuf==NULL) return FALSE; if (ibuf == NULL) return FALSE;
/* don't call imb_freerectImBuf, it frees mipmaps, this call is used only too give float buffers display */ /* don't call imb_freerectImBuf, it frees mipmaps, this call is used only too give float buffers display */
if (ibuf->rect && (ibuf->mall & IB_rect)) if (ibuf->rect && (ibuf->mall & IB_rect))
MEM_freeN(ibuf->rect); MEM_freeN(ibuf->rect);
ibuf->rect= NULL; ibuf->rect = NULL;
size = ibuf->x*ibuf->y; size = ibuf->x * ibuf->y;
size = size*sizeof(unsigned int); size = size * sizeof(unsigned int);
if ((ibuf->rect = MEM_mapallocN(size, "imb_addrectImBuf"))) { if ((ibuf->rect = MEM_mapallocN(size, "imb_addrectImBuf"))) {
ibuf->mall |= IB_rect; ibuf->mall |= IB_rect;
@@ -330,10 +330,10 @@ short imb_addrectImBuf(ImBuf *ibuf)
short imb_addtilesImBuf(ImBuf *ibuf) short imb_addtilesImBuf(ImBuf *ibuf)
{ {
if (ibuf==NULL) return FALSE; if (ibuf == NULL) return FALSE;
if (!ibuf->tiles) if (!ibuf->tiles)
if ((ibuf->tiles = MEM_callocN(sizeof(unsigned int*)*ibuf->xtiles*ibuf->ytiles, "imb_tiles"))) if ((ibuf->tiles = MEM_callocN(sizeof(unsigned int *) * ibuf->xtiles * ibuf->ytiles, "imb_tiles")))
ibuf->mall |= IB_tiles; ibuf->mall |= IB_tiles;
return (ibuf->tiles != NULL); return (ibuf->tiles != NULL);
@@ -346,36 +346,36 @@ ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y, uchar planes, unsigned int
ibuf = MEM_callocN(sizeof(ImBuf), "ImBuf_struct"); ibuf = MEM_callocN(sizeof(ImBuf), "ImBuf_struct");
if (ibuf) { if (ibuf) {
ibuf->x= x; ibuf->x = x;
ibuf->y= y; ibuf->y = y;
ibuf->planes= planes; ibuf->planes = planes;
ibuf->ftype= TGA; ibuf->ftype = TGA;
ibuf->channels= 4; /* float option, is set to other values when buffers get assigned */ ibuf->channels = 4; /* float option, is set to other values when buffers get assigned */
ibuf->ppm[0]= ibuf->ppm[1]= 150.0 / 0.0254; /* 150dpi -> pixels-per-meter */ ibuf->ppm[0] = ibuf->ppm[1] = 150.0 / 0.0254; /* 150dpi -> pixels-per-meter */
if (flags & IB_rect) { if (flags & IB_rect) {
if (imb_addrectImBuf(ibuf)==FALSE) { if (imb_addrectImBuf(ibuf) == FALSE) {
IMB_freeImBuf(ibuf); IMB_freeImBuf(ibuf);
return NULL; return NULL;
} }
} }
if (flags & IB_rectfloat) { if (flags & IB_rectfloat) {
if (imb_addrectfloatImBuf(ibuf)==FALSE) { if (imb_addrectfloatImBuf(ibuf) == FALSE) {
IMB_freeImBuf(ibuf); IMB_freeImBuf(ibuf);
return NULL; return NULL;
} }
} }
if (flags & IB_zbuf) { if (flags & IB_zbuf) {
if (addzbufImBuf(ibuf)==FALSE) { if (addzbufImBuf(ibuf) == FALSE) {
IMB_freeImBuf(ibuf); IMB_freeImBuf(ibuf);
return NULL; return NULL;
} }
} }
if (flags & IB_zbuffloat) { if (flags & IB_zbuffloat) {
if (addzbuffloatImBuf(ibuf)==FALSE) { if (addzbuffloatImBuf(ibuf) == FALSE) {
IMB_freeImBuf(ibuf); IMB_freeImBuf(ibuf);
return NULL; return NULL;
} }
@@ -404,10 +404,10 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
if (ibuf2 == NULL) return NULL; if (ibuf2 == NULL) return NULL;
if (flags & IB_rect) if (flags & IB_rect)
memcpy(ibuf2->rect, ibuf1->rect, x *y *sizeof(int)); memcpy(ibuf2->rect, ibuf1->rect, x * y * sizeof(int));
if (flags & IB_rectfloat) if (flags & IB_rectfloat)
memcpy(ibuf2->rect_float, ibuf1->rect_float, ibuf1->channels *x *y *sizeof(float)); memcpy(ibuf2->rect_float, ibuf1->rect_float, ibuf1->channels * x * y * sizeof(float));
if (ibuf1->encodedbuffer) { if (ibuf1->encodedbuffer) {
ibuf2->encodedbuffersize = ibuf1->encodedbuffersize; ibuf2->encodedbuffersize = ibuf1->encodedbuffersize;
@@ -423,16 +423,16 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
tbuf = *ibuf1; tbuf = *ibuf1;
// fix pointers // fix pointers
tbuf.rect = ibuf2->rect; tbuf.rect = ibuf2->rect;
tbuf.rect_float = ibuf2->rect_float; tbuf.rect_float = ibuf2->rect_float;
tbuf.encodedbuffer = ibuf2->encodedbuffer; tbuf.encodedbuffer = ibuf2->encodedbuffer;
tbuf.zbuf= NULL; tbuf.zbuf = NULL;
tbuf.zbuf_float= NULL; tbuf.zbuf_float = NULL;
for (a=0; a<IB_MIPMAP_LEVELS; a++) for (a = 0; a < IB_MIPMAP_LEVELS; a++)
tbuf.mipmap[a]= NULL; tbuf.mipmap[a] = NULL;
// set malloc flag // set malloc flag
tbuf.mall = ibuf2->mall; tbuf.mall = ibuf2->mall;
tbuf.c_handle = NULL; tbuf.c_handle = NULL;
tbuf.refcounter = 0; tbuf.refcounter = 0;
@@ -449,7 +449,7 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
static void imbuf_cache_destructor(void *data) static void imbuf_cache_destructor(void *data)
{ {
ImBuf *ibuf = (ImBuf*) data; ImBuf *ibuf = (ImBuf *) data;
imb_freerectImBuf(ibuf); imb_freerectImBuf(ibuf);
imb_freerectfloatImBuf(ibuf); imb_freerectfloatImBuf(ibuf);

View File

@@ -48,7 +48,7 @@
void IMB_de_interlace(ImBuf *ibuf) void IMB_de_interlace(ImBuf *ibuf)
{ {
ImBuf * tbuf1, * tbuf2; ImBuf *tbuf1, *tbuf2;
if (ibuf == NULL) return; if (ibuf == NULL) return;
if (ibuf->flags & IB_fields) return; if (ibuf->flags & IB_fields) return;
@@ -75,7 +75,7 @@ void IMB_de_interlace(ImBuf *ibuf)
void IMB_interlace(ImBuf *ibuf) void IMB_interlace(ImBuf *ibuf)
{ {
ImBuf * tbuf1, * tbuf2; ImBuf *tbuf1, *tbuf2;
if (ibuf == NULL) return; if (ibuf == NULL) return;
ibuf->flags &= ~IB_fields; ibuf->flags &= ~IB_fields;
@@ -113,13 +113,13 @@ DitherContext *create_dither_context(int w, float factor)
DitherContext *di; DitherContext *di;
int i; int i;
di= MEM_callocN(sizeof(DitherContext), "dithering context"); di = MEM_callocN(sizeof(DitherContext), "dithering context");
di->f= factor / 16.0f; di->f = factor / 16.0f;
di->error_buf= MEM_callocN(4*(w+1)*sizeof(int), "dithering error"); di->error_buf = MEM_callocN(4 * (w + 1) * sizeof(int), "dithering error");
di->e= di->error_buf; di->e = di->error_buf;
for (i=0; i<4; ++i) for (i = 0; i < 4; ++i)
di->v[i]= di->v0[i]= di->v1[i]= 1024.0f*(BLI_frand()-0.5f); di->v[i] = di->v0[i] = di->v1[i] = 1024.0f * (BLI_frand() - 0.5f);
return di; return di;
} }
@@ -134,10 +134,10 @@ static void dither_finish_row(DitherContext *di)
{ {
int i; int i;
for (i=0; i<4; i++) for (i = 0; i < 4; i++)
di->v[i]= di->v0[i]= di->v1[i] = 0; di->v[i] = di->v0[i] = di->v1[i] = 0;
di->e= di->error_buf; di->e = di->error_buf;
} }
MINLINE unsigned char dither_value(unsigned short v_in, DitherContext *di, int i) MINLINE unsigned char dither_value(unsigned short v_in, DitherContext *di, int i)
@@ -145,12 +145,12 @@ MINLINE unsigned char dither_value(unsigned short v_in, DitherContext *di, int i
int dv, d2; int dv, d2;
unsigned char v_out; unsigned char v_out;
di->v[i] = v_in + (2*di->v[i] + di->e[4]) * di->f; di->v[i] = v_in + (2 * di->v[i] + di->e[4]) * di->f;
CLAMP(di->v[i], 0, 0xFF00); CLAMP(di->v[i], 0, 0xFF00);
v_out = USHORTTOUCHAR(di->v[i]); v_out = USHORTTOUCHAR(di->v[i]);
di->v[i] -= v_out<<8; di->v[i] -= v_out << 8;
dv = di->v[i]; dv = di->v[i];
d2 = di->v[i]<<1; d2 = di->v[i] << 1;
di->v[i] += d2; di->v[i] += d2;
*(di->e++) = di->v[i] + di->v0[i]; *(di->e++) = di->v[i] + di->v0[i];
di->v[i] += d2; di->v[i] += d2;
@@ -166,18 +166,18 @@ MINLINE unsigned char dither_value(unsigned short v_in, DitherContext *di, int i
MINLINE void ushort_to_byte_v4(uchar b[4], const unsigned short us[4]) MINLINE void ushort_to_byte_v4(uchar b[4], const unsigned short us[4])
{ {
b[0]= USHORTTOUCHAR(us[0]); b[0] = USHORTTOUCHAR(us[0]);
b[1]= USHORTTOUCHAR(us[1]); b[1] = USHORTTOUCHAR(us[1]);
b[2]= USHORTTOUCHAR(us[2]); b[2] = USHORTTOUCHAR(us[2]);
b[3]= USHORTTOUCHAR(us[3]); b[3] = USHORTTOUCHAR(us[3]);
} }
MINLINE void ushort_to_byte_dither_v4(uchar b[4], const unsigned short us[4], DitherContext *di) MINLINE void ushort_to_byte_dither_v4(uchar b[4], const unsigned short us[4], DitherContext *di)
{ {
b[0]= dither_value(us[0], di, 0); b[0] = dither_value(us[0], di, 0);
b[1]= dither_value(us[1], di, 1); b[1] = dither_value(us[1], di, 1);
b[2]= dither_value(us[2], di, 2); b[2] = dither_value(us[2], di, 2);
b[3]= dither_value(us[3], di, 3); b[3] = dither_value(us[3], di, 3);
} }
MINLINE void float_to_byte_dither_v4(uchar b[4], const float f[4], DitherContext *di) MINLINE void float_to_byte_dither_v4(uchar b[4], const float f[4], DitherContext *di)
@@ -188,8 +188,8 @@ MINLINE void float_to_byte_dither_v4(uchar b[4], const float f[4], DitherContext
/* float to byte pixels, output 4-channel RGBA */ /* float to byte pixels, output 4-channel RGBA */
void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from, void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
int channels_from, float dither, int profile_to, int profile_from, int predivide, int channels_from, float dither, int profile_to, int profile_from, int predivide,
int width, int height, int stride_to, int stride_from) int width, int height, int stride_to, int stride_from)
{ {
float tmp[4]; float tmp[4];
int x, y; int x, y;
@@ -201,32 +201,32 @@ void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
BLI_init_srgb_conversion(); BLI_init_srgb_conversion();
if (dither) if (dither)
di= create_dither_context(width, dither); di = create_dither_context(width, dither);
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
if (channels_from == 1) { if (channels_from == 1) {
/* single channel input */ /* single channel input */
const float *from = rect_from + stride_from*y; const float *from = rect_from + stride_from * y;
uchar *to = rect_to + stride_to*y*4; uchar *to = rect_to + stride_to * y * 4;
for (x = 0; x < width; x++, from++, to+=4) for (x = 0; x < width; x++, from++, to += 4)
to[0] = to[1] = to[2] = to[3] = FTOCHAR(from[0]); to[0] = to[1] = to[2] = to[3] = FTOCHAR(from[0]);
} }
else if (channels_from == 3) { else if (channels_from == 3) {
/* RGB input */ /* RGB input */
const float *from = rect_from + stride_from*y*3; const float *from = rect_from + stride_from * y * 3;
uchar *to = rect_to + stride_to*y*4; uchar *to = rect_to + stride_to * y * 4;
if (profile_to == profile_from) { if (profile_to == profile_from) {
/* no color space conversion */ /* no color space conversion */
for (x = 0; x < width; x++, from+=3, to+=4) { for (x = 0; x < width; x++, from += 3, to += 4) {
rgb_float_to_uchar(to, from); rgb_float_to_uchar(to, from);
to[3] = 255; to[3] = 255;
} }
} }
else if (profile_to == IB_PROFILE_SRGB) { else if (profile_to == IB_PROFILE_SRGB) {
/* convert from linear to sRGB */ /* convert from linear to sRGB */
for (x = 0; x < width; x++, from+=3, to+=4) { for (x = 0; x < width; x++, from += 3, to += 4) {
linearrgb_to_srgb_v3_v3(tmp, from); linearrgb_to_srgb_v3_v3(tmp, from);
rgb_float_to_uchar(to, tmp); rgb_float_to_uchar(to, tmp);
to[3] = 255; to[3] = 255;
@@ -234,7 +234,7 @@ void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
} }
else if (profile_to == IB_PROFILE_LINEAR_RGB) { else if (profile_to == IB_PROFILE_LINEAR_RGB) {
/* convert from sRGB to linear */ /* convert from sRGB to linear */
for (x = 0; x < width; x++, from+=3, to+=4) { for (x = 0; x < width; x++, from += 3, to += 4) {
srgb_to_linearrgb_v3_v3(tmp, from); srgb_to_linearrgb_v3_v3(tmp, from);
rgb_float_to_uchar(to, tmp); rgb_float_to_uchar(to, tmp);
to[3] = 255; to[3] = 255;
@@ -242,18 +242,18 @@ void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
} }
} }
else if (channels_from == 4) { else if (channels_from == 4) {
/* RGBA input */ /* RGBA input */
const float *from = rect_from + stride_from*y*4; const float *from = rect_from + stride_from * y * 4;
uchar *to = rect_to + stride_to*y*4; uchar *to = rect_to + stride_to * y * 4;
if (profile_to == profile_from) { if (profile_to == profile_from) {
/* no color space conversion */ /* no color space conversion */
if (dither) { if (dither) {
for (x = 0; x < width; x++, from+=4, to+=4) for (x = 0; x < width; x++, from += 4, to += 4)
float_to_byte_dither_v4(to, from, di); float_to_byte_dither_v4(to, from, di);
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) for (x = 0; x < width; x++, from += 4, to += 4)
rgba_float_to_uchar(to, from); rgba_float_to_uchar(to, from);
} }
} }
@@ -262,25 +262,25 @@ void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
unsigned short us[4]; unsigned short us[4];
if (dither && predivide) { if (dither && predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
linearrgb_to_srgb_ushort4_predivide(us, from); linearrgb_to_srgb_ushort4_predivide(us, from);
ushort_to_byte_dither_v4(to, us, di); ushort_to_byte_dither_v4(to, us, di);
} }
} }
else if (dither) { else if (dither) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
linearrgb_to_srgb_ushort4(us, from); linearrgb_to_srgb_ushort4(us, from);
ushort_to_byte_dither_v4(to, us, di); ushort_to_byte_dither_v4(to, us, di);
} }
} }
else if (predivide) { else if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
linearrgb_to_srgb_ushort4_predivide(us, from); linearrgb_to_srgb_ushort4_predivide(us, from);
ushort_to_byte_v4(to, us); ushort_to_byte_v4(to, us);
} }
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
linearrgb_to_srgb_ushort4(us, from); linearrgb_to_srgb_ushort4(us, from);
ushort_to_byte_v4(to, us); ushort_to_byte_v4(to, us);
} }
@@ -289,25 +289,25 @@ void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
else if (profile_to == IB_PROFILE_LINEAR_RGB) { else if (profile_to == IB_PROFILE_LINEAR_RGB) {
/* convert from sRGB to linear */ /* convert from sRGB to linear */
if (dither && predivide) { if (dither && predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
srgb_to_linearrgb_predivide_v4(tmp, from); srgb_to_linearrgb_predivide_v4(tmp, from);
float_to_byte_dither_v4(to, tmp, di); float_to_byte_dither_v4(to, tmp, di);
} }
} }
else if (dither) { else if (dither) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
srgb_to_linearrgb_v4(tmp, from); srgb_to_linearrgb_v4(tmp, from);
float_to_byte_dither_v4(to, tmp, di); float_to_byte_dither_v4(to, tmp, di);
} }
} }
else if (predivide) { else if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
srgb_to_linearrgb_predivide_v4(tmp, from); srgb_to_linearrgb_predivide_v4(tmp, from);
rgba_float_to_uchar(to, tmp); rgba_float_to_uchar(to, tmp);
} }
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
srgb_to_linearrgb_v4(tmp, from); srgb_to_linearrgb_v4(tmp, from);
rgba_float_to_uchar(to, tmp); rgba_float_to_uchar(to, tmp);
} }
@@ -325,8 +325,8 @@ void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
/* byte to float pixels, input and output 4-channel RGBA */ /* byte to float pixels, input and output 4-channel RGBA */
void IMB_buffer_float_from_byte(float *rect_to, const uchar *rect_from, void IMB_buffer_float_from_byte(float *rect_to, const uchar *rect_from,
int profile_to, int profile_from, int predivide, int profile_to, int profile_from, int predivide,
int width, int height, int stride_to, int stride_from) int width, int height, int stride_to, int stride_from)
{ {
float tmp[4]; float tmp[4];
int x, y; int x, y;
@@ -339,23 +339,23 @@ void IMB_buffer_float_from_byte(float *rect_to, const uchar *rect_from,
/* RGBA input */ /* RGBA input */
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
const uchar *from = rect_from + stride_from*y*4; const uchar *from = rect_from + stride_from * y * 4;
float *to = rect_to + stride_to*y*4; float *to = rect_to + stride_to * y * 4;
if (profile_to == profile_from) { if (profile_to == profile_from) {
/* no color space conversion */ /* no color space conversion */
for (x = 0; x < width; x++, from+=4, to+=4) for (x = 0; x < width; x++, from += 4, to += 4)
rgba_uchar_to_float(to, from); rgba_uchar_to_float(to, from);
} }
else if (profile_to == IB_PROFILE_LINEAR_RGB) { else if (profile_to == IB_PROFILE_LINEAR_RGB) {
/* convert sRGB to linear */ /* convert sRGB to linear */
if (predivide) { if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
srgb_to_linearrgb_uchar4_predivide(to, from); srgb_to_linearrgb_uchar4_predivide(to, from);
} }
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
srgb_to_linearrgb_uchar4(to, from); srgb_to_linearrgb_uchar4(to, from);
} }
} }
@@ -363,13 +363,13 @@ void IMB_buffer_float_from_byte(float *rect_to, const uchar *rect_from,
else if (profile_to == IB_PROFILE_SRGB) { else if (profile_to == IB_PROFILE_SRGB) {
/* convert linear to sRGB */ /* convert linear to sRGB */
if (predivide) { if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
rgba_uchar_to_float(tmp, from); rgba_uchar_to_float(tmp, from);
linearrgb_to_srgb_predivide_v4(to, tmp); linearrgb_to_srgb_predivide_v4(to, tmp);
} }
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
rgba_uchar_to_float(tmp, from); rgba_uchar_to_float(tmp, from);
linearrgb_to_srgb_v4(to, tmp); linearrgb_to_srgb_v4(to, tmp);
} }
@@ -380,8 +380,8 @@ void IMB_buffer_float_from_byte(float *rect_to, const uchar *rect_from,
/* float to float pixels, output 4-channel RGBA */ /* float to float pixels, output 4-channel RGBA */
void IMB_buffer_float_from_float(float *rect_to, const float *rect_from, void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
int channels_from, int profile_to, int profile_from, int predivide, int channels_from, int profile_to, int profile_from, int predivide,
int width, int height, int stride_to, int stride_from) int width, int height, int stride_to, int stride_from)
{ {
int x, y; int x, y;
@@ -389,39 +389,39 @@ void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
BLI_assert(profile_to != IB_PROFILE_NONE); BLI_assert(profile_to != IB_PROFILE_NONE);
BLI_assert(profile_from != IB_PROFILE_NONE); BLI_assert(profile_from != IB_PROFILE_NONE);
if (channels_from==1) { if (channels_from == 1) {
/* single channel input */ /* single channel input */
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
const float *from = rect_from + stride_from*y; const float *from = rect_from + stride_from * y;
float *to = rect_to + stride_to*y*4; float *to = rect_to + stride_to * y * 4;
for (x = 0; x < width; x++, from++, to+=4) for (x = 0; x < width; x++, from++, to += 4)
to[0] = to[1] = to[2] = to[3] = from[0]; to[0] = to[1] = to[2] = to[3] = from[0];
} }
} }
else if (channels_from == 3) { else if (channels_from == 3) {
/* RGB input */ /* RGB input */
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
const float *from = rect_from + stride_from*y*3; const float *from = rect_from + stride_from * y * 3;
float *to = rect_to + stride_to*y*4; float *to = rect_to + stride_to * y * 4;
if (profile_to == profile_from) { if (profile_to == profile_from) {
/* no color space conversion */ /* no color space conversion */
for (x = 0; x < width; x++, from+=3, to+=4) { for (x = 0; x < width; x++, from += 3, to += 4) {
copy_v3_v3(to, from); copy_v3_v3(to, from);
to[3] = 1.0f; to[3] = 1.0f;
} }
} }
else if (profile_to == IB_PROFILE_LINEAR_RGB) { else if (profile_to == IB_PROFILE_LINEAR_RGB) {
/* convert from sRGB to linear */ /* convert from sRGB to linear */
for (x = 0; x < width; x++, from+=3, to+=4) { for (x = 0; x < width; x++, from += 3, to += 4) {
srgb_to_linearrgb_v3_v3(to, from); srgb_to_linearrgb_v3_v3(to, from);
to[3] = 1.0f; to[3] = 1.0f;
} }
} }
else if (profile_to == IB_PROFILE_SRGB) { else if (profile_to == IB_PROFILE_SRGB) {
/* convert from linear to sRGB */ /* convert from linear to sRGB */
for (x = 0; x < width; x++, from+=3, to+=4) { for (x = 0; x < width; x++, from += 3, to += 4) {
linearrgb_to_srgb_v3_v3(to, from); linearrgb_to_srgb_v3_v3(to, from);
to[3] = 1.0f; to[3] = 1.0f;
} }
@@ -431,32 +431,32 @@ void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
else if (channels_from == 4) { else if (channels_from == 4) {
/* RGBA input */ /* RGBA input */
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
const float *from = rect_from + stride_from*y*4; const float *from = rect_from + stride_from * y * 4;
float *to = rect_to + stride_to*y*4; float *to = rect_to + stride_to * y * 4;
if (profile_to == profile_from) { if (profile_to == profile_from) {
/* same profile, copy */ /* same profile, copy */
memcpy(to, from, sizeof(float)*4*width); memcpy(to, from, sizeof(float) * 4 * width);
} }
else if (profile_to == IB_PROFILE_LINEAR_RGB) { else if (profile_to == IB_PROFILE_LINEAR_RGB) {
/* convert to sRGB to linear */ /* convert to sRGB to linear */
if (predivide) { if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) for (x = 0; x < width; x++, from += 4, to += 4)
srgb_to_linearrgb_predivide_v4(to, from); srgb_to_linearrgb_predivide_v4(to, from);
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) for (x = 0; x < width; x++, from += 4, to += 4)
srgb_to_linearrgb_v4(to, from); srgb_to_linearrgb_v4(to, from);
} }
} }
else if (profile_to == IB_PROFILE_SRGB) { else if (profile_to == IB_PROFILE_SRGB) {
/* convert from linear to sRGB */ /* convert from linear to sRGB */
if (predivide) { if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) for (x = 0; x < width; x++, from += 4, to += 4)
linearrgb_to_srgb_predivide_v4(to, from); linearrgb_to_srgb_predivide_v4(to, from);
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) for (x = 0; x < width; x++, from += 4, to += 4)
linearrgb_to_srgb_v4(to, from); linearrgb_to_srgb_v4(to, from);
} }
} }
@@ -466,8 +466,8 @@ void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
/* byte to byte pixels, input and output 4-channel RGBA */ /* byte to byte pixels, input and output 4-channel RGBA */
void IMB_buffer_byte_from_byte(uchar *rect_to, const uchar *rect_from, void IMB_buffer_byte_from_byte(uchar *rect_to, const uchar *rect_from,
int profile_to, int profile_from, int predivide, int profile_to, int profile_from, int predivide,
int width, int height, int stride_to, int stride_from) int width, int height, int stride_to, int stride_from)
{ {
float tmp[4]; float tmp[4];
int x, y; int x, y;
@@ -478,24 +478,24 @@ void IMB_buffer_byte_from_byte(uchar *rect_to, const uchar *rect_from,
/* always RGBA input */ /* always RGBA input */
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
const uchar *from = rect_from + stride_from*y*4; const uchar *from = rect_from + stride_from * y * 4;
uchar *to = rect_to + stride_to*y*4; uchar *to = rect_to + stride_to * y * 4;
if (profile_to == profile_from) { if (profile_to == profile_from) {
/* same profile, copy */ /* same profile, copy */
memcpy(to, from, sizeof(uchar)*4*width); memcpy(to, from, sizeof(uchar) * 4 * width);
} }
else if (profile_to == IB_PROFILE_LINEAR_RGB) { else if (profile_to == IB_PROFILE_LINEAR_RGB) {
/* convert to sRGB to linear */ /* convert to sRGB to linear */
if (predivide) { if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
rgba_uchar_to_float(tmp, from); rgba_uchar_to_float(tmp, from);
srgb_to_linearrgb_predivide_v4(tmp, tmp); srgb_to_linearrgb_predivide_v4(tmp, tmp);
rgba_float_to_uchar(to, tmp); rgba_float_to_uchar(to, tmp);
} }
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
rgba_uchar_to_float(tmp, from); rgba_uchar_to_float(tmp, from);
srgb_to_linearrgb_v4(tmp, tmp); srgb_to_linearrgb_v4(tmp, tmp);
rgba_float_to_uchar(to, tmp); rgba_float_to_uchar(to, tmp);
@@ -505,14 +505,14 @@ void IMB_buffer_byte_from_byte(uchar *rect_to, const uchar *rect_from,
else if (profile_to == IB_PROFILE_SRGB) { else if (profile_to == IB_PROFILE_SRGB) {
/* convert from linear to sRGB */ /* convert from linear to sRGB */
if (predivide) { if (predivide) {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
rgba_uchar_to_float(tmp, from); rgba_uchar_to_float(tmp, from);
linearrgb_to_srgb_predivide_v4(tmp, tmp); linearrgb_to_srgb_predivide_v4(tmp, tmp);
rgba_float_to_uchar(to, tmp); rgba_float_to_uchar(to, tmp);
} }
} }
else { else {
for (x = 0; x < width; x++, from+=4, to+=4) { for (x = 0; x < width; x++, from += 4, to += 4) {
rgba_uchar_to_float(tmp, from); rgba_uchar_to_float(tmp, from);
linearrgb_to_srgb_v4(tmp, tmp); linearrgb_to_srgb_v4(tmp, tmp);
rgba_float_to_uchar(to, tmp); rgba_float_to_uchar(to, tmp);
@@ -526,15 +526,15 @@ void IMB_buffer_byte_from_byte(uchar *rect_to, const uchar *rect_from,
void IMB_rect_from_float(ImBuf *ibuf) void IMB_rect_from_float(ImBuf *ibuf)
{ {
int predivide= (ibuf->flags & IB_cm_predivide); int predivide = (ibuf->flags & IB_cm_predivide);
int profile_from; int profile_from;
/* verify we have a float buffer */ /* verify we have a float buffer */
if (ibuf->rect_float==NULL) if (ibuf->rect_float == NULL)
return; return;
/* create byte rect if it didn't exist yet */ /* create byte rect if it didn't exist yet */
if (ibuf->rect==NULL) if (ibuf->rect == NULL)
imb_addrectImBuf(ibuf); imb_addrectImBuf(ibuf);
/* determine profiles */ /* determine profiles */
@@ -546,9 +546,9 @@ void IMB_rect_from_float(ImBuf *ibuf)
BLI_assert(0); BLI_assert(0);
/* do conversion */ /* do conversion */
IMB_buffer_byte_from_float((uchar*)ibuf->rect, ibuf->rect_float, IMB_buffer_byte_from_float((uchar *)ibuf->rect, ibuf->rect_float,
ibuf->channels, ibuf->dither, IB_PROFILE_SRGB, profile_from, predivide, ibuf->channels, ibuf->dither, IB_PROFILE_SRGB, profile_from, predivide,
ibuf->x, ibuf->y, ibuf->x, ibuf->x); ibuf->x, ibuf->y, ibuf->x, ibuf->x);
/* ensure user flag is reset */ /* ensure user flag is reset */
ibuf->userflags &= ~IB_RECT_INVALID; ibuf->userflags &= ~IB_RECT_INVALID;
@@ -559,15 +559,15 @@ void IMB_partial_rect_from_float(ImBuf *ibuf, float *buffer, int x, int y, int w
{ {
float *rect_float; float *rect_float;
uchar *rect_byte; uchar *rect_byte;
int predivide= (ibuf->flags & IB_cm_predivide); int predivide = (ibuf->flags & IB_cm_predivide);
int profile_from; int profile_from;
/* verify we have a float buffer */ /* verify we have a float buffer */
if (ibuf->rect_float==NULL || buffer==NULL) if (ibuf->rect_float == NULL || buffer == NULL)
return; return;
/* create byte rect if it didn't exist yet */ /* create byte rect if it didn't exist yet */
if (ibuf->rect==NULL) if (ibuf->rect == NULL)
imb_addrectImBuf(ibuf); imb_addrectImBuf(ibuf);
/* determine profiles */ /* determine profiles */
@@ -579,16 +579,16 @@ void IMB_partial_rect_from_float(ImBuf *ibuf, float *buffer, int x, int y, int w
BLI_assert(0); BLI_assert(0);
/* do conversion */ /* do conversion */
rect_float= ibuf->rect_float + (x + y*ibuf->x)*ibuf->channels; rect_float = ibuf->rect_float + (x + y * ibuf->x) * ibuf->channels;
rect_byte= (uchar*)ibuf->rect + (x + y*ibuf->x)*4; rect_byte = (uchar *)ibuf->rect + (x + y * ibuf->x) * 4;
IMB_buffer_float_from_float(buffer, rect_float, IMB_buffer_float_from_float(buffer, rect_float,
ibuf->channels, IB_PROFILE_SRGB, profile_from, predivide, ibuf->channels, IB_PROFILE_SRGB, profile_from, predivide,
w, h, w, ibuf->x); w, h, w, ibuf->x);
IMB_buffer_byte_from_float(rect_byte, buffer, IMB_buffer_byte_from_float(rect_byte, buffer,
4, ibuf->dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB, 0, 4, ibuf->dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB, 0,
w, h, ibuf->x, w); w, h, ibuf->x, w);
/* ensure user flag is reset */ /* ensure user flag is reset */
ibuf->userflags &= ~IB_RECT_INVALID; ibuf->userflags &= ~IB_RECT_INVALID;
@@ -596,14 +596,14 @@ void IMB_partial_rect_from_float(ImBuf *ibuf, float *buffer, int x, int y, int w
void IMB_float_from_rect(ImBuf *ibuf) void IMB_float_from_rect(ImBuf *ibuf)
{ {
int predivide= (ibuf->flags & IB_cm_predivide); int predivide = (ibuf->flags & IB_cm_predivide);
int profile_from; int profile_from;
/* verify if we byte and float buffers */ /* verify if we byte and float buffers */
if (ibuf->rect==NULL) if (ibuf->rect == NULL)
return; return;
if (ibuf->rect_float==NULL) if (ibuf->rect_float == NULL)
if (imb_addrectfloatImBuf(ibuf) == 0) if (imb_addrectfloatImBuf(ibuf) == 0)
return; return;
@@ -614,27 +614,27 @@ void IMB_float_from_rect(ImBuf *ibuf)
profile_from = IB_PROFILE_SRGB; profile_from = IB_PROFILE_SRGB;
/* do conversion */ /* do conversion */
IMB_buffer_float_from_byte(ibuf->rect_float, (uchar*)ibuf->rect, IMB_buffer_float_from_byte(ibuf->rect_float, (uchar *)ibuf->rect,
IB_PROFILE_LINEAR_RGB, profile_from, predivide, IB_PROFILE_LINEAR_RGB, profile_from, predivide,
ibuf->x, ibuf->y, ibuf->x, ibuf->x); ibuf->x, ibuf->y, ibuf->x, ibuf->x);
} }
/* no profile conversion */ /* no profile conversion */
void IMB_float_from_rect_simple(ImBuf *ibuf) void IMB_float_from_rect_simple(ImBuf *ibuf)
{ {
int predivide= (ibuf->flags & IB_cm_predivide); int predivide = (ibuf->flags & IB_cm_predivide);
if (ibuf->rect_float==NULL) if (ibuf->rect_float == NULL)
imb_addrectfloatImBuf(ibuf); imb_addrectfloatImBuf(ibuf);
IMB_buffer_float_from_byte(ibuf->rect_float, (uchar*)ibuf->rect, IMB_buffer_float_from_byte(ibuf->rect_float, (uchar *)ibuf->rect,
IB_PROFILE_SRGB, IB_PROFILE_SRGB, predivide, IB_PROFILE_SRGB, IB_PROFILE_SRGB, predivide,
ibuf->x, ibuf->y, ibuf->x, ibuf->x); ibuf->x, ibuf->y, ibuf->x, ibuf->x);
} }
void IMB_convert_profile(ImBuf *ibuf, int profile) void IMB_convert_profile(ImBuf *ibuf, int profile)
{ {
int predivide= (ibuf->flags & IB_cm_predivide); int predivide = (ibuf->flags & IB_cm_predivide);
int profile_from, profile_to; int profile_from, profile_to;
if (ibuf->profile == profile) if (ibuf->profile == profile)
@@ -662,25 +662,25 @@ void IMB_convert_profile(ImBuf *ibuf, int profile)
/* do conversion */ /* do conversion */
if (ibuf->rect_float) { if (ibuf->rect_float) {
IMB_buffer_float_from_float(ibuf->rect_float, ibuf->rect_float, IMB_buffer_float_from_float(ibuf->rect_float, ibuf->rect_float,
4, profile_to, profile_from, predivide, 4, profile_to, profile_from, predivide,
ibuf->x, ibuf->y, ibuf->x, ibuf->x); ibuf->x, ibuf->y, ibuf->x, ibuf->x);
} }
if (ibuf->rect) { if (ibuf->rect) {
IMB_buffer_byte_from_byte((uchar*)ibuf->rect, (uchar*)ibuf->rect, IMB_buffer_byte_from_byte((uchar *)ibuf->rect, (uchar *)ibuf->rect,
profile_to, profile_from, predivide, profile_to, profile_from, predivide,
ibuf->x, ibuf->y, ibuf->x, ibuf->x); ibuf->x, ibuf->y, ibuf->x, ibuf->x);
} }
/* set new profile */ /* set new profile */
ibuf->profile= profile; ibuf->profile = profile;
} }
/* use when you need to get a buffer with a certain profile /* use when you need to get a buffer with a certain profile
* if the return */ * if the return */
float *IMB_float_profile_ensure(ImBuf *ibuf, int profile, int *alloc) float *IMB_float_profile_ensure(ImBuf *ibuf, int profile, int *alloc)
{ {
int predivide= (ibuf->flags & IB_cm_predivide); int predivide = (ibuf->flags & IB_cm_predivide);
int profile_from, profile_to; int profile_from, profile_to;
/* determine profiles */ /* determine profiles */
@@ -696,7 +696,7 @@ float *IMB_float_profile_ensure(ImBuf *ibuf, int profile, int *alloc)
if (profile_from == profile_to) { if (profile_from == profile_to) {
/* simple case, just allocate the buffer and return */ /* simple case, just allocate the buffer and return */
*alloc= 0; *alloc = 0;
if (ibuf->rect_float == NULL) if (ibuf->rect_float == NULL)
IMB_float_from_rect(ibuf); IMB_float_from_rect(ibuf);
@@ -705,18 +705,18 @@ float *IMB_float_profile_ensure(ImBuf *ibuf, int profile, int *alloc)
} }
else { else {
/* conversion is needed, first check */ /* conversion is needed, first check */
float *fbuf= MEM_mallocN(ibuf->x * ibuf->y * sizeof(float) * 4, "IMB_float_profile_ensure"); float *fbuf = MEM_mallocN(ibuf->x * ibuf->y * sizeof(float) * 4, "IMB_float_profile_ensure");
*alloc= 1; *alloc = 1;
if (ibuf->rect_float == NULL) { if (ibuf->rect_float == NULL) {
IMB_buffer_float_from_byte(fbuf, (uchar*)ibuf->rect, IMB_buffer_float_from_byte(fbuf, (uchar *)ibuf->rect,
profile_to, profile_from, predivide, profile_to, profile_from, predivide,
ibuf->x, ibuf->y, ibuf->x, ibuf->x); ibuf->x, ibuf->y, ibuf->x, ibuf->x);
} }
else { else {
IMB_buffer_float_from_float(fbuf, ibuf->rect_float, IMB_buffer_float_from_float(fbuf, ibuf->rect_float,
4, profile_to, profile_from, predivide, 4, profile_to, profile_from, predivide,
ibuf->x, ibuf->y, ibuf->x, ibuf->x); ibuf->x, ibuf->y, ibuf->x, ibuf->x);
} }
return fbuf; return fbuf;
@@ -728,24 +728,24 @@ float *IMB_float_profile_ensure(ImBuf *ibuf, int profile, int *alloc)
/* no profile conversion */ /* no profile conversion */
void IMB_color_to_bw(ImBuf *ibuf) void IMB_color_to_bw(ImBuf *ibuf)
{ {
float *rctf= ibuf->rect_float; float *rctf = ibuf->rect_float;
uchar *rct= (uchar*)ibuf->rect; uchar *rct = (uchar *)ibuf->rect;
int i; int i;
if (rctf) { if (rctf) {
for (i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4) for (i = ibuf->x * ibuf->y; i > 0; i--, rctf += 4)
rctf[0]= rctf[1]= rctf[2]= rgb_to_grayscale(rctf); rctf[0] = rctf[1] = rctf[2] = rgb_to_grayscale(rctf);
} }
if (rct) { if (rct) {
for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) for (i = ibuf->x * ibuf->y; i > 0; i--, rct += 4)
rct[0]= rct[1]= rct[2]= rgb_to_grayscale_byte(rct); rct[0] = rct[1] = rct[2] = rgb_to_grayscale_byte(rct);
} }
} }
void IMB_buffer_float_clamp(float *buf, int width, int height) void IMB_buffer_float_clamp(float *buf, int width, int height)
{ {
int i, total = width*height*4; int i, total = width * height * 4;
for (i = 0; i < total; i++) { for (i = 0; i < total; i++) {
buf[i] = MIN2(1.0, buf[i]); buf[i] = MIN2(1.0, buf[i]);
} }
@@ -753,27 +753,27 @@ void IMB_buffer_float_clamp(float *buf, int width, int height)
/**************************** alter saturation *****************************/ /**************************** alter saturation *****************************/
void IMB_saturation(ImBuf * ibuf, float sat) void IMB_saturation(ImBuf *ibuf, float sat)
{ {
int i; int i;
unsigned char *rct= (unsigned char *)ibuf->rect; unsigned char *rct = (unsigned char *)ibuf->rect;
float *rctf= ibuf->rect_float; float *rctf = ibuf->rect_float;
float hsv[3]; float hsv[3];
if (rct) { if (rct) {
float rgb[3]; float rgb[3];
for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) { for (i = ibuf->x * ibuf->y; i > 0; i--, rct += 4) {
rgb_uchar_to_float(rgb, rct); rgb_uchar_to_float(rgb, rct);
rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv + 1, hsv + 2);
hsv_to_rgb(hsv[0], hsv[1] * sat, hsv[2], rgb, rgb+1, rgb+2); hsv_to_rgb(hsv[0], hsv[1] * sat, hsv[2], rgb, rgb + 1, rgb + 2);
rgb_float_to_uchar(rct, rgb); rgb_float_to_uchar(rct, rgb);
} }
} }
if (rctf) { if (rctf) {
for (i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4) { for (i = ibuf->x * ibuf->y; i > 0; i--, rctf += 4) {
rgb_to_hsv(rctf[0], rctf[1], rctf[2], hsv, hsv+1, hsv+2); rgb_to_hsv(rctf[0], rctf[1], rctf[2], hsv, hsv + 1, hsv + 2);
hsv_to_rgb(hsv[0], hsv[1] * sat, hsv[2], rctf, rctf+1, rctf+2); hsv_to_rgb(hsv[0], hsv[1] * sat, hsv[2], rctf, rctf + 1, rctf + 2);
} }
} }
} }

View File

@@ -49,19 +49,19 @@ static void filtrow(unsigned char *point, int x)
{ {
unsigned int c1, c2, c3, error; unsigned int c1, c2, c3, error;
if (x>1) { if (x > 1) {
c1 = c2 = *point; c1 = c2 = *point;
error = 2; error = 2;
for (x--;x>0;x--) { for (x--; x > 0; x--) {
c3 = point[4]; c3 = point[4];
c1 += (c2<<1) + c3 + error; c1 += (c2 << 1) + c3 + error;
error = c1 & 3; error = c1 & 3;
*point = c1 >> 2; *point = c1 >> 2;
point += 4; point += 4;
c1=c2; c1 = c2;
c2=c3; c2 = c3;
} }
*point = (c1 + (c2<<1) + c2 + error) >> 2; *point = (c1 + (c2 << 1) + c2 + error) >> 2;
} }
} }
@@ -69,17 +69,17 @@ static void filtrowf(float *point, int x)
{ {
float c1, c2, c3; float c1, c2, c3;
if (x>1) { if (x > 1) {
c1 = c2 = *point; c1 = c2 = *point;
for (x--;x>0;x--) { for (x--; x > 0; x--) {
c3 = point[4]; c3 = point[4];
c1 += (c2 * 2) + c3; c1 += (c2 * 2) + c3;
*point = 0.25f*c1; *point = 0.25f * c1;
point += 4; point += 4;
c1=c2; c1 = c2;
c2=c3; c2 = c3;
} }
*point = 0.25f*(c1 + (c2 * 2) + c2); *point = 0.25f * (c1 + (c2 * 2) + c2);
} }
} }
@@ -90,21 +90,21 @@ static void filtcolum(unsigned char *point, int y, int skip)
unsigned int c1, c2, c3, error; unsigned int c1, c2, c3, error;
unsigned char *point2; unsigned char *point2;
if (y>1) { if (y > 1) {
c1 = c2 = *point; c1 = c2 = *point;
point2 = point; point2 = point;
error = 2; error = 2;
for (y--;y>0;y--) { for (y--; y > 0; y--) {
point2 += skip; point2 += skip;
c3 = *point2; c3 = *point2;
c1 += (c2<<1) + c3 +error; c1 += (c2 << 1) + c3 + error;
error = c1 & 3; error = c1 & 3;
*point = c1 >> 2; *point = c1 >> 2;
point=point2; point = point2;
c1=c2; c1 = c2;
c2=c3; c2 = c3;
} }
*point = (c1 + (c2<<1) + c2 + error) >> 2; *point = (c1 + (c2 << 1) + c2 + error) >> 2;
} }
} }
@@ -112,19 +112,19 @@ static void filtcolumf(float *point, int y, int skip)
{ {
float c1, c2, c3, *point2; float c1, c2, c3, *point2;
if (y>1) { if (y > 1) {
c1 = c2 = *point; c1 = c2 = *point;
point2 = point; point2 = point;
for (y--;y>0;y--) { for (y--; y > 0; y--) {
point2 += skip; point2 += skip;
c3 = *point2; c3 = *point2;
c1 += (c2 * 2) + c3; c1 += (c2 * 2) + c3;
*point = 0.25f*c1; *point = 0.25f * c1;
point=point2; point = point2;
c1=c2; c1 = c2;
c2=c3; c2 = c3;
} }
*point = 0.25f*(c1 + (c2 * 2) + c2); *point = 0.25f * (c1 + (c2 * 2) + c2);
} }
} }
@@ -139,9 +139,9 @@ void IMB_filtery(struct ImBuf *ibuf)
x = ibuf->x; x = ibuf->x;
y = ibuf->y; y = ibuf->y;
skip = x<<2; skip = x << 2;
for (;x>0;x--) { for (; x > 0; x--) {
if (point) { if (point) {
if (ibuf->planes > 24) filtcolum(point, y, skip); if (ibuf->planes > 24) filtcolum(point, y, skip);
point++; point++;
@@ -177,9 +177,9 @@ void imb_filterx(struct ImBuf *ibuf)
x = ibuf->x; x = ibuf->x;
y = ibuf->y; y = ibuf->y;
skip = (x<<2) - 3; skip = (x << 2) - 3;
for (;y>0;y--) { for (; y > 0; y--) {
if (point) { if (point) {
if (ibuf->planes > 24) filtrow(point, x); if (ibuf->planes > 24) filtrow(point, x);
point++; point++;
@@ -188,7 +188,7 @@ void imb_filterx(struct ImBuf *ibuf)
filtrow(point, x); filtrow(point, x);
point++; point++;
filtrow(point, x); filtrow(point, x);
point+=skip; point += skip;
} }
if (pointf) { if (pointf) {
if (ibuf->planes > 24) filtrowf(pointf, x); if (ibuf->planes > 24) filtrowf(pointf, x);
@@ -198,7 +198,7 @@ void imb_filterx(struct ImBuf *ibuf)
filtrowf(pointf, x); filtrowf(pointf, x);
pointf++; pointf++;
filtrowf(pointf, x); filtrowf(pointf, x);
pointf+=skip; pointf += skip;
} }
} }
} }
@@ -209,44 +209,44 @@ void IMB_filterN(ImBuf *out, ImBuf *in)
register char *cp, *r11, *r13, *r21, *r23, *r31, *r33; register char *cp, *r11, *r13, *r21, *r23, *r31, *r33;
int rowlen, x, y; int rowlen, x, y;
rowlen= in->x; rowlen = in->x;
for (y=0; y<in->y; y++) { for (y = 0; y < in->y; y++) {
/* setup rows */ /* setup rows */
row2= (char*)(in->rect + y*rowlen); row2 = (char *)(in->rect + y * rowlen);
row1= (y == 0)? row2: row2 - 4*rowlen; row1 = (y == 0) ? row2 : row2 - 4 * rowlen;
row3= (y == in->y-1)? row2: row2 + 4*rowlen; row3 = (y == in->y - 1) ? row2 : row2 + 4 * rowlen;
cp= (char *)(out->rect + y*rowlen); cp = (char *)(out->rect + y * rowlen);
for (x=0; x<rowlen; x++) { for (x = 0; x < rowlen; x++) {
if (x == 0) { if (x == 0) {
r11 = row1; r11 = row1;
r21 = row1; r21 = row1;
r31 = row1; r31 = row1;
} }
else { else {
r11 = row1-4; r11 = row1 - 4;
r21 = row1-4; r21 = row1 - 4;
r31 = row1-4; r31 = row1 - 4;
} }
if (x == rowlen-1) { if (x == rowlen - 1) {
r13 = row1; r13 = row1;
r23 = row1; r23 = row1;
r33 = row1; r33 = row1;
} }
else { else {
r13 = row1+4; r13 = row1 + 4;
r23 = row1+4; r23 = row1 + 4;
r33 = row1+4; r33 = row1 + 4;
} }
cp[0]= (r11[0] + 2*row1[0] + r13[0] + 2*r21[0] + 4*row2[0] + 2*r23[0] + r31[0] + 2*row3[0] + r33[0])>>4; cp[0] = (r11[0] + 2 * row1[0] + r13[0] + 2 * r21[0] + 4 * row2[0] + 2 * r23[0] + r31[0] + 2 * row3[0] + r33[0]) >> 4;
cp[1]= (r11[1] + 2*row1[1] + r13[1] + 2*r21[1] + 4*row2[1] + 2*r23[1] + r31[1] + 2*row3[1] + r33[1])>>4; cp[1] = (r11[1] + 2 * row1[1] + r13[1] + 2 * r21[1] + 4 * row2[1] + 2 * r23[1] + r31[1] + 2 * row3[1] + r33[1]) >> 4;
cp[2]= (r11[2] + 2*row1[2] + r13[2] + 2*r21[2] + 4*row2[2] + 2*r23[2] + r31[2] + 2*row3[2] + r33[2])>>4; cp[2] = (r11[2] + 2 * row1[2] + r13[2] + 2 * r21[2] + 4 * row2[2] + 2 * r23[2] + r31[2] + 2 * row3[2] + r33[2]) >> 4;
cp[3]= (r11[3] + 2*row1[3] + r13[3] + 2*r21[3] + 4*row2[3] + 2*r23[3] + r31[3] + 2*row3[3] + r33[3])>>4; cp[3] = (r11[3] + 2 * row1[3] + r13[3] + 2 * r21[3] + 4 * row2[3] + 2 * r23[3] + r31[3] + 2 * row3[3] + r33[3]) >> 4;
cp+=4; row1+=4; row2+=4; row3+=4; cp += 4; row1 += 4; row2 += 4; row3 += 4;
} }
} }
} }
@@ -263,32 +263,32 @@ void IMB_mask_filter_extend(char *mask, int width, int height)
int rowlen, x, y; int rowlen, x, y;
char *temprect; char *temprect;
rowlen= width; rowlen = width;
/* make a copy, to prevent flooding */ /* make a copy, to prevent flooding */
temprect= MEM_dupallocN(mask); temprect = MEM_dupallocN(mask);
for (y=1; y<=height; y++) { for (y = 1; y <= height; y++) {
/* setup rows */ /* setup rows */
row1= (char *)(temprect + (y-2)*rowlen); row1 = (char *)(temprect + (y - 2) * rowlen);
row2= row1 + rowlen; row2 = row1 + rowlen;
row3= row2 + rowlen; row3 = row2 + rowlen;
if (y==1) if (y == 1)
row1= row2; row1 = row2;
else if (y==height) else if (y == height)
row3= row2; row3 = row2;
for (x=0; x<rowlen; x++) { for (x = 0; x < rowlen; x++) {
if (mask[((y-1)*rowlen)+x]==0) { if (mask[((y - 1) * rowlen) + x] == 0) {
if (*row1 || *row2 || *row3 || *(row1+1) || *(row3+1) ) { if (*row1 || *row2 || *row3 || *(row1 + 1) || *(row3 + 1) ) {
mask[((y-1)*rowlen)+x] = FILTER_MASK_MARGIN; mask[((y - 1) * rowlen) + x] = FILTER_MASK_MARGIN;
} }
else if ((x!=rowlen-1) && (*(row1+2) || *(row2+2) || *(row3+2)) ) { else if ((x != rowlen - 1) && (*(row1 + 2) || *(row2 + 2) || *(row3 + 2)) ) {
mask[((y-1)*rowlen)+x] = FILTER_MASK_MARGIN; mask[((y - 1) * rowlen) + x] = FILTER_MASK_MARGIN;
} }
} }
if (x!=0) { if (x != 0) {
row1++; row2++; row3++; row1++; row2++; row3++;
} }
} }
@@ -301,10 +301,10 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val)
{ {
int x, y; int x, y;
if (ibuf->rect_float) { if (ibuf->rect_float) {
for (x=0; x<ibuf->x; x++) { for (x = 0; x < ibuf->x; x++) {
for (y=0; y<ibuf->y; y++) { for (y = 0; y < ibuf->y; y++) {
if (mask[ibuf->x*y + x] == val) { if (mask[ibuf->x * y + x] == val) {
float *col= ibuf->rect_float + 4*(ibuf->x*y + x); float *col = ibuf->rect_float + 4 * (ibuf->x * y + x);
col[0] = col[1] = col[2] = col[3] = 0.0f; col[0] = col[1] = col[2] = col[3] = 0.0f;
} }
} }
@@ -312,10 +312,10 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val)
} }
else { else {
/* char buffer */ /* char buffer */
for (x=0; x<ibuf->x; x++) { for (x = 0; x < ibuf->x; x++) {
for (y=0; y<ibuf->y; y++) { for (y = 0; y < ibuf->y; y++) {
if (mask[ibuf->x*y + x] == val) { if (mask[ibuf->x * y + x] == val) {
char *col= (char *)(ibuf->rect + ibuf->x*y + x); char *col = (char *)(ibuf->rect + ibuf->x * y + x);
col[0] = col[1] = col[2] = col[3] = 0; col[0] = col[1] = col[2] = col[3] = 0;
} }
} }
@@ -325,23 +325,23 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val)
static int filter_make_index(const int x, const int y, const int w, const int h) static int filter_make_index(const int x, const int y, const int w, const int h)
{ {
if (x<0 || x>=w || y<0 || y>=h) return -1; /* return bad index */ if (x < 0 || x >= w || y < 0 || y >= h) return -1; /* return bad index */
else return y*w+x; else return y * w + x;
} }
static int check_pixel_assigned(const void *buffer, const char *mask, const int index, const int depth, const int is_float) static int check_pixel_assigned(const void *buffer, const char *mask, const int index, const int depth, const int is_float)
{ {
int res = 0; int res = 0;
if (index>=0) { if (index >= 0) {
const int alpha_index = depth*index+(depth-1); const int alpha_index = depth * index + (depth - 1);
if (mask!=NULL) { if (mask != NULL) {
res = mask[index]!=0 ? 1 : 0; res = mask[index] != 0 ? 1 : 0;
} }
else if ( (is_float && ((const float *) buffer)[alpha_index]!=0.0f) || else if ( (is_float && ((const float *) buffer)[alpha_index] != 0.0f) ||
(!is_float && ((const unsigned char *) buffer)[alpha_index]!=0) ) { (!is_float && ((const unsigned char *) buffer)[alpha_index] != 0) ) {
res=1; res = 1;
} }
} }
@@ -354,93 +354,94 @@ static int check_pixel_assigned(const void *buffer, const char *mask, const int
* */ * */
void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter) void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter)
{ {
const int width= ibuf->x; const int width = ibuf->x;
const int height= ibuf->y; const int height = ibuf->y;
const int depth= 4; /* always 4 channels */ const int depth = 4; /* always 4 channels */
const int chsize= ibuf->rect_float ? sizeof(float) : sizeof(unsigned char); const int chsize = ibuf->rect_float ? sizeof(float) : sizeof(unsigned char);
const int bsize= width*height*depth*chsize; const int bsize = width * height * depth * chsize;
const int is_float= ibuf->rect_float!=NULL; const int is_float = ibuf->rect_float != NULL;
void *dstbuf= (void *) MEM_dupallocN(ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect); void *dstbuf = (void *) MEM_dupallocN(ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect);
char *dstmask= mask==NULL ? NULL : (char *) MEM_dupallocN(mask); char *dstmask = mask == NULL ? NULL : (char *) MEM_dupallocN(mask);
void *srcbuf= ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect; void *srcbuf = ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect;
char *srcmask= mask; char *srcmask = mask;
int cannot_early_out= 1, r, n, k, i, j, c; int cannot_early_out = 1, r, n, k, i, j, c;
float weight[25]; float weight[25];
/* build a weights buffer */ /* build a weights buffer */
n= 1; n = 1;
#if 0 #if 0
k= 0; k = 0;
for (i = -n; i <= n; i++) for (i = -n; i <= n; i++)
for (j = -n; j <= n; j++) for (j = -n; j <= n; j++)
weight[k++] = sqrt((float) i * i + j * j); weight[k++] = sqrt((float) i * i + j * j);
#endif #endif
weight[0]=1; weight[1]=2; weight[2]=1; weight[0] = 1; weight[1] = 2; weight[2] = 1;
weight[3]=2; weight[4]=0; weight[5]=2; weight[3] = 2; weight[4] = 0; weight[5] = 2;
weight[6]=1; weight[7]=2; weight[8]=1; weight[6] = 1; weight[7] = 2; weight[8] = 1;
/* run passes */ /* run passes */
for (r = 0; cannot_early_out == 1 && r < filter; r++) { for (r = 0; cannot_early_out == 1 && r < filter; r++) {
int x, y; int x, y;
cannot_early_out = 0; cannot_early_out = 0;
for (y= 0; y<height; y++) { for (y = 0; y < height; y++) {
for (x= 0; x<width; x++) { for (x = 0; x < width; x++) {
const int index= filter_make_index(x, y, width, height); const int index = filter_make_index(x, y, width, height);
/* only update unassigned pixels */ /* only update unassigned pixels */
if (!check_pixel_assigned(srcbuf, srcmask, index, depth, is_float)) { if (!check_pixel_assigned(srcbuf, srcmask, index, depth, is_float)) {
float tmp[4]; float tmp[4];
float wsum=0; float wsum = 0;
float acc[4]={0, 0, 0, 0}; float acc[4] = {0, 0, 0, 0};
k = 0; k = 0;
if (check_pixel_assigned(srcbuf, srcmask, filter_make_index(x-1, y, width, height), depth, is_float) || if (check_pixel_assigned(srcbuf, srcmask, filter_make_index(x - 1, y, width, height), depth, is_float) ||
check_pixel_assigned(srcbuf, srcmask, filter_make_index(x+1, y, width, height), depth, is_float) || check_pixel_assigned(srcbuf, srcmask, filter_make_index(x + 1, y, width, height), depth, is_float) ||
check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y-1, width, height), depth, is_float) || check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y - 1, width, height), depth, is_float) ||
check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y+1, width, height), depth, is_float)) { check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y + 1, width, height), depth, is_float))
for (i= -n; i<=n; i++) { {
for (j=-n; j<=n; j++) { for (i = -n; i <= n; i++) {
for (j = -n; j <= n; j++) {
if (i != 0 || j != 0) { if (i != 0 || j != 0) {
const int tmpindex= filter_make_index(x+i, y+j, width, height); const int tmpindex = filter_make_index(x + i, y + j, width, height);
if (check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float)) { if (check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float)) {
if (is_float) { if (is_float) {
for (c=0; c<depth; c++) for (c = 0; c < depth; c++)
tmp[c] = ((const float *) srcbuf)[depth*tmpindex+c]; tmp[c] = ((const float *) srcbuf)[depth * tmpindex + c];
} }
else { else {
for (c=0; c<depth; c++) for (c = 0; c < depth; c++)
tmp[c] = (float) ((const unsigned char *) srcbuf)[depth*tmpindex+c]; tmp[c] = (float) ((const unsigned char *) srcbuf)[depth * tmpindex + c];
} }
wsum+= weight[k]; wsum += weight[k];
for (c=0; c<depth; c++) for (c = 0; c < depth; c++)
acc[c]+= weight[k] * tmp[c]; acc[c] += weight[k] * tmp[c];
} }
} }
k++; k++;
} }
} }
if (wsum!=0) { if (wsum != 0) {
for (c=0; c<depth; c++) for (c = 0; c < depth; c++)
acc[c]/= wsum; acc[c] /= wsum;
if (is_float) { if (is_float) {
for (c=0; c<depth; c++) for (c = 0; c < depth; c++)
((float *) dstbuf)[depth*index+c] = acc[c]; ((float *) dstbuf)[depth * index + c] = acc[c];
} }
else { else {
for (c=0; c<depth; c++) { for (c = 0; c < depth; c++) {
((unsigned char *) dstbuf)[depth*index+c]= acc[c] > 255 ? 255 : (acc[c] < 0 ? 0 : ((unsigned char) (acc[c]+0.5f))); ((unsigned char *) dstbuf)[depth * index + c] = acc[c] > 255 ? 255 : (acc[c] < 0 ? 0 : ((unsigned char) (acc[c] + 0.5f)));
} }
} }
if (dstmask!=NULL) dstmask[index]=FILTER_MASK_MARGIN; /* assigned */ if (dstmask != NULL) dstmask[index] = FILTER_MASK_MARGIN; /* assigned */
cannot_early_out = 1; cannot_early_out = 1;
} }
} }
@@ -450,12 +451,12 @@ void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter)
/* keep the original buffer up to date. */ /* keep the original buffer up to date. */
memcpy(srcbuf, dstbuf, bsize); memcpy(srcbuf, dstbuf, bsize);
if (dstmask!=NULL) memcpy(srcmask, dstmask, width*height); if (dstmask != NULL) memcpy(srcmask, dstmask, width * height);
} }
/* free memory */ /* free memory */
MEM_freeN(dstbuf); MEM_freeN(dstbuf);
if (dstmask!=NULL) MEM_freeN(dstmask); if (dstmask != NULL) MEM_freeN(dstmask);
} }
/* threadsafe version, only recreates existing maps */ /* threadsafe version, only recreates existing maps */
@@ -464,14 +465,14 @@ void IMB_remakemipmap(ImBuf *ibuf, int use_filter)
ImBuf *hbuf = ibuf; ImBuf *hbuf = ibuf;
int curmap = 0; int curmap = 0;
ibuf->miptot= 1; ibuf->miptot = 1;
while (curmap < IB_MIPMAP_LEVELS) { while (curmap < IB_MIPMAP_LEVELS) {
if (ibuf->mipmap[curmap]) { if (ibuf->mipmap[curmap]) {
if (use_filter) { if (use_filter) {
ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect); ImBuf *nbuf = IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect);
IMB_filterN(nbuf, hbuf); IMB_filterN(nbuf, hbuf);
imb_onehalf_no_alloc(ibuf->mipmap[curmap], nbuf); imb_onehalf_no_alloc(ibuf->mipmap[curmap], nbuf);
IMB_freeImBuf(nbuf); IMB_freeImBuf(nbuf);
@@ -480,10 +481,10 @@ void IMB_remakemipmap(ImBuf *ibuf, int use_filter)
imb_onehalf_no_alloc(ibuf->mipmap[curmap], hbuf); imb_onehalf_no_alloc(ibuf->mipmap[curmap], hbuf);
} }
ibuf->miptot= curmap+2; ibuf->miptot = curmap + 2;
hbuf= ibuf->mipmap[curmap]; hbuf = ibuf->mipmap[curmap];
if (hbuf) if (hbuf)
hbuf->miplevel= curmap+1; hbuf->miplevel = curmap + 1;
if (!hbuf || (hbuf->x <= 2 && hbuf->y <= 2)) if (!hbuf || (hbuf->x <= 2 && hbuf->y <= 2))
break; break;
@@ -500,11 +501,11 @@ void IMB_makemipmap(ImBuf *ibuf, int use_filter)
imb_freemipmapImBuf(ibuf); imb_freemipmapImBuf(ibuf);
ibuf->miptot= 1; ibuf->miptot = 1;
while (curmap < IB_MIPMAP_LEVELS) { while (curmap < IB_MIPMAP_LEVELS) {
if (use_filter) { if (use_filter) {
ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect); ImBuf *nbuf = IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect);
IMB_filterN(nbuf, hbuf); IMB_filterN(nbuf, hbuf);
ibuf->mipmap[curmap] = IMB_onehalf(nbuf); ibuf->mipmap[curmap] = IMB_onehalf(nbuf);
IMB_freeImBuf(nbuf); IMB_freeImBuf(nbuf);
@@ -512,9 +513,9 @@ void IMB_makemipmap(ImBuf *ibuf, int use_filter)
else else
ibuf->mipmap[curmap] = IMB_onehalf(hbuf); ibuf->mipmap[curmap] = IMB_onehalf(hbuf);
ibuf->miptot= curmap+2; ibuf->miptot = curmap + 2;
hbuf= ibuf->mipmap[curmap]; hbuf = ibuf->mipmap[curmap];
hbuf->miplevel= curmap+1; hbuf->miplevel = curmap + 1;
if (hbuf->x <= 2 && hbuf->y <= 2) if (hbuf->x <= 2 && hbuf->y <= 2)
break; break;
@@ -525,8 +526,8 @@ void IMB_makemipmap(ImBuf *ibuf, int use_filter)
ImBuf *IMB_getmipmap(ImBuf *ibuf, int level) ImBuf *IMB_getmipmap(ImBuf *ibuf, int level)
{ {
CLAMP(level, 0, ibuf->miptot-1); CLAMP(level, 0, ibuf->miptot - 1);
return (level == 0)? ibuf: ibuf->mipmap[level-1]; return (level == 0) ? ibuf : ibuf->mipmap[level - 1];
} }
void IMB_premultiply_rect(unsigned int *rect, char planes, int w, int h) void IMB_premultiply_rect(unsigned int *rect, char planes, int w, int h)
@@ -534,22 +535,22 @@ void IMB_premultiply_rect(unsigned int *rect, char planes, int w, int h)
char *cp; char *cp;
int x, y, val; int x, y, val;
if (planes == 24) { /* put alpha at 255 */ if (planes == 24) { /* put alpha at 255 */
cp= (char *)(rect); cp = (char *)(rect);
for (y=0; y<h; y++) for (y = 0; y < h; y++)
for (x=0; x<w; x++, cp+=4) for (x = 0; x < w; x++, cp += 4)
cp[3]= 255; cp[3] = 255;
} }
else { else {
cp= (char *)(rect); cp = (char *)(rect);
for (y=0; y<h; y++) { for (y = 0; y < h; y++) {
for (x=0; x<w; x++, cp+=4) { for (x = 0; x < w; x++, cp += 4) {
val= cp[3]; val = cp[3];
cp[0]= (cp[0]*val)>>8; cp[0] = (cp[0] * val) >> 8;
cp[1]= (cp[1]*val)>>8; cp[1] = (cp[1] * val) >> 8;
cp[2]= (cp[2]*val)>>8; cp[2] = (cp[2] * val) >> 8;
} }
} }
} }
@@ -560,21 +561,21 @@ void IMB_premultiply_rect_float(float *rect_float, char planes, int w, int h)
float val, *cp; float val, *cp;
int x, y; int x, y;
if (planes==24) { /* put alpha at 1.0 */ if (planes == 24) { /* put alpha at 1.0 */
cp= rect_float; cp = rect_float;
for (y=0; y<h; y++) for (y = 0; y < h; y++)
for (x=0; x<w; x++, cp+=4) for (x = 0; x < w; x++, cp += 4)
cp[3]= 1.0; cp[3] = 1.0;
} }
else { else {
cp= rect_float; cp = rect_float;
for (y=0; y<h; y++) { for (y = 0; y < h; y++) {
for (x=0; x<w; x++, cp+=4) { for (x = 0; x < w; x++, cp += 4) {
val= cp[3]; val = cp[3];
cp[0]= cp[0]*val; cp[0] = cp[0] * val;
cp[1]= cp[1]*val; cp[1] = cp[1] * val;
cp[2]= cp[2]*val; cp[2] = cp[2] * val;
} }
} }
} }
@@ -583,7 +584,7 @@ void IMB_premultiply_rect_float(float *rect_float, char planes, int w, int h)
void IMB_premultiply_alpha(ImBuf *ibuf) void IMB_premultiply_alpha(ImBuf *ibuf)
{ {
if (ibuf==NULL) if (ibuf == NULL)
return; return;
if (ibuf->rect) if (ibuf->rect)

View File

@@ -61,13 +61,13 @@ void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf)
size = ibuf->x * ibuf->y; size = ibuf->x * ibuf->y;
while (size-- > 0) { while (size-- > 0) {
rt= cp[0]; rt = cp[0];
cp[0]= cp[3]; cp[0] = cp[3];
cp[3]= rt; cp[3] = rt;
rt= cp[1]; rt = cp[1];
cp[1]= cp[2]; cp[1] = cp[2];
cp[2]= rt; cp[2] = rt;
cp+= 4; cp += 4;
} }
} }
@@ -75,26 +75,26 @@ void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf)
size = ibuf->x * ibuf->y; size = ibuf->x * ibuf->y;
while (size-- > 0) { while (size-- > 0) {
rtf= cpf[0]; rtf = cpf[0];
cpf[0]= cpf[3]; cpf[0] = cpf[3];
cpf[3]= rtf; cpf[3] = rtf;
rtf= cpf[1]; rtf = cpf[1];
cpf[1]= cpf[2]; cpf[1] = cpf[2];
cpf[2]= rtf; cpf[2] = rtf;
cpf+= 4; cpf += 4;
} }
} }
} }
static void pixel_from_buffer(struct ImBuf *ibuf, unsigned char **outI, float **outF, int x, int y) static void pixel_from_buffer(struct ImBuf *ibuf, unsigned char **outI, float **outF, int x, int y)
{ {
int offset = ibuf->x * y * 4 + 4*x; int offset = ibuf->x * y * 4 + 4 * x;
if (ibuf->rect) if (ibuf->rect)
*outI= (unsigned char *)ibuf->rect + offset; *outI = (unsigned char *)ibuf->rect + offset;
if (ibuf->rect_float) if (ibuf->rect_float)
*outF= (float *)ibuf->rect_float + offset; *outF = (float *)ibuf->rect_float + offset;
} }
/************************************************************************** /**************************************************************************
@@ -111,11 +111,11 @@ static void pixel_from_buffer(struct ImBuf *ibuf, unsigned char **outI, float **
static float P(float k) static float P(float k)
{ {
float p1, p2, p3, p4; float p1, p2, p3, p4;
p1 = MAX2(k+2.0f, 0); p1 = MAX2(k + 2.0f, 0);
p2 = MAX2(k+1.0f, 0); p2 = MAX2(k + 1.0f, 0);
p3 = MAX2(k, 0); p3 = MAX2(k, 0);
p4 = MAX2(k-1.0f, 0); p4 = MAX2(k - 1.0f, 0);
return (float)(1.0f/6.0f)*( p1*p1*p1 - 4.0f * p2*p2*p2 + 6.0f * p3*p3*p3 - 4.0f * p4*p4*p4); return (float)(1.0f / 6.0f) * (p1 * p1 * p1 - 4.0f * p2 * p2 * p2 + 6.0f * p3 * p3 * p3 - 4.0f * p4 * p4 * p4);
} }
@@ -123,7 +123,7 @@ static float P(float k)
/* older, slower function, works the same as above */ /* older, slower function, works the same as above */
static float P(float k) static float P(float k)
{ {
return (float)(1.0f/6.0f)*( pow( MAX2(k+2.0f, 0), 3.0f ) - 4.0f * pow( MAX2(k+1.0f, 0), 3.0f ) + 6.0f * pow( MAX2(k, 0), 3.0f ) - 4.0f * pow( MAX2(k-1.0f, 0), 3.0f)); return (float)(1.0f / 6.0f) * (pow(MAX2(k + 2.0f, 0), 3.0f) - 4.0f * pow(MAX2(k + 1.0f, 0), 3.0f) + 6.0f * pow(MAX2(k, 0), 3.0f) - 4.0f * pow(MAX2(k - 1.0f, 0), 3.0f));
} }
#endif #endif
@@ -134,51 +134,51 @@ void bicubic_interpolation_color(struct ImBuf *in, unsigned char *outI, float *o
float a, b, w, wx, wy[4], outR, outG, outB, outA, *dataF; float a, b, w, wx, wy[4], outR, outG, outB, outA, *dataF;
/* sample area entirely outside image? */ /* sample area entirely outside image? */
if (ceil(u)<0 || floor(u)>in->x-1 || ceil(v)<0 || floor(v)>in->y-1) if (ceil(u) < 0 || floor(u) > in->x - 1 || ceil(v) < 0 || floor(v) > in->y - 1)
return; return;
/* ImBuf in must have a valid rect or rect_float, assume this is already checked */ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
i= (int)floor(u); i = (int)floor(u);
j= (int)floor(v); j = (int)floor(v);
a= u - i; a = u - i;
b= v - j; b = v - j;
outR = outG = outB = outA = 0.0f; outR = outG = outB = outA = 0.0f;
/* Optimized and not so easy to read */ /* Optimized and not so easy to read */
/* avoid calling multiple times */ /* avoid calling multiple times */
wy[0] = P(b-(-1)); wy[0] = P(b - (-1));
wy[1] = P(b- 0); wy[1] = P(b - 0);
wy[2] = P(b- 1); wy[2] = P(b - 1);
wy[3] = P(b- 2); wy[3] = P(b - 2);
for (n= -1; n<= 2; n++) { for (n = -1; n <= 2; n++) {
x1= i+n; x1 = i + n;
CLAMP(x1, 0, in->x-1); CLAMP(x1, 0, in->x - 1);
wx = P(n-a); wx = P(n - a);
for (m= -1; m<= 2; m++) { for (m = -1; m <= 2; m++) {
y1= j+m; y1 = j + m;
CLAMP(y1, 0, in->y-1); CLAMP(y1, 0, in->y - 1);
/* normally we could do this */ /* normally we could do this */
/* w = P(n-a) * P(b-m); */ /* w = P(n-a) * P(b-m); */
/* except that would call P() 16 times per pixel therefor pow() 64 times, better precalc these */ /* except that would call P() 16 times per pixel therefor pow() 64 times, better precalc these */
w = wx * wy[m+1]; w = wx * wy[m + 1];
if (outF) { if (outF) {
dataF= in->rect_float + in->x * y1 * 4 + 4*x1; dataF = in->rect_float + in->x * y1 * 4 + 4 * x1;
outR+= dataF[0] * w; outR += dataF[0] * w;
outG+= dataF[1] * w; outG += dataF[1] * w;
outB+= dataF[2] * w; outB += dataF[2] * w;
outA+= dataF[3] * w; outA += dataF[3] * w;
} }
if (outI) { if (outI) {
dataI= (unsigned char*)in->rect + in->x * y1 * 4 + 4*x1; dataI = (unsigned char *)in->rect + in->x * y1 * 4 + 4 * x1;
outR+= dataI[0] * w; outR += dataI[0] * w;
outG+= dataI[1] * w; outG += dataI[1] * w;
outB+= dataI[2] * w; outB += dataI[2] * w;
outA+= dataI[3] * w; outA += dataI[3] * w;
} }
} }
} }
@@ -187,24 +187,24 @@ void bicubic_interpolation_color(struct ImBuf *in, unsigned char *outI, float *o
#if 0 #if 0
/* older, slower function, works the same as above */ /* older, slower function, works the same as above */
for (n= -1; n<= 2; n++) { for (n = -1; n <= 2; n++) {
for (m= -1; m<= 2; m++) { for (m = -1; m <= 2; m++) {
x1= i+n; x1 = i + n;
y1= j+m; y1 = j + m;
if (x1>0 && x1 < in->x && y1>0 && y1<in->y) { if (x1 > 0 && x1 < in->x && y1 > 0 && y1 < in->y) {
if (do_float) { if (do_float) {
dataF= in->rect_float + in->x * y1 * 4 + 4*x1; dataF = in->rect_float + in->x * y1 * 4 + 4 * x1;
outR+= dataF[0] * P(n-a) * P(b-m); outR += dataF[0] * P(n - a) * P(b - m);
outG+= dataF[1] * P(n-a) * P(b-m); outG += dataF[1] * P(n - a) * P(b - m);
outB+= dataF[2] * P(n-a) * P(b-m); outB += dataF[2] * P(n - a) * P(b - m);
outA+= dataF[3] * P(n-a) * P(b-m); outA += dataF[3] * P(n - a) * P(b - m);
} }
if (do_rect) { if (do_rect) {
dataI= (unsigned char*)in->rect + in->x * y1 * 4 + 4*x1; dataI = (unsigned char *)in->rect + in->x * y1 * 4 + 4 * x1;
outR+= dataI[0] * P(n-a) * P(b-m); outR += dataI[0] * P(n - a) * P(b - m);
outG+= dataI[1] * P(n-a) * P(b-m); outG += dataI[1] * P(n - a) * P(b - m);
outB+= dataI[2] * P(n-a) * P(b-m); outB += dataI[2] * P(n - a) * P(b - m);
outA+= dataI[3] * P(n-a) * P(b-m); outA += dataI[3] * P(n - a) * P(b - m);
} }
} }
} }
@@ -212,16 +212,16 @@ void bicubic_interpolation_color(struct ImBuf *in, unsigned char *outI, float *o
#endif #endif
if (outI) { if (outI) {
outI[0]= (int)outR; outI[0] = (int)outR;
outI[1]= (int)outG; outI[1] = (int)outG;
outI[2]= (int)outB; outI[2] = (int)outB;
outI[3]= (int)outA; outI[3] = (int)outA;
} }
if (outF) { if (outF) {
outF[0]= outR; outF[0] = outR;
outF[1]= outG; outF[1] = outG;
outF[2]= outB; outF[2] = outB;
outF[3]= outA; outF[3] = outA;
} }
} }
@@ -246,68 +246,68 @@ void bilinear_interpolation_color(struct ImBuf *in, unsigned char *outI, float *
float *row1, *row2, *row3, *row4, a, b; float *row1, *row2, *row3, *row4, a, b;
unsigned char *row1I, *row2I, *row3I, *row4I; unsigned char *row1I, *row2I, *row3I, *row4I;
float a_b, ma_b, a_mb, ma_mb; float a_b, ma_b, a_mb, ma_mb;
float empty[4]= {0.0f, 0.0f, 0.0f, 0.0f}; float empty[4] = {0.0f, 0.0f, 0.0f, 0.0f};
unsigned char emptyI[4]= {0, 0, 0, 0}; unsigned char emptyI[4] = {0, 0, 0, 0};
int y1, y2, x1, x2; int y1, y2, x1, x2;
/* ImBuf in must have a valid rect or rect_float, assume this is already checked */ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
x1= (int)floor(u); x1 = (int)floor(u);
x2= (int)ceil(u); x2 = (int)ceil(u);
y1= (int)floor(v); y1 = (int)floor(v);
y2= (int)ceil(v); y2 = (int)ceil(v);
// sample area entirely outside image? // sample area entirely outside image?
if (x2<0 || x1>in->x-1 || y2<0 || y1>in->y-1) return; if (x2 < 0 || x1 > in->x - 1 || y2 < 0 || y1 > in->y - 1) return;
if (outF) { if (outF) {
// sample including outside of edges of image // sample including outside of edges of image
if (x1<0 || y1<0) row1= empty; if (x1 < 0 || y1 < 0) row1 = empty;
else row1= (float *)in->rect_float + in->x * y1 * 4 + 4*x1; else row1 = (float *)in->rect_float + in->x * y1 * 4 + 4 * x1;
if (x1<0 || y2>in->y-1) row2= empty; if (x1 < 0 || y2 > in->y - 1) row2 = empty;
else row2= (float *)in->rect_float + in->x * y2 * 4 + 4*x1; else row2 = (float *)in->rect_float + in->x * y2 * 4 + 4 * x1;
if (x2>in->x-1 || y1<0) row3= empty; if (x2 > in->x - 1 || y1 < 0) row3 = empty;
else row3= (float *)in->rect_float + in->x * y1 * 4 + 4*x2; else row3 = (float *)in->rect_float + in->x * y1 * 4 + 4 * x2;
if (x2>in->x-1 || y2>in->y-1) row4= empty; if (x2 > in->x - 1 || y2 > in->y - 1) row4 = empty;
else row4= (float *)in->rect_float + in->x * y2 * 4 + 4*x2; else row4 = (float *)in->rect_float + in->x * y2 * 4 + 4 * x2;
a= u-floorf(u); a = u - floorf(u);
b= v-floorf(v); b = v - floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b); a_b = a * b; ma_b = (1.0f - a) * b; a_mb = a * (1.0f - b); ma_mb = (1.0f - a) * (1.0f - b);
outF[0]= ma_mb*row1[0] + a_mb*row3[0] + ma_b*row2[0]+ a_b*row4[0]; outF[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0];
outF[1]= ma_mb*row1[1] + a_mb*row3[1] + ma_b*row2[1]+ a_b*row4[1]; outF[1] = ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1];
outF[2]= ma_mb*row1[2] + a_mb*row3[2] + ma_b*row2[2]+ a_b*row4[2]; outF[2] = ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2];
outF[3]= ma_mb*row1[3] + a_mb*row3[3] + ma_b*row2[3]+ a_b*row4[3]; outF[3] = ma_mb * row1[3] + a_mb * row3[3] + ma_b * row2[3] + a_b * row4[3];
} }
if (outI) { if (outI) {
// sample including outside of edges of image // sample including outside of edges of image
if (x1<0 || y1<0) row1I= emptyI; if (x1 < 0 || y1 < 0) row1I = emptyI;
else row1I= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x1; else row1I = (unsigned char *)in->rect + in->x * y1 * 4 + 4 * x1;
if (x1<0 || y2>in->y-1) row2I= emptyI; if (x1 < 0 || y2 > in->y - 1) row2I = emptyI;
else row2I= (unsigned char *)in->rect + in->x * y2 * 4 + 4*x1; else row2I = (unsigned char *)in->rect + in->x * y2 * 4 + 4 * x1;
if (x2>in->x-1 || y1<0) row3I= emptyI; if (x2 > in->x - 1 || y1 < 0) row3I = emptyI;
else row3I= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x2; else row3I = (unsigned char *)in->rect + in->x * y1 * 4 + 4 * x2;
if (x2>in->x-1 || y2>in->y-1) row4I= emptyI; if (x2 > in->x - 1 || y2 > in->y - 1) row4I = emptyI;
else row4I= (unsigned char *)in->rect + in->x * y2 * 4 + 4*x2; else row4I = (unsigned char *)in->rect + in->x * y2 * 4 + 4 * x2;
a= u-floorf(u); a = u - floorf(u);
b= v-floorf(v); b = v - floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b); a_b = a * b; ma_b = (1.0f - a) * b; a_mb = a * (1.0f - b); ma_mb = (1.0f - a) * (1.0f - b);
/* need to add 0.5 to avoid rounding down (causes darken with the smear brush) /* need to add 0.5 to avoid rounding down (causes darken with the smear brush)
* tested with white images and this should not wrap back to zero */ * tested with white images and this should not wrap back to zero */
outI[0]= (ma_mb*row1I[0] + a_mb*row3I[0] + ma_b*row2I[0]+ a_b*row4I[0]) + 0.5f; outI[0] = (ma_mb * row1I[0] + a_mb * row3I[0] + ma_b * row2I[0] + a_b * row4I[0]) + 0.5f;
outI[1]= (ma_mb*row1I[1] + a_mb*row3I[1] + ma_b*row2I[1]+ a_b*row4I[1]) + 0.5f; outI[1] = (ma_mb * row1I[1] + a_mb * row3I[1] + ma_b * row2I[1] + a_b * row4I[1]) + 0.5f;
outI[2]= (ma_mb*row1I[2] + a_mb*row3I[2] + ma_b*row2I[2]+ a_b*row4I[2]) + 0.5f; outI[2] = (ma_mb * row1I[2] + a_mb * row3I[2] + ma_b * row2I[2] + a_b * row4I[2]) + 0.5f;
outI[3]= (ma_mb*row1I[3] + a_mb*row3I[3] + ma_b*row2I[3]+ a_b*row4I[3]) + 0.5f; outI[3] = (ma_mb * row1I[3] + a_mb * row3I[3] + ma_b * row2I[3] + a_b * row4I[3]) + 0.5f;
} }
} }
@@ -327,54 +327,54 @@ void bilinear_interpolation_color_wrap(struct ImBuf *in, unsigned char *outI, fl
/* ImBuf in must have a valid rect or rect_float, assume this is already checked */ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
x1= (int)floor(u); x1 = (int)floor(u);
x2= (int)ceil(u); x2 = (int)ceil(u);
y1= (int)floor(v); y1 = (int)floor(v);
y2= (int)ceil(v); y2 = (int)ceil(v);
// sample area entirely outside image? // sample area entirely outside image?
if (x2<0 || x1>in->x-1 || y2<0 || y1>in->y-1) return; if (x2 < 0 || x1 > in->x - 1 || y2 < 0 || y1 > in->y - 1) return;
/* wrap interpolation pixels - main difference from bilinear_interpolation_color */ /* wrap interpolation pixels - main difference from bilinear_interpolation_color */
if (x1<0)x1= in->x+x1; if (x1 < 0) x1 = in->x + x1;
if (y1<0)y1= in->y+y1; if (y1 < 0) y1 = in->y + y1;
if (x2>=in->x)x2= x2-in->x; if (x2 >= in->x) x2 = x2 - in->x;
if (y2>=in->y)y2= y2-in->y; if (y2 >= in->y) y2 = y2 - in->y;
if (outF) { if (outF) {
// sample including outside of edges of image // sample including outside of edges of image
row1= (float *)in->rect_float + in->x * y1 * 4 + 4*x1; row1 = (float *)in->rect_float + in->x * y1 * 4 + 4 * x1;
row2= (float *)in->rect_float + in->x * y2 * 4 + 4*x1; row2 = (float *)in->rect_float + in->x * y2 * 4 + 4 * x1;
row3= (float *)in->rect_float + in->x * y1 * 4 + 4*x2; row3 = (float *)in->rect_float + in->x * y1 * 4 + 4 * x2;
row4= (float *)in->rect_float + in->x * y2 * 4 + 4*x2; row4 = (float *)in->rect_float + in->x * y2 * 4 + 4 * x2;
a= u-floorf(u); a = u - floorf(u);
b= v-floorf(v); b = v - floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b); a_b = a * b; ma_b = (1.0f - a) * b; a_mb = a * (1.0f - b); ma_mb = (1.0f - a) * (1.0f - b);
outF[0]= ma_mb*row1[0] + a_mb*row3[0] + ma_b*row2[0]+ a_b*row4[0]; outF[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0];
outF[1]= ma_mb*row1[1] + a_mb*row3[1] + ma_b*row2[1]+ a_b*row4[1]; outF[1] = ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1];
outF[2]= ma_mb*row1[2] + a_mb*row3[2] + ma_b*row2[2]+ a_b*row4[2]; outF[2] = ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2];
outF[3]= ma_mb*row1[3] + a_mb*row3[3] + ma_b*row2[3]+ a_b*row4[3]; outF[3] = ma_mb * row1[3] + a_mb * row3[3] + ma_b * row2[3] + a_b * row4[3];
} }
if (outI) { if (outI) {
// sample including outside of edges of image // sample including outside of edges of image
row1I= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x1; row1I = (unsigned char *)in->rect + in->x * y1 * 4 + 4 * x1;
row2I= (unsigned char *)in->rect + in->x * y2 * 4 + 4*x1; row2I = (unsigned char *)in->rect + in->x * y2 * 4 + 4 * x1;
row3I= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x2; row3I = (unsigned char *)in->rect + in->x * y1 * 4 + 4 * x2;
row4I= (unsigned char *)in->rect + in->x * y2 * 4 + 4*x2; row4I = (unsigned char *)in->rect + in->x * y2 * 4 + 4 * x2;
a= u-floorf(u); a = u - floorf(u);
b= v-floorf(v); b = v - floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b); a_b = a * b; ma_b = (1.0f - a) * b; a_mb = a * (1.0f - b); ma_mb = (1.0f - a) * (1.0f - b);
/* need to add 0.5 to avoid rounding down (causes darken with the smear brush) /* need to add 0.5 to avoid rounding down (causes darken with the smear brush)
* tested with white images and this should not wrap back to zero */ * tested with white images and this should not wrap back to zero */
outI[0]= (ma_mb*row1I[0] + a_mb*row3I[0] + ma_b*row2I[0]+ a_b*row4I[0]) + 0.5f; outI[0] = (ma_mb * row1I[0] + a_mb * row3I[0] + ma_b * row2I[0] + a_b * row4I[0]) + 0.5f;
outI[1]= (ma_mb*row1I[1] + a_mb*row3I[1] + ma_b*row2I[1]+ a_b*row4I[1]) + 0.5f; outI[1] = (ma_mb * row1I[1] + a_mb * row3I[1] + ma_b * row2I[1] + a_b * row4I[1]) + 0.5f;
outI[2]= (ma_mb*row1I[2] + a_mb*row3I[2] + ma_b*row2I[2]+ a_b*row4I[2]) + 0.5f; outI[2] = (ma_mb * row1I[2] + a_mb * row3I[2] + ma_b * row2I[2] + a_b * row4I[2]) + 0.5f;
outI[3]= (ma_mb*row1I[3] + a_mb*row3I[3] + ma_b*row2I[3]+ a_b*row4I[3]) + 0.5f; outI[3] = (ma_mb * row1I[3] + a_mb * row3I[3] + ma_b * row2I[3] + a_b * row4I[3]) + 0.5f;
} }
} }
@@ -401,41 +401,41 @@ void neareast_interpolation_color(struct ImBuf *in, unsigned char *outI, float *
/* ImBuf in must have a valid rect or rect_float, assume this is already checked */ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
x1= (int)(u); x1 = (int)(u);
y1= (int)(v); y1 = (int)(v);
// sample area entirely outside image? // sample area entirely outside image?
if (x1<0 || x1>in->x-1 || y1<0 || y1>in->y-1) return; if (x1 < 0 || x1 > in->x - 1 || y1 < 0 || y1 > in->y - 1) return;
// sample including outside of edges of image // sample including outside of edges of image
if (x1<0 || y1<0) { if (x1 < 0 || y1 < 0) {
if (outI) { if (outI) {
outI[0]= 0; outI[0] = 0;
outI[1]= 0; outI[1] = 0;
outI[2]= 0; outI[2] = 0;
outI[3]= 0; outI[3] = 0;
} }
if (outF) { if (outF) {
outF[0]= 0.0f; outF[0] = 0.0f;
outF[1]= 0.0f; outF[1] = 0.0f;
outF[2]= 0.0f; outF[2] = 0.0f;
outF[3]= 0.0f; outF[3] = 0.0f;
} }
} }
else { else {
dataI= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x1; dataI = (unsigned char *)in->rect + in->x * y1 * 4 + 4 * x1;
if (outI) { if (outI) {
outI[0]= dataI[0]; outI[0] = dataI[0];
outI[1]= dataI[1]; outI[1] = dataI[1];
outI[2]= dataI[2]; outI[2] = dataI[2];
outI[3]= dataI[3]; outI[3] = dataI[3];
} }
dataF= in->rect_float + in->x * y1 * 4 + 4*x1; dataF = in->rect_float + in->x * y1 * 4 + 4 * x1;
if (outF) { if (outF) {
outF[0]= dataF[0]; outF[0] = dataF[0];
outF[1]= dataF[1]; outF[1] = dataF[1];
outF[2]= dataF[2]; outF[2] = dataF[2];
outF[3]= dataF[3]; outF[3] = dataF[3];
} }
} }
} }

View File

@@ -44,7 +44,7 @@
#include "IMB_allocimbuf.h" #include "IMB_allocimbuf.h"
void IMB_flipy(struct ImBuf * ibuf) void IMB_flipy(struct ImBuf *ibuf)
{ {
int x, y; int x, y;
@@ -57,47 +57,47 @@ void IMB_flipy(struct ImBuf * ibuf)
y = ibuf->y; y = ibuf->y;
top = ibuf->rect; top = ibuf->rect;
bottom = top + ((y-1) * x); bottom = top + ((y - 1) * x);
line= MEM_mallocN(x*sizeof(int), "linebuf"); line = MEM_mallocN(x * sizeof(int), "linebuf");
y >>= 1; y >>= 1;
for (;y>0;y--) { for (; y > 0; y--) {
memcpy(line, top, x*sizeof(int)); memcpy(line, top, x * sizeof(int));
memcpy(top, bottom, x*sizeof(int)); memcpy(top, bottom, x * sizeof(int));
memcpy(bottom, line, x*sizeof(int)); memcpy(bottom, line, x * sizeof(int));
bottom -= x; bottom -= x;
top+= x; top += x;
} }
MEM_freeN(line); MEM_freeN(line);
} }
if (ibuf->rect_float) { if (ibuf->rect_float) {
float *topf=NULL, *bottomf=NULL, *linef=NULL; float *topf = NULL, *bottomf = NULL, *linef = NULL;
x = ibuf->x; x = ibuf->x;
y = ibuf->y; y = ibuf->y;
topf= ibuf->rect_float; topf = ibuf->rect_float;
bottomf = topf + 4*((y-1) * x); bottomf = topf + 4 * ((y - 1) * x);
linef= MEM_mallocN(4*x*sizeof(float), "linebuff"); linef = MEM_mallocN(4 * x * sizeof(float), "linebuff");
y >>= 1; y >>= 1;
for (;y>0;y--) { for (; y > 0; y--) {
memcpy(linef, topf, 4*x*sizeof(float)); memcpy(linef, topf, 4 * x * sizeof(float));
memcpy(topf, bottomf, 4*x*sizeof(float)); memcpy(topf, bottomf, 4 * x * sizeof(float));
memcpy(bottomf, linef, 4*x*sizeof(float)); memcpy(bottomf, linef, 4 * x * sizeof(float));
bottomf -= 4*x; bottomf -= 4 * x;
topf+= 4*x; topf += 4 * x;
} }
MEM_freeN(linef); MEM_freeN(linef);
} }
} }
void IMB_flipx(struct ImBuf * ibuf) void IMB_flipx(struct ImBuf *ibuf)
{ {
int x, y, xr, xl, yi; int x, y, xr, xl, yi;
float px_f[4]; float px_f[4];
@@ -108,19 +108,19 @@ void IMB_flipx(struct ImBuf * ibuf)
y = ibuf->y; y = ibuf->y;
if (ibuf->rect) { if (ibuf->rect) {
for (yi=y-1;yi>=0;yi--) { for (yi = y - 1; yi >= 0; yi--) {
for (xr=x-1, xl=0; xr>=xl; xr--, xl++) { for (xr = x - 1, xl = 0; xr >= xl; xr--, xl++) {
SWAP(unsigned int, ibuf->rect[(x*yi)+xr], ibuf->rect[(x*yi)+xl]); SWAP(unsigned int, ibuf->rect[(x * yi) + xr], ibuf->rect[(x * yi) + xl]);
} }
} }
} }
if (ibuf->rect_float) { if (ibuf->rect_float) {
for (yi=y-1;yi>=0;yi--) { for (yi = y - 1; yi >= 0; yi--) {
for (xr=x-1, xl=0; xr>=xl; xr--, xl++) { for (xr = x - 1, xl = 0; xr >= xl; xr--, xl++) {
memcpy(&px_f, &ibuf->rect_float[((x*yi)+xr)*4], 4*sizeof(float)); memcpy(&px_f, &ibuf->rect_float[((x * yi) + xr) * 4], 4 * sizeof(float));
memcpy(&ibuf->rect_float[((x*yi)+xr)*4], &ibuf->rect_float[((x*yi)+xl)*4], 4*sizeof(float)); memcpy(&ibuf->rect_float[((x * yi) + xr) * 4], &ibuf->rect_float[((x * yi) + xl) * 4], 4 * sizeof(float));
memcpy(&ibuf->rect_float[((x*yi)+xl)*4], &px_f, 4*sizeof(float)); memcpy(&ibuf->rect_float[((x * yi) + xl) * 4], &px_f, 4 * sizeof(float));
} }
} }
} }

View File

@@ -47,10 +47,10 @@ short IMB_saveiff(struct ImBuf *ibuf, const char *name, int flags)
if (ibuf == NULL) return (FALSE); if (ibuf == NULL) return (FALSE);
ibuf->flags = flags; ibuf->flags = flags;
for (type=IMB_FILE_TYPES; type->is_a; type++) { for (type = IMB_FILE_TYPES; type->is_a; type++) {
if (type->save && type->ftype(type, ibuf)) { if (type->save && type->ftype(type, ibuf)) {
if (!(type->flag & IM_FTYPE_FLOAT)) { if (!(type->flag & IM_FTYPE_FLOAT)) {
if (ibuf->rect==NULL && ibuf->rect_float) if (ibuf->rect == NULL && ibuf->rect_float)
IMB_rect_from_float(ibuf); IMB_rect_from_float(ibuf);
} }
return type->save(ibuf, name, flags); return type->save(ibuf, name, flags);