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

📄 sdl_gfxprimitives.c

📁 sdl的gfx开发包
💻 C
📖 第 1 页 / 共 5 页
字号:
	     * weighting for this pixel, and the complement of the weighting for	     * the paired pixel. 	     */	    wgt = (erracc >> intshift) & 255;	    result |= pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt);	    result |= pixelColorWeightNolock (dst, xx0, y0p1, color, wgt);	}    }    /*     * Do we have to draw the endpoint      */    if (draw_endpoint) {	/*	 * Draw final pixel, always exactly intersected by the line and doesn't	 * need to be weighted. 	 */	result |= pixelColorNolock (dst, x2, y2, color);    }    /* Unlock surface */    if (SDL_MUSTLOCK(dst)) {	SDL_UnlockSurface(dst);    }    return (result);}int aalineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color){    return (aalineColorInt(dst, x1, y1, x2, y2, color, 1));}int aalineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a){    return (aalineColorInt	    (dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a, 1));}/* ----- Circle *//* Note: Based on algorithm from sge library, modified by A. Schiffler *//* with multiple pixel-draw removal and other minor speedup changes.   */int circleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color){    Sint16 left, right, top, bottom;    int result;    Sint16 x1, y1, x2, y2;    Sint16 cx = 0;    Sint16 cy = r;    Sint16 ocx = (Sint16) 0xffff;    Sint16 ocy = (Sint16) 0xffff;    Sint16 df = 1 - r;    Sint16 d_e = 3;    Sint16 d_se = -2 * r + 5;    Sint16 xpcx, xmcx, xpcy, xmcy;    Sint16 ypcy, ymcy, ypcx, ymcx;    Uint8 *colorptr;    /*     * Sanity check radius      */    if (r < 0) {	return (-1);    }    /*     * Special case for r=0 - draw a point      */    if (r == 0) {	return (pixelColor(dst, x, y, color));    }    /*     * Get clipping boundary      */    left = dst->clip_rect.x;    right = dst->clip_rect.x + dst->clip_rect.w - 1;    top = dst->clip_rect.y;    bottom = dst->clip_rect.y + dst->clip_rect.h - 1;    /*     * Test if bounding box of circle is visible      */    x1 = x - r;    x2 = x + r;    y1 = y - r;    y2 = y + r;    if ((x1<left) && (x2<left)) {     return(0);    }     if ((x1>right) && (x2>right)) {     return(0);    }     if ((y1<top) && (y2<top)) {     return(0);    }     if ((y1>bottom) && (y2>bottom)) {     return(0);    }     /*     * Draw circle      */    result = 0;    /* Lock surface */    if (SDL_MUSTLOCK(dst)) {	if (SDL_LockSurface(dst) < 0) {	    return (-1);	}    }    /*     * Alpha Check      */    if ((color & 255) == 255) {	/*	 * No Alpha - direct memory writes 	 */	/*	 * Setup color 	 */	colorptr = (Uint8 *) & color;	if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {	    color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]);	} else {	    color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]);	}	/*	 * Draw 	 */	do {	    if ((ocy != cy) || (ocx != cx)) {		xpcx = x + cx;		xmcx = x - cx;		if (cy > 0) {		    ypcy = y + cy;		    ymcy = y - cy;		    result |= fastPixelColorNolock(dst, xmcx, ypcy, color);		    result |= fastPixelColorNolock(dst, xpcx, ypcy, color);		    result |= fastPixelColorNolock(dst, xmcx, ymcy, color);		    result |= fastPixelColorNolock(dst, xpcx, ymcy, color);		} else {		    result |= fastPixelColorNolock(dst, xmcx, y, color);		    result |= fastPixelColorNolock(dst, xpcx, y, color);		}		ocy = cy;		xpcy = x + cy;		xmcy = x - cy;		if (cx > 0) {		    ypcx = y + cx;		    ymcx = y - cx;		    result |= fastPixelColorNolock(dst, xmcy, ypcx, color);		    result |= fastPixelColorNolock(dst, xpcy, ypcx, color);		    result |= fastPixelColorNolock(dst, xmcy, ymcx, color);		    result |= fastPixelColorNolock(dst, xpcy, ymcx, color);		} else {		    result |= fastPixelColorNolock(dst, xmcy, y, color);		    result |= fastPixelColorNolock(dst, xpcy, y, color);		}		ocx = cx;	    }	    /*	     * Update 	     */	    if (df < 0) {		df += d_e;		d_e += 2;		d_se += 2;	    } else {		df += d_se;		d_e += 2;		d_se += 4;		cy--;	    }	    cx++;	} while (cx <= cy);	/*	 * Unlock surface 	 */	SDL_UnlockSurface(dst);    } else {	/*	 * Using Alpha - blended pixel blits 	 */	do {	    /*	     * Draw 	     */	    if ((ocy != cy) || (ocx != cx)) {		xpcx = x + cx;		xmcx = x - cx;		if (cy > 0) {		    ypcy = y + cy;		    ymcy = y - cy;		    result |= pixelColorNolock (dst, xmcx, ypcy, color);		    result |= pixelColorNolock (dst, xpcx, ypcy, color);		    result |= pixelColorNolock (dst, xmcx, ymcy, color);		    result |= pixelColorNolock (dst, xpcx, ymcy, color);		} else {		    result |= pixelColorNolock (dst, xmcx, y, color);		    result |= pixelColorNolock (dst, xpcx, y, color);		}		ocy = cy;		xpcy = x + cy;		xmcy = x - cy;		if (cx > 0) {		    ypcx = y + cx;		    ymcx = y - cx;		    result |= pixelColorNolock (dst, xmcy, ypcx, color);		    result |= pixelColorNolock (dst, xpcy, ypcx, color);		    result |= pixelColorNolock (dst, xmcy, ymcx, color);		    result |= pixelColorNolock (dst, xpcy, ymcx, color);		} else {		    result |= pixelColorNolock (dst, xmcy, y, color);		    result |= pixelColorNolock (dst, xpcy, y, color);		}		ocx = cx;	    }	    /*	     * Update 	     */	    if (df < 0) {		df += d_e;		d_e += 2;		d_se += 2;	    } else {		df += d_se;		d_e += 2;		d_se += 4;		cy--;	    }	    cx++;	} while (cx <= cy);    }				/* Alpha check */    /* Unlock surface */    if (SDL_MUSTLOCK(dst)) {	SDL_UnlockSurface(dst);    }    return (result);}int circleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a){    /*     * Draw      */    return (circleColor(dst, x, y, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a));}/* ----- AA Circle *//* AA circle is based on AAellipse  */int aacircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color){    return (aaellipseColor(dst, x, y, r, r, color));}int aacircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a){    /*     * Draw      */    return (aaellipseColor	    (dst, x, y, rad, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a));}/* ----- Filled Circle *//* Note: Based on algorithm from sge library with multiple-hline draw removal *//* and other speedup changes. */int filledCircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color){    Sint16 left, right, top, bottom;    int result;    Sint16 x1, y1, x2, y2;    Sint16 cx = 0;    Sint16 cy = r;    Sint16 ocx = (Sint16) 0xffff;    Sint16 ocy = (Sint16) 0xffff;    Sint16 df = 1 - r;    Sint16 d_e = 3;    Sint16 d_se = -2 * r + 5;    Sint16 xpcx, xmcx, xpcy, xmcy;    Sint16 ypcy, ymcy, ypcx, ymcx;    /*     * Sanity check radius      */    if (r < 0) {	return (-1);    }    /*     * Special case for r=0 - draw a point      */    if (r == 0) {	return (pixelColor(dst, x, y, color));    }    /*     * Get clipping boundary      */    left = dst->clip_rect.x;    right = dst->clip_rect.x + dst->clip_rect.w - 1;    top = dst->clip_rect.y;    bottom = dst->clip_rect.y + dst->clip_rect.h - 1;    /*     * Test if bounding box of circle is visible      */    x1 = x - r;    x2 = x + r;    y1 = y - r;    y2 = y + r;    if ((x1<left) && (x2<left)) {     return(0);    }     if ((x1>right) && (x2>right)) {     return(0);    }     if ((y1<top) && (y2<top)) {     return(0);    }     if ((y1>bottom) && (y2>bottom)) {     return(0);    }     /*     * Draw      */    result = 0;    do {	xpcx = x + cx;	xmcx = x - cx;	xpcy = x + cy;	xmcy = x - cy;	if (ocy != cy) {	    if (cy > 0) {		ypcy = y + cy;		ymcy = y - cy;		result |= hlineColor(dst, xmcx, xpcx, ypcy, color);		result |= hlineColor(dst, xmcx, xpcx, ymcy, color);	    } else {		result |= hlineColor(dst, xmcx, xpcx, y, color);	    }	    ocy = cy;	}	if (ocx != cx) {	    if (cx != cy) {		if (cx > 0) {		    ypcx = y + cx;		    ymcx = y - cx;		    result |= hlineColor(dst, xmcy, xpcy, ymcx, color);		    result |= hlineColor(dst, xmcy, xpcy, ypcx, color);		} else {		    result |= hlineColor(dst, xmcy, xpcy, y, color);		}	    }	    ocx = cx;	}	/*	 * Update 	 */	if (df < 0) {	    df += d_e;	    d_e += 2;	    d_se += 2;	} else {	    df += d_se;	    d_e += 2;	    d_se += 4;	    cy--;	}	cx++;    } while (cx <= cy);    return (result);}int filledCircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a){    /*     * Draw      */    return (filledCircleColor	    (dst, x, y, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a));}/* ----- Ellipse *//* Note: Based on algorithm from sge library with multiple-hline draw removal *//* and other speedup changes. */int ellipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color){    Sint16 left, right, top, bottom;    int result;    Sint16 x1, y1, x2, y2;    int ix, iy;    int h, i, j, k;    int oh, oi, oj, ok;    int xmh, xph, ypk, ymk;    int xmi, xpi, ymj, ypj;    int xmj, xpj, ymi, ypi;    int xmk, xpk, ymh, yph;    Uint8 *colorptr;    /*     * Sanity check radii      */    if ((rx < 0) || (ry < 0)) {	return (-1);    }    /*     * Special case for rx=0 - draw a vline      */    if (rx == 0) {	return (vlineColor(dst, x, y - ry, y + ry, color));    }    /*     * Special case for ry=0 - draw a hline      */    if (ry == 0) {	return (hlineColor(dst, x - rx, x + rx, y, color));    }    /*     * Get clipping boundary      */    left = dst->clip_rect.x;    right = dst->clip_rect.x + dst->clip_rect.w - 1;    top = dst->clip_rect.y;    bottom = dst->clip_rect.y + dst->clip_rect.h - 1;    /*     * Test if bounding box of ellipse is visible      */    x1 = x - rx;    x2 = x + rx;    y1 = y - ry;    y2 = y + ry;    if ((x1<left) && (x2<left)) {     return(0);    }     if ((x1>right) && (x2>right)) {     return(0);    }     if ((y1<top) && (y2<top)) {     return(0);    }     if ((y1>bottom) && (y2>bottom)) {     return(0);    }     /*     * Init vars      */    oh = oi = oj = ok = 0xFFFF;    /*     * Draw      */    result = 0;    /* Lock surface */    if (SDL_MUSTLOCK(dst)) {	if (SDL_LockSurface(dst) < 0) {	    return (-1);	}    }    /*     * Check alpha      */    if ((color & 255) == 255) {	/*	 * No Alpha - direct memory writes 	 */	/*	 * Setup color 	 */	colorptr = (Uint8 *) & color;	if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {	    color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]);	} else {	    color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]);	}	if (rx > ry) {	    ix = 0;	    iy = rx * 64;	    do {		h = (ix + 32) >> 6;		i = (iy + 32) >> 6;		j = (h * ry) / rx;		k = (i * ry) / rx;		if (((ok != k) && (oj != k)) || ((oj != j) && (ok != j)) || (k != j)) {		    xph = x + h;		    xmh = x - h;		    if (k > 0) {			ypk = y + k;			ymk = y - k;			result |= fastPixelColorNolock(dst, xmh, ypk, color);			result |= fastPixelColorNolock(dst, xph, ypk, color);			result |= fastPixelColorNolock(dst, xmh, ymk, color);			result |= fastPixelColorNolock(dst, xph, ymk, color);		    } else {			result |= fastPixelColorNolock(dst, xmh, y, color);			result |= fastPixelColorNolock(dst, xph, y, color);		    }		    ok = k;		    xpi = x + i;		    xmi = x - i;		    if (j > 0) {			ypj = y + j;			ymj = y - j;			result |= fastPixelColorNolock(dst, xmi, ypj, color);			result |= fastPixelColorNolock(dst, xpi, ypj, color);			result |= fastPixelColorNolock(dst, xmi, ymj, color);			result |= fastPixelColorNolock(dst, xpi, ymj, color);		    } else {			result |= fastPixelColorNolock(dst, xmi, y, color);			result |= fastPixelColorNolock(dst, xpi, y, color);		    }		    oj = j;		}		ix = ix + iy / rx;		iy = iy - ix / rx;	    } while (i > h);	} else {	    ix = 0;	    iy = ry * 64;	    do {		h = (ix + 32) >> 6;		i = (iy + 32) >> 6;		j = (h * rx) / ry;		k = (i * rx) / ry;		if (((oi != i) && (oh != i)) || ((oh != h) && (oi != h) && (i != h))) {		    xmj = x - j;		    xpj = x + j;		    if (i > 0) {			ypi = y + i;			ymi = y - i;			result |= fastPixelColorNolock(dst, xmj, ypi, color);			result |= fastPixelColorNolock(dst, xpj, ypi, color);			result |= fastPixelColorNolock(dst, xmj, ymi, color);			result |= fastPixelColorNolock(dst, xpj, ymi, color);		    } else {			result |= fastPixelColorNolock(dst, xmj, y, color);			result |= fastPixelColorNolock(dst, xpj, y, color);		    }		    oi = i;		    xmk = x - k;		    xpk = x + k;		    if (h > 0) {			yph = y + h;			ymh = y - h;			result |= fastPixelColorNolock(dst, xmk, yph, color);			result |= fastPixelColorNolock(dst, xpk, yph, color);			result |= fastPixelColorNolock(dst, xmk, ymh, color);			result |= fastPixelColorNolock(dst, xpk, ymh, color);		    } else {			result |= fastPixelColorNolock(dst, xmk, y, color);			result |= fastPixelColorNolock(dst, xpk, y, color);		    }		    oh = h;		}		ix = ix + iy / ry;		iy = iy - ix / ry;	    } while (i > h);	}    } else {	if (rx > ry) {	    ix = 0;	    iy = rx * 64;	    do {

⌨️ 快捷键说明

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