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

📄 mipmap.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
		    }		}		temp += group_size;		percent = y_percent * highx_float;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {			totals[k] += (GLbyte)(*(temp_index)) * percent;		}	    } else {		percent = (highy_float-lowy_float)*(highx_float-lowx_float);		temp = (const char *)datain + xindex + lowy_int * ysize;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {			totals[k] += (GLbyte)(*(temp_index)) * percent;		}	    }	    /* this is for the pixels in the body */	    temp0 = (const char *)datain + xindex + group_size +		(lowy_int+1)*ysize;	    for (m = lowy_int+1; m < highy_int; m++) {		temp = temp0;		for(l = lowx_int+1; l < highx_int; l++) {		    for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {			totals[k] += (GLbyte)(*(temp_index));		    }		    temp += group_size;		}		temp0 += ysize;	    }	    outindex = (j + (i * widthout)) * components;	    for (k = 0; k < components; k++) {		dataout[outindex + k] = totals[k]/area;		/*printf("totals[%d] = %f\n", k, totals[k]);*/	    }	    lowx_int = highx_int;	    lowx_float = highx_float;	    highx_int += convx_int;	    highx_float += convx_float;	    if(highx_float > 1) {		highx_float -= 1.0;		highx_int++;	    }	}	lowy_int = highy_int;	lowy_float = highy_float;	highy_int += convy_int;	highy_float += convy_float;	if(highy_float > 1) {	    highy_float -= 1.0;	    highy_int++;	}    }}static void scale_internal_ushort(GLint components, GLint widthin,			   GLint heightin, const GLushort *datain,			   GLint widthout, GLint heightout,			   GLushort *dataout, GLint element_size,			   GLint ysize, GLint group_size,			   GLint myswap_bytes){    float convx;    float convy;    float percent;    /* Max components in a format is 4, so... */    float totals[4];    float area;    int i,j,k,xindex;    const char *temp, *temp0;    const char *temp_index;    int outindex;    int lowx_int, highx_int, lowy_int, highy_int;    float x_percent, y_percent;    float lowx_float, highx_float, lowy_float, highy_float;    float convy_float, convx_float;    int convy_int, convx_int;    int l, m;    const char *left, *right;    if (widthin == widthout*2 && heightin == heightout*2) {	halveImage_ushort(components, widthin, heightin,	(const GLushort *)datain, (GLushort *)dataout,	element_size, ysize, group_size, myswap_bytes);	return;    }    convy = (float) heightin/heightout;    convx = (float) widthin/widthout;    convy_int = floor(convy);    convy_float = convy - convy_int;    convx_int = floor(convx);    convx_float = convx - convx_int;    area = convx * convy;    lowy_int = 0;    lowy_float = 0;    highy_int = convy_int;    highy_float = convy_float;    for (i = 0; i < heightout; i++) {        /* Clamp here to be sure we don't read beyond input buffer. */        if (highy_int >= heightin)            highy_int = heightin - 1;	lowx_int = 0;	lowx_float = 0;	highx_int = convx_int;	highx_float = convx_float;	for (j = 0; j < widthout; j++) {	    /*	    ** Ok, now apply box filter to box that goes from (lowx, lowy)	    ** to (highx, highy) on input data into this pixel on output	    ** data.	    */	    totals[0] = totals[1] = totals[2] = totals[3] = 0.0;	    /* calculate the value for pixels in the 1st row */	    xindex = lowx_int*group_size;	    if((highy_int>lowy_int) && (highx_int>lowx_int)) {		y_percent = 1-lowy_float;		temp = (const char *)datain + xindex + lowy_int * ysize;		percent = y_percent * (1-lowx_float);		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}		left = temp;		for(l = lowx_int+1; l < highx_int; l++) {		    temp += group_size;		    for (k = 0, temp_index = temp; k < components;			 k++, temp_index += element_size) {			if (myswap_bytes) {			    totals[k] +=				 __GLU_SWAP_2_BYTES(temp_index) * y_percent;			} else {			    totals[k] += *(const GLushort*)temp_index * y_percent;			}		    }		}		temp += group_size;		right = temp;		percent = y_percent * highx_float;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}		/* calculate the value for pixels in the last row */	        		y_percent = highy_float;		percent = y_percent * (1-lowx_float);		temp = (const char *)datain + xindex + highy_int * ysize;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}		for(l = lowx_int+1; l < highx_int; l++) {		    temp += group_size;		    for (k = 0, temp_index = temp; k < components;			 k++, temp_index += element_size) {			if (myswap_bytes) {			    totals[k] +=				 __GLU_SWAP_2_BYTES(temp_index) * y_percent;			} else {			    totals[k] += *(const GLushort*)temp_index * y_percent;			}		    }		}		temp += group_size;		percent = y_percent * highx_float;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}		/* calculate the value for pixels in the 1st and last column */		for(m = lowy_int+1; m < highy_int; m++) {		    left += ysize;		    right += ysize;		    for (k = 0; k < components;			 k++, left += element_size, right += element_size) {			if (myswap_bytes) {			    totals[k] +=				__GLU_SWAP_2_BYTES(left) * (1-lowx_float) +				__GLU_SWAP_2_BYTES(right) * highx_float;			} else {			    totals[k] += *(const GLushort*)left * (1-lowx_float)				       + *(const GLushort*)right * highx_float;			}		    }		}	    } else if (highy_int > lowy_int) {		x_percent = highx_float - lowx_float;		percent = (1-lowy_float)*x_percent;		temp = (const char *)datain + xindex + lowy_int*ysize;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}		for(m = lowy_int+1; m < highy_int; m++) {		    temp += ysize;		    for (k = 0, temp_index = temp; k < components;			 k++, temp_index += element_size) {			if (myswap_bytes) {			    totals[k] +=				__GLU_SWAP_2_BYTES(temp_index) * x_percent;			} else {			    totals[k] += *(const GLushort*)temp_index * x_percent;			}		    }		}		percent = x_percent * highy_float;		temp += ysize;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}	    } else if (highx_int > lowx_int) {		y_percent = highy_float - lowy_float;		percent = (1-lowx_float)*y_percent;		temp = (const char *)datain + xindex + lowy_int*ysize;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}		for (l = lowx_int+1; l < highx_int; l++) {		    temp += group_size;		    for (k = 0, temp_index = temp; k < components;			 k++, temp_index += element_size) {			if (myswap_bytes) {			    totals[k] +=				__GLU_SWAP_2_BYTES(temp_index) * y_percent;			} else {			    totals[k] += *(const GLushort*)temp_index * y_percent;			}		    }		}		temp += group_size;		percent = y_percent * highx_float;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}	    } else {		percent = (highy_float-lowy_float)*(highx_float-lowx_float);		temp = (const char *)datain + xindex + lowy_int * ysize;		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			totals[k] += __GLU_SWAP_2_BYTES(temp_index) * percent;		    } else {			totals[k] += *(const GLushort*)temp_index * percent;		    }		}	    }	    /* this is for the pixels in the body */	    temp0 = (const char *)datain + xindex + group_size +		 (lowy_int+1)*ysize;	    for (m = lowy_int+1; m < highy_int; m++) {		temp = temp0;		for(l = lowx_int+1; l < highx_int; l++) {		    for (k = 0, temp_index = temp; k < components;			 k++, temp_index += element_size) {			if (myswap_bytes) {			    totals[k] += __GLU_SWAP_2_BYTES(temp_index);			} else {			    totals[k] += *(const GLushort*)temp_index;			}		    }		    temp += group_size;		}		temp0 += ysize;	    }	    outindex = (j + (i * widthout)) * components;	    for (k = 0; k < components; k++) {		dataout[outindex + k] = totals[k]/area;		/*printf("totals[%d] = %f\n", k, totals[k]);*/	    }	    lowx_int = highx_int;	    lowx_float = highx_float;	    highx_int += convx_int;	    highx_float += convx_float;	    if(highx_float > 1) {		highx_float -= 1.0;		highx_int++;	    }	}	lowy_int = highy_int;	lowy_float = highy_float;	highy_int += convy_int;	highy_float += convy_float;	if(highy_float > 1) {	    highy_float -= 1.0;	    highy_int++;	}    }}static void scale_internal_short(GLint components, GLint widthin,			   GLint heightin, const GLshort *datain,			   GLint widthout, GLint heightout,			   GLshort *dataout, GLint element_size,			   GLint ysize, GLint group_size,			   GLint myswap_bytes){    float convx;    float convy;    float percent;    /* Max components in a format is 4, so... */    float totals[4];    float area;    int i,j,k,xindex;    const char *temp, *temp0;    const char *temp_index;    int outindex;    int lowx_int, highx_int, lowy_int, highy_int;    float x_percent, y_percent;    float lowx_float, highx_float, lowy_float, highy_float;    float convy_float, convx_float;    int convy_int, convx_int;    int l, m;    const char *left, *right;    GLushort swapbuf;	/* unsigned buffer */    if (widthin == widthout*2 && heightin == heightout*2) {	halveImage_short(components, widthin, heightin,	(const GLshort *)datain, (GLshort *)dataout,	element_size, ysize, group_size, myswap_bytes);	return;    }    convy = (float) heightin/heightout;    convx = (float) widthin/widthout;    convy_int = floor(convy);    convy_float = convy - convy_int;    convx_int = floor(convx);    convx_float = convx - convx_int;    area = convx * convy;    lowy_int = 0;    lowy_float = 0;    highy_int = convy_int;    highy_float = convy_float;    for (i = 0; i < heightout; i++) {        /* Clamp here to be sure we don't read beyond input buffer. */        if (highy_int >= heightin)            highy_int = heightin - 1;	lowx_int = 0;	lowx_float = 0;	highx_int = convx_int;	highx_float = convx_float;	for (j = 0; j < widthout; j++) {	    /*	    ** Ok, now apply box filter to box that goes from (lowx, lowy)	    ** to (highx, highy) on input data into this pixel on output	    ** data.	    */	    totals[0] = totals[1] = totals[2] = totals[3] = 0.0;	    /* calculate the value for pixels in the 1st row */	    xindex = lowx_int*group_size;	    if((highy_int>lowy_int) && (highx_int>lowx_int)) {		y_percent = 1-lowy_float;		temp = (const char *)datain + xindex + lowy_int * ysize;		percent = y_percent * (1-lowx_float);		for (k = 0, temp_index = temp; k < components;		     k++, temp_index += element_size) {		    if (myswap_bytes) {			swapbuf = __GLU_SWAP_2_BYTES(temp_index);			totals[k] += *(const GLshort*)&swapbuf * percent;		    } else {			totals[k] += *(const GLshort*)temp_index * percent;		    }		}		left = temp;		for(l = lowx_int+1; l < highx_int; l++) {		    temp += group_size;		    for (k = 0, temp_index = temp; k < components;			 k++, temp_index += element_size) {			if (myswap_bytes) {			    swapbuf = __GLU_SWAP_2_BYTES(temp_index);			    totals[k] += *(const GLshort*)&swapbuf * y_percent;			} else {			    totals[k] += *(const GLshort*)temp_index * y_percent;			}		    }		}		temp += group_size;		right = temp;		percent = y_percent * highx_float;		for (k = 0, temp_index = temp; k < components;		     k++, tem

⌨️ 快捷键说明

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