/** * $Id:$ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** * * The contents of this file may be used under the terms of either the GNU * General Public License Version 2 or later (the "GPL", see * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or * later (the "BL", see http://www.blender.org/BL/ ) which has to be * bought from the Blender Foundation to become active, in which case the * above mentioned GPL option does not apply. * * The Original Code is Copyright (C) 2002 by NaN Holding BV. * All rights reserved. * * The Original Code is: all of this file. * * Contributor(s): none yet. * * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ #include "imbuf.h" #define OBJECTBLOK "delta" /************************************************************************/ /* DELTA'S */ /************************************************************************/ void addbpl(struct ImBuf *ibuf1, struct ImBuf *ibuf2) { int size,d; uint **list1,**list2; size = ibuf1->y * ibuf1->skipx; list1 = ibuf1->planes; list2 = ibuf2->planes; for (d = ibuf1->depth;d>0;d-=8){ int offset; for (offset=0; offset<size; offset++){ int i; register int rest; rest=0; for (i=0;i<8;i++){ register int data1,data2,restt; data1=(list1[i])[offset]; data2=(list2[i])[offset]; restt = data1 & rest; data1 = data1 ^ rest; rest = data1 & data2; (list1[i])[offset] = data1 ^ data2; rest |= restt; } } list1 +=8; list2 +=8; } } void subbpl(struct ImBuf *ibuf1, struct ImBuf *ibuf2) { int size,d; uint **list1,**list2; size = ibuf1->y * ibuf1->skipx; list1 = ibuf1->planes; list2 = ibuf2->planes; for (d = ibuf1->depth;d>0;d-=8){ int offset; for (offset=0; offset<size; offset++){ int i; register int rest; rest=0; for (i=0;i<8;i++){ register int data1,data2,restt; data1=(list1[i])[offset]; data2=(list2[i])[offset]; restt = ~(data1) & rest; data1 = data1 ^ rest; rest = ~(data1) & data2; (list1[i])[offset] = data1 ^ data2; rest |= restt; } } list1 +=8; list2 +=8; } } void swapbitsbpl(struct ImBuf *ibuf) { int size,d; uint **list; size = ibuf->y * ibuf->skipx; list = ibuf->planes; for (d = ibuf->depth;d>0;d-=8){ int offset; for (offset=0; offset<size; offset++){ int i,data1,data2; data1=(list[0])[offset]; for (i=0;i<7;i++){ data2=(list[i+1])[offset]; (list[i])[offset] = data2 ^ data1; data1=data2; } } list +=8; } } void deswapbitsbpl(struct ImBuf *ibuf) { int size,d; uint **list; size = ibuf->y * ibuf->skipx; list = ibuf->planes; for (d = ibuf->depth;d>0;d-=8){ int offset; for (offset=0; offset<size; offset++){ int i,data1,data2; data1=(list[7])[offset]; for (i=6;i>=0;i--){ data2=(list[i])[offset]; data2 ^= data1; (list[i])[offset] = data2; data1=data2; } } list +=8; } } void rectxorn(int *drect, int *srect, int x) { for(;x>0;x--){ *drect++ ^= *srect++; } } short makedelta(char *pic1,char *pic2,char *delta) { struct ImBuf *ibuf1,*ibuf2; extern void rectxor(); extern void rectsub(); short ok; ok=FALSE; ibuf1=loadiffname(pic1,IB_cmap); if (ibuf1){ ibuf2=loadiffname(pic2,IB_cmap); if (ibuf2){ if ((ibuf1->x == ibuf2->x) && (ibuf1->y == ibuf2->y) && (ibuf1->depth == ibuf2->depth)){ if ((ibuf1->planes != 0) && (ibuf2->planes !=0)){ subbpl(ibuf1,ibuf2); swapbitsbpl(ibuf1); if (saveiff(ibuf1,delta,IB_vert | IB_cmap)==0){ fprintf(stderr,"Makedelta: Couldn't save delta:%s\n",delta); } else ok=TRUE; } else if ((ibuf1->rect != 0) && (ibuf2->rect != 0)){ rectoptot(ibuf1,ibuf2,rectsub); if (saveiff(ibuf1,delta,IB_rect | IB_cmap)==0){ fprintf(stderr,"Makedelta: Couldn't save delta:%s\n",delta); } else ok=TRUE; } else{ fprintf(stderr,"Makedelta: %s, %s incompatible types\n",pic1,pic2); } } else{ fprintf(stderr,"Makedelta: %s, %s different sizes\n",pic1,pic2); } freeImBuf(ibuf2); } else{ fprintf(stderr,"Makedelta: Couldn't load pic: %s\n",pic2); } freeImBuf(ibuf1); } else{ fprintf(stderr,"Makedelta: Couldn't load pic: %s\n",pic1); } return (ok); }