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

📄 pix_map_base_routines.c

📁 在SOPC平台上
💻 C
📖 第 1 页 / 共 5 页
字号:
      else
      {
        *(unsigned short *)(dest_line_ptr) = src_pixel;
      }
      
      alpha_line_ptr += 1;
      src_line_ptr += 2;
      dest_line_ptr += 2;
    }
    alpha_ptr += alpha_increment;
    src_ptr += src_increment;
    dest_ptr += dest_increment;
  }
}

void blend_8_with_16_to_24(
                    void *alpha_ptr,
                    long alpha_active_width,
                    long alpha_active_height,
                    long alpha_color,
                    long alpha_line_width,
                    void *src_ptr,
                    long src_line_width,
                    void *dest_ptr,
                    long dest_line_width
                  )
{
  int row, col;
  void *alpha_line_ptr, *src_line_ptr, *dest_line_ptr;
  long alpha_increment, src_increment, dest_increment;
  unsigned char alpha_red, alpha_green, alpha_blue;
  unsigned char src_red, src_green, src_blue;
  unsigned char dest_red, dest_green, dest_blue;
  unsigned char next_alpha;
  unsigned short src_pixel;
  
  alpha_red   = (alpha_color >> 0)  & 0x000000ff;
  alpha_green = (alpha_color >> 8)  & 0x000000ff;
  alpha_blue  = (alpha_color >> 16) & 0x000000ff;

  alpha_increment = alpha_line_width;
  src_increment = src_line_width + src_line_width;
  dest_increment = dest_line_width + dest_line_width + dest_line_width;
    
  for( row = 0 ; row < alpha_active_height ; row++ )
  {
    alpha_line_ptr = alpha_ptr;
    src_line_ptr = src_ptr;
    dest_line_ptr = dest_ptr;
    for( col = 0 ; col < alpha_active_width ; col++ )
    {
      src_pixel  = *(unsigned short *)(src_line_ptr);
      src_red = ( ( src_pixel >> 11 ) & 0x1f ) << 3;
      src_green = ( ( src_pixel >> 5 ) & 0x3f ) << 2;
      src_blue = ( ( src_pixel >> 0 ) & 0x1f ) << 3;
        
      next_alpha = (*(unsigned char *)(alpha_line_ptr));
      
      if(next_alpha)
      {
        dest_red = ( ( next_alpha * ( alpha_red - src_red ) ) >> 8 ) + src_red;
        dest_green = ( ( next_alpha * ( alpha_green - src_green ) ) >> 8 ) + src_green;
        dest_blue = ( ( next_alpha * ( alpha_blue - src_blue ) ) >> 8 ) + src_blue;

        *(unsigned char *)(dest_line_ptr) = dest_red;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = dest_green;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = dest_blue;
        dest_line_ptr += 1;
      }
      else
      {
        *(unsigned char *)(dest_line_ptr) = src_red;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = src_green;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = src_blue;
        dest_line_ptr += 1;
      }
      alpha_line_ptr += 1;
      src_line_ptr += 2;
    }
    alpha_ptr += alpha_increment;
    src_ptr += src_increment;
    dest_ptr += dest_increment;
  }
}

void blend_8_with_16_to_32(
                    void *alpha_ptr,
                    long alpha_active_width,
                    long alpha_active_height,
                    long alpha_color,
                    long alpha_line_width,
                    void *src_ptr,
                    long src_line_width,
                    void *dest_ptr,
                    long dest_line_width
                  )
{
  int row, col;
  void *alpha_line_ptr, *src_line_ptr, *dest_line_ptr;
  long alpha_increment, src_increment, dest_increment;
  unsigned char alpha_red, alpha_green, alpha_blue;
  unsigned char src_red, src_green, src_blue;
  unsigned char dest_red, dest_green, dest_blue;
  unsigned char next_alpha;
  unsigned short src_pixel;
  
  alpha_red   = (alpha_color >> 0)  & 0x000000ff;
  alpha_green = (alpha_color >> 8)  & 0x000000ff;
  alpha_blue  = (alpha_color >> 16) & 0x000000ff;

  alpha_increment = alpha_line_width;
  src_increment = src_line_width + src_line_width;
  dest_increment = dest_line_width + dest_line_width + dest_line_width + dest_line_width;
    
  for( row = 0 ; row < alpha_active_height ; row++ )
  {
    alpha_line_ptr = alpha_ptr;
    src_line_ptr = src_ptr;
    dest_line_ptr = dest_ptr;
    for( col = 0 ; col < alpha_active_width ; col++ )
    {
      src_pixel  = *(unsigned short *)(src_line_ptr);
      src_red = ( ( src_pixel >> 11 ) & 0x1f ) << 3;
      src_green = ( ( src_pixel >> 5 ) & 0x3f ) << 2;
      src_blue = ( ( src_pixel >> 0 ) & 0x1f ) << 3;
      
      next_alpha = (*(unsigned char *)(alpha_line_ptr));
      
      if(next_alpha)
      {
        dest_red = ( ( next_alpha * ( alpha_red - src_red ) ) >> 8 ) + src_red;
        dest_green = ( ( next_alpha * ( alpha_green - src_green ) ) >> 8 ) + src_green;
        dest_blue = ( ( next_alpha * ( alpha_blue - src_blue ) ) >> 8 ) + src_blue;

        *(unsigned char *)(dest_line_ptr) = dest_red;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = dest_green;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = dest_blue;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = 0xff;
        dest_line_ptr += 1;
      }
      else
      {
        *(unsigned char *)(dest_line_ptr) = src_red;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = src_green;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = src_blue;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = 0xff;
        dest_line_ptr += 1;
      }
      alpha_line_ptr += 1;
      src_line_ptr += 2;
    }
    alpha_ptr += alpha_increment;
    src_ptr += src_increment;
    dest_ptr += dest_increment;
  }
}

void blend_8_with_24_to_16(
                    void *alpha_ptr,
                    long alpha_active_width,
                    long alpha_active_height,
                    long alpha_color,
                    long alpha_line_width,
                    void *src_ptr,
                    long src_line_width,
                    void *dest_ptr,
                    long dest_line_width
                  )
{
  int row, col;
  void *alpha_line_ptr, *src_line_ptr, *dest_line_ptr;
  long alpha_increment, src_increment, dest_increment;
  unsigned char alpha_red, alpha_green, alpha_blue;
  unsigned char src_red, src_green, src_blue;
  unsigned char dest_red, dest_green, dest_blue;
  unsigned char next_alpha;
  
  alpha_red   = (alpha_color >> 0)  & 0x000000ff;
  alpha_green = (alpha_color >> 8)  & 0x000000ff;
  alpha_blue  = (alpha_color >> 16) & 0x000000ff;

  alpha_increment = alpha_line_width;
  src_increment = src_line_width + src_line_width + src_line_width;
  dest_increment = dest_line_width + dest_line_width;
    
  for( row = 0 ; row < alpha_active_height ; row++ )
  {
    alpha_line_ptr = alpha_ptr;
    src_line_ptr = src_ptr;
    dest_line_ptr = dest_ptr;
    for( col = 0 ; col < alpha_active_width ; col++ )
    {
      src_red = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;
      src_green = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;
      src_blue = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;

      next_alpha = (*(unsigned char *)(alpha_line_ptr));
      
      if(next_alpha)
      {
        dest_red = ( ( next_alpha * ( alpha_red - src_red ) ) >> 8 ) + src_red;
        dest_green = ( ( next_alpha * ( alpha_green - src_green ) ) >> 8 ) + src_green;
        dest_blue = ( ( next_alpha * ( alpha_blue - src_blue ) ) >> 8 ) + src_blue;
        
        *(unsigned short *)(dest_line_ptr) =  ((( dest_red >> 3 ) & 0x1f ) << 11 ) |
                                              ((( dest_green >> 2 ) & 0x3f ) << 5 ) | 
                                              ((( dest_blue >> 3 ) & 0x1f ) << 0 );
      }
      else
      {
        *(unsigned short *)(dest_line_ptr) =  ((( src_red >> 3 ) & 0x1f ) << 11 ) |
                                              ((( src_green >> 2 ) & 0x3f ) << 5 ) | 
                                              ((( src_blue >> 3 ) & 0x1f ) << 0 );
      }
      
      alpha_line_ptr += 1;
      dest_line_ptr += 2;
    }
    alpha_ptr += alpha_increment;
    src_ptr += src_increment;
    dest_ptr += dest_increment;
  }
}

void blend_8_with_24_to_24(
                    void *alpha_ptr,
                    long alpha_active_width,
                    long alpha_active_height,
                    long alpha_color,
                    long alpha_line_width,
                    void *src_ptr,
                    long src_line_width,
                    void *dest_ptr,
                    long dest_line_width
                  )
{
  int row, col;
  void *alpha_line_ptr, *src_line_ptr, *dest_line_ptr;
  long alpha_increment, src_increment, dest_increment;
  unsigned char alpha_red, alpha_green, alpha_blue;
  unsigned char src_red, src_green, src_blue;
  unsigned char dest_red, dest_green, dest_blue;
  unsigned char next_alpha;
  
  alpha_red   = (alpha_color >> 0)  & 0x000000ff;
  alpha_green = (alpha_color >> 8)  & 0x000000ff;
  alpha_blue  = (alpha_color >> 16) & 0x000000ff;

  alpha_increment = alpha_line_width;
  src_increment = src_line_width + src_line_width + src_line_width;
  dest_increment = dest_line_width + dest_line_width + dest_line_width;
    
  for( row = 0 ; row < alpha_active_height ; row++ )
  {
    alpha_line_ptr = alpha_ptr;
    src_line_ptr = src_ptr;
    dest_line_ptr = dest_ptr;
    for( col = 0 ; col < alpha_active_width ; col++ )
    {
      src_red = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;
      src_green = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;
      src_blue = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;

      next_alpha = (*(unsigned char *)(alpha_line_ptr));
      
      if(next_alpha)
      {
        dest_red = ( ( next_alpha * ( alpha_red - src_red ) ) >> 8 ) + src_red;
        dest_green = ( ( next_alpha * ( alpha_green - src_green ) ) >> 8 ) + src_green;
        dest_blue = ( ( next_alpha * ( alpha_blue - src_blue ) ) >> 8 ) + src_blue;

        *(unsigned char *)(dest_line_ptr) = dest_red;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = dest_green;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = dest_blue;
        dest_line_ptr += 1;
      }
      else
      {
        *(unsigned char *)(dest_line_ptr) = src_red;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = src_green;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = src_blue;
        dest_line_ptr += 1;
      }
      alpha_line_ptr += 1;
    }
    alpha_ptr += alpha_increment;
    src_ptr += src_increment;
    dest_ptr += dest_increment;
  }
}

void blend_8_with_24_to_32(
                    void *alpha_ptr,
                    long alpha_active_width,
                    long alpha_active_height,
                    long alpha_color,
                    long alpha_line_width,
                    void *src_ptr,
                    long src_line_width,
                    void *dest_ptr,
                    long dest_line_width
                  )
{
  int row, col;
  void *alpha_line_ptr, *src_line_ptr, *dest_line_ptr;
  long alpha_increment, src_increment, dest_increment;
  unsigned char alpha_red, alpha_green, alpha_blue;
  unsigned char src_red, src_green, src_blue;
  unsigned char dest_red, dest_green, dest_blue;
  unsigned char next_alpha;
  
  alpha_red   = (alpha_color >> 0)  & 0x000000ff;
  alpha_green = (alpha_color >> 8)  & 0x000000ff;
  alpha_blue  = (alpha_color >> 16) & 0x000000ff;

  alpha_increment = alpha_line_width;
  src_increment = src_line_width + src_line_width + src_line_width;
  dest_increment = dest_line_width + dest_line_width + dest_line_width + dest_line_width;
    
  for( row = 0 ; row < alpha_active_height ; row++ )
  {
    alpha_line_ptr = alpha_ptr;
    src_line_ptr = src_ptr;
    dest_line_ptr = dest_ptr;
    for( col = 0 ; col < alpha_active_width ; col++ )
    {
      src_red = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;
      src_green = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;
      src_blue = (*(unsigned char *)(src_line_ptr));
      src_line_ptr += 1;
      
      next_alpha = (*(unsigned char *)(alpha_line_ptr));
      
      if(next_alpha)
      {
        dest_red = ( ( next_alpha * ( alpha_red - src_red ) ) >> 8 ) + src_red;
        dest_green = ( ( next_alpha * ( alpha_green - src_green ) ) >> 8 ) + src_green;
        dest_blue = ( ( next_alpha * ( alpha_blue - src_blue ) ) >> 8 ) + src_blue;

        *(unsigned char *)(dest_line_ptr) = dest_red;
        dest_line_ptr += 1;
        *(unsigned char *)(dest_line_ptr) = dest_green;
        dest_line

⌨️ 快捷键说明

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