准备把这个做成个系列。 大约有4-5个主题。分几个方面,主要介绍几个主流工具,今天先写一个
1 为什么要AGG和SDL?
SDL 是网络上一个有名的开源的,2维图像库,SDL的结构清晰易懂,代码结构非常紧凑。
SDL结合了alpha Blend
bitBit
图象格式的存和取
基本库函数
事件,信号量控制
GUI和图象的缩放。
SDL简化了对图象因为相数位不同而引起的,复杂操作。而依靠SDL的多平台和系统支持,你以后的图像操作可以很容易的独立在系统层。
例子: 通过SDL_surface来屏幕画一个点的函数
//混合点RGBA
void
_PutRGBAPixel(SDL_Surface *s, Uint8 *pDst, Uint8 sR, Uint8 sG, Uint8 sB,
Uint8 sA, BLEND_FUNC func)
{
Uint32 cDst;
Uint8 dR, dG, dB, dA;
int alpha = 0;
cDst = _GET_PIXEL(s, pDst);
if ((s->flags & SDL_SRCCOLORKEY) && (cDst == s->format->colorkey)) {
_PUT_PIXEL(s, pDst, SDL_MapRGBA(s->format,
sR, sG, sB, sA));
} else {
SDL_GetRGBA(cDst, s->format, &dR, &dG, &dB, &dA);
switch (func) {
case _ALPHA_OVERLAY: alpha = dA+sA; break;
case _ALPHA_SRC: alpha = sA; break;
case _ALPHA_DST: alpha = dA; break;
case _ALPHA_ONE_MINUS_DST: alpha = 1-dA; break;
case _ALPHA_ONE_MINUS_SRC: alpha = 1-sA; break;
}
alpha = (alpha < 0) ? 0 : (alpha > 255) ? 255 : alpha;
_PUT_PIXEL(s, pDst, SDL_MapRGBA(s->format,
(((sR - dR) * sA) >> 8) + dR,
(((sG - dG) * sA) >> 8) + dG,
(((sB - dB) * sA) >> 8) + dB,
(Uint8)alpha));
}
}
//画透明点
void DrawRGBAPixel(SDL_Surface *surface, int x, int y, Uint32 color)
{
Uint8 r,g,b,a;
int bpp = surface->format->BytesPerPixel;
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
if(((Uint16)x >(Uint16)surface->w)||((Uint16)y >(Uint16)surface->h )) return;
SDL_GetRGBA(color, surface->format, &r, &g, &b, &a);
_PutRGBAPixel(surface,p,r,g,b,a,_ALPHA_OVERLAY);
}
case 2: case 3: case 4:
//画单点
void DrawRGBPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
if(((Uint16)x >(Uint16)surface->w)||((Uint16)y >(Uint16)surface->h )) return;
switch(bpp)
{
case 1:
*p = pixel;
break;
*(Uint16 *)p = pixel;
break;
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
*(Uint32 *)p = pixel;
break;
}
}
AGG 是著名的开源矢量库。效率很高,速度快,模扳操作,也容易扩展。 今天有事情明天继续写。