⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dissolve.c

📁 Graphics Gems 源码 a collection of algorithms, programs, and mathematical techniques for the computer
💻 C
字号:
/* A Digital Dissolve Effectby Mike Mortonfrom "Graphics Gems", Academic Press, 1990user must provide copy() function.*//* * Code fragment to advance from one element to the next. * * int reg;				/* current sequence element * reg = 1;				/* start in any non-zero state * if (reg & 1)				/* is the bottom bit set? * 	reg = (reg >>1) ^ MASK;		/* yes: toss out 1 bit; XOR in mask * else reg = reg >>1;			/* no: toss out 0 bit  */int randmasks[32];	/* Gotta fill this in yourself. */dissolve1 (height, width)	/* first version of the dissolve 								/* algorithm */	int height, width;	/* number of rows, columns */{	int pixels, lastnum;	/* number of pixels; */				/* last pixel's number */	int regwidth;		/* "width" of sequence generator */	register long mask;	/* mask to XOR with to*/					/* create sequence */	register unsigned long element; 					/* one element of random sequence */	register int row, column;					/* row and column numbers for a pixel */	  /* Find smallest register which produces enough pixel numbers */	 pixels = height * width; /* compute number of pixels */							/* to dissolve */	 lastnum = pixels-1;	/* find last element (they go 0..lastnum) */	 regwidth = bitwidth ((unsigned int)lastnum); /* how wide must the */					/* register be? */	 mask = randmasks [regwidth];	/* which mask is for that width? */	 /* Now cycle through all sequence elements. */	  element = 1;	/* 1st element (could be any nonzero) */	  do {	    row = element / width;	/* how many rows down is this pixel? */	    column = element % width;	/* and how many columns across? */	    if (row < height)	/* is this seq element in the array? */	      copy (row, column);	/* yes: copy the (r,c)'th pixel */	    /* Compute the next sequence element */	    if (element & 1)		/* is the low bit set? */	      element = (element >>1)^mask;	/* yes: shift value, */						/* XOR in mask */	    else element = (element >>1);	/* no: just shift the value */	 } while (element != 1);		/* loop until we return  */						/* to original element */	 copy (0, 0);		/* kludge: the loop doesn't produce (0,0) */}						/* end of dissolve1() */int bitwidth (N)	/* find "bit-width" needed to represent N */	unsigned int N;	/* number to compute the width of */{	 int width = 0;	/* initially, no bits needed to represent N */	 while (N != 0) {	/* loop 'til N has been whittled down to 0 */	    N >>= 1;		/* shift N right 1 bit (NB: N is unsigned) */	    width++;		/* and remember how wide N is */	  }			/* end of loop shrinking N down to nothing */	  return (width);	/* return bit positions counted */}						/* end of bitwidth() */dissolve2 (height, width)	/* fast version of the dissolve algorithm */	int height, width;	/* number of rows, columns */{	int rwidth, cwidth;	/* bit width for rows, for columns */	int regwidth;		/* "width" of sequence generator */	register long mask;	/* mask to XOR with to create sequence */	register int rowshift;	/* shift distance to get row  */							/* from element */	register int colmask; /* mask to extract column from element */	register unsigned long element; /* one element of random */ 								    /* sequence */	register int row, column;    /* row and column for one pixel */	  /* Find the mask to produce all rows and columns. */	rwidth = bitwidth ((unsigned int)height); /* how many bits needed for height? */	cwidth = bitwidth ((unsigned int)width);  /* how many bits needed for width? */	regwidth = rwidth + cwidth; /* how wide must the register be? */	mask = randmasks [regwidth]; /* which mask is for that width? */ /* Find values to extract row and col numbers from each element. */	rowshift = cwidth; /* find dist to shift to get top bits (row) */	colmask = (1<<cwidth)-1;	/* find mask to extract  */						/* bottom bits (col) */	  /* Now cycle through all sequence elements. */	element = 1;	/* 1st element (could be any nonzero) */	do {		row = element >> rowshift; /* find row number for this pixel */		column = element & colmask; /* and how many columns across? */		if ((row < height)	/* does element fall in the array? */			&& (column < width)) /* ...must check row AND column */		copy (row, column); /* in bounds: copy the (r,c)'th pixel */	    /* Compute the next sequence element */		if (element & 1)		/* is the low bit set? */		element = (element >>1)^mask; /* yes: shift value, /*						/* XOR in mask */		else element = (element >>1); /* no: just shift the value */	} while (element != 1); 	/* loop until we return to */					/*  original element */	copy (0, 0);		/* kludge: element never comes up zero */}					/* end of dissolve2() */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -