使用AGG 来进行GIS地图描画

来源:互联网 发布:惠普打印机网络连接 编辑:程序博客网 时间:2024/04/28 02:22

准备把这个做成个系列。 大约有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);
}


//画单点
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;

    case 2:
        *(Uint16 *)p = pixel;
        break;

    case 3:
        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;

    case 4:
        *(Uint32 *)p = pixel;
        break;
    }
}

 

 

     AGG 是著名的开源矢量库。效率很高,速度快,模扳操作,也容易扩展。 今天有事情明天继续写。

 

 

 

原创粉丝点击