`
yarin
  • 浏览: 174257 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

BREW中几种常用的效果(淡淡浅出、半透明)

    博客分类:
  • Brew
阅读更多

版权申明:http://yarin.iteye.com/blog/453262

主要是给自己一个备份哈,谁需要谁拿去。代码如下:

/*****************************************************
  Function:FadeIn
  Desc:从0增加R,G,B颜色值,实现淡入效果
 Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,pSrc-源位图,16位色,width,height-源位图大小,必须确保ydst+height<pDst>Height,xdst+width<pDst->Width,
   step-步长
  Output:pDst-经过处理的位图
  Return:
*****************************************************/
void FadeIn(IBitmap *pDst,int xdst,int ydst,IBitmap *pSrc,int width,int height,int step)
{
  int x,y;
  int offset1,offset2;
  int offdst;
  int offsrc;
  uint16 dstcolor,srccolor;
  uint8 r,g,b;

  IDIB *dstdib = (IDIB*)pDst;
  IDIB *srcdib = (IDIB*)pSrc;
  
  // 获得实际的图片点阵数据
  uint16 *pDstBmp = (uint16*)dstdib->pBmp; 
  uint16 *pSrcBmp=(uint16 *)srcdib->pBmp;

  if(dstdib->nDepth!=16 || srcdib->nDepth!=16)
    return;
	// 一般手机屏幕都是16位,565格式
	if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
	{
    offset1=((ydst*dstdib->nPitch)>>1)+xdst;
    offset2=0;
    for(y=0;y<height;y++)
    {
      offdst=offset1;
      offsrc=offset2;
      for(x=0;x<width;x++)
      {
        dstcolor=pDstBmp[offdst];
        srccolor=pSrcBmp[offsrc];
        if(srccolor!=63519)
        {
          r=srccolor>>11;
          g=(srccolor>>5) & 0x3f;
          b=srccolor & 0x1f;
          if(step<r)
            r=step;
          if(step<g)
            g=step;
          if(step<b)
            b=step;
          pDstBmp[offdst]=r<<11 | g<<5 | b;
        }
        offsrc++;
        offdst++;
      }
      offset1+=(dstdib->nPitch>>1);
      offset2+=(srcdib->nPitch>>1);
    }
  }
}

/*****************************************************
  Function:Alpha256Bmp
  Desc:256色位图alpha混合,修改调色板,只适用256色位图,加快速度用。
 Input:pDst-目标位图,xdst,ydst-位置,width,height-半透明处理位图大小,pSrc-256色位图,xscr,yscr-源位置,R,G,B半透明颜色值,alpha
  Output:
  Return:
******************************************************/
void Alpha256Bmp(IBitmap *pDst,int xdst,int ydst,int width,int height,IBitmap *pSrc,
                 int xsrc,int ysrc,uint8 r, uint8 g, uint8 b,float alpha)
{
  uint8 dstcolor;
  uint32 *pPalette;
  uint32 *pBackup;
  byte   *pOrigBytes;
  byte   *pNowBytes;
  int    i;

  IDIB *srcdib = (IDIB*)pSrc;
  if(srcdib->nColorScheme>0)
    return;
  if(srcdib->cntRGB==0)
    return;
  pPalette=(uint32*)MALLOC(sizeof(uint32)*255);
  pNowBytes=(byte*)pPalette;
  pOrigBytes=(byte *)srcdib->pRGB;
  pBackup=srcdib->pRGB;
  for(i=0;i<srcdib->cntRGB;i++)
  {
    dstcolor=(*pOrigBytes++);
    dstcolor=(uint8)(dstcolor+(alpha*(r-dstcolor)));
    *pNowBytes++=dstcolor;
    dstcolor=(*pOrigBytes++);
    dstcolor=(uint8)(dstcolor+(alpha*(g-dstcolor)));
    *pNowBytes++=dstcolor;
    dstcolor=(*pOrigBytes++);
    dstcolor=(uint8)(dstcolor+(alpha*(b-dstcolor)));
    *pNowBytes++=dstcolor;
    pNowBytes++;
    pOrigBytes++;
  }
  srcdib->pRGB=pPalette;
  IBITMAP_BltIn(pDst,xdst,ydst,width,height,pSrc,xsrc,ysrc,AEE_RO_COPY);
  srcdib->pRGB=pBackup;
  FREE(pPalette);
}

/*****************************************************
  Function:SpecialAlpha256Bmp
  Desc:256色位图alpha混合,修改调色板,只适用256色位图,加快速度用。
 Input:pDst-目标位图,xdst,ydst-位置,width,height-半透明处理位图大小,
        pSrc-256色位图,xscr,yscr-源位置,R,G,B半透明颜色值,alpha
  Output:
  Return:
******************************************************/
void SpecialAlpha256Bmp(IBitmap *pDst,int xdst,int ydst,int width,int height,IBitmap *pSrc,
                 int xsrc,int ysrc,uint8 r, uint8 g, uint8 b)
{
  uint8 dstcolor;
  uint32 *pPalette;
  uint32 *pBackup;
  byte   *pOrigBytes;
  byte   *pNowBytes;
  int    i;

  IDIB *srcdib = (IDIB*)pSrc;
  if(srcdib->nColorScheme>0)
    return;
  if(srcdib->cntRGB==0)
    return;
  pPalette=(uint32*)MALLOC(sizeof(uint32)*255);
  pNowBytes=(byte*)pPalette;
  pOrigBytes=(byte *)srcdib->pRGB;
  pBackup=srcdib->pRGB;
  for(i=0;i<srcdib->cntRGB;i++)
  {
    dstcolor=(*pOrigBytes++);
    dstcolor=(uint8)(dstcolor+((r-dstcolor)>>1));
    *pNowBytes++=dstcolor;
    dstcolor=(*pOrigBytes++);
    dstcolor=(uint8)(g>>1);
    *pNowBytes++=dstcolor;
    dstcolor=(*pOrigBytes++);
    dstcolor=(uint8)(b>>1);
    *pNowBytes++=dstcolor;
    pNowBytes++;
    pOrigBytes++;
  }
  srcdib->pRGB=pPalette;
  IBITMAP_BltIn(pDst,xdst,ydst,width,height,pSrc,xsrc,ysrc,AEE_RO_COPY);
  srcdib->pRGB=pBackup;
  FREE(pPalette);
}

/*****************************************************
  Function:SpecialAlpha
  Desc:实现和某种颜色的半透明
 Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,width,height-半透明处理位图大小,必须确保ydst+height<pDst->Height,xdst+width<pDst->Width,R,G,B半透明颜色值
 Output:pDst-经过处理的位图
 Return:
*****************************************************/
void SpecialAlpha(IBitmap *pDst,int xdst,int ydst,int width,int height,
                 uint8 r, uint8 g, uint8 b)
{
  int x,y;
  int offset1;
  int offdst;
  uint16 dstcolor;
  uint8 dstr,dstg,dstb;

  IDIB *dstdib = (IDIB*)pDst;
  
  uint16 *pDstBmp = (uint16*)dstdib->pBmp; // 获得实际的图片点阵数据。

  if(dstdib->nDepth!=16)
    return;
  // 一般手机屏幕都是16位,565格式
  r=r & 0x1f;
  g=(g & 0x3f);
  b=b & 0x1f;
	if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
	{
    offset1=((ydst*dstdib->nPitch)>>1)+xdst;
    for(y=0;y<height;y++)
    {
      if(y==height-1)
        offdst=0;
      offdst=offset1;
      for(x=0;x<width;x++)
      {
        dstcolor=pDstBmp[offdst];
        dstr=dstcolor>>11;
        dstr=(uint8)(dstr+((r-dstr)>>1));
        dstg=(dstcolor>>5) & 0x3f;
        dstg=(uint8)(g>>1);
        dstb=dstcolor & 0x1f;
        dstb=(uint8)(b>>1);
        pDstBmp[offdst]=dstr<<11 | dstg<<5 | dstb;
        offdst++;
      }
      offset1+=(dstdib->nPitch>>1);
    }
  }
}

/*****************************************************
  Function:FastAlpha
  Desc:实现和某种颜色的半透明
 Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,width,height-半透明处理位图大小,必须确保ydst+height<pDst->Height,xdst+width<pDst->Width,R,G,B半透明颜色值
  Output:pDst-经过处理的位图
  Return:
*****************************************************/
void FastAlpha(IBitmap *pDst,int xdst,int ydst,int width,int height,
                 uint8 r, uint8 g, uint8 b)
{
  int x,y;
  int offset1;
  int offdst;
  uint16 dstcolor;
  uint8 dstr,dstg,dstb;

  IDIB *dstdib = (IDIB*)pDst;
  // 获得实际的图片点阵数据。
  uint16 *pDstBmp = (uint16*)dstdib->pBmp; 
  if(dstdib->nDepth!=16)
    return;
 // 一般手机屏幕都是16位,565格式
  r=r & 0x1f;
  g=(g & 0x3f);
  b=b & 0x1f;
	if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
	{
    offset1=((ydst*dstdib->nPitch)>>1)+xdst;
    for(y=0;y<height;y++)
    {
      if(y==height-1)
        offdst=0;
      offdst=offset1;
      for(x=0;x<width;x++)
      {
        dstcolor=pDstBmp[offdst];
        dstr=dstcolor>>11;
        dstr=(uint8)(dstr+((r-dstr)>>1));
        dstg=(dstcolor>>5) & 0x3f;
        dstg=(uint8)(dstg+((g-dstg)>>1));
        dstb=dstcolor & 0x1f;
        dstb=(uint8)(dstb+((b-dstb)>>1));
        pDstBmp[offdst]=dstr<<11 | dstg<<5 | dstb;
        offdst++;
      }
      offset1+=(dstdib->nPitch>>1);
    }
  }
}

/*****************************************************
  Function:AlphaBlend
  Desc:实现和某种颜色的半透明
 Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,width,height-半透明处理位图大小,必须确保ydst+height<pDst->Height,xdst+width<pDst->Width,R,G,B半透明颜色值,alpha-半透明因子
  Output:pDst-经过处理的位图
  Return:
*****************************************************/
void AlphaBlend(IBitmap *pDst,int xdst,int ydst,int width,int height,
                 uint8 r, uint8 g, uint8 b,float alpha)
{
  int x,y;
  int offset1;
  int offdst;
  uint16 dstcolor;
  uint8 dstr,dstg,dstb;

  IDIB *dstdib = (IDIB*)pDst;
  
  uint16 *pDstBmp = (uint16*)dstdib->pBmp; 
  if(dstdib->nDepth!=16)
    return;
	
  r=r & 0x1f;
  g=(g & 0x3f);
  b=b & 0x1f;
	if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
	{
    offset1=((ydst*dstdib->nPitch)>>1)+xdst;
    for(y=0;y<height;y++)
    {
      if(y==height-1)
        offdst=0;
      offdst=offset1;
      for(x=0;x<width;x++)
      {
        dstcolor=pDstBmp[offdst];
        dstr=dstcolor>>11;
        dstr=(uint8)(dstr+(alpha*(r-dstr)));
        dstg=(dstcolor>>5) & 0x3f;
        dstg=(uint8)(dstg+(alpha*(g-dstg)));
        dstb=dstcolor & 0x1f;
        dstb=(uint8)(dstb+(alpha*(b-dstb)));
        pDstBmp[offdst]=dstr<<11 | dstg<<5 | dstb;
        offdst++;
      }
      offset1+=(dstdib->nPitch>>1);
    }
  }
}

 

分享到:
评论

相关推荐

    BREW 常用接口介绍

    综上所述,本文档介绍了BREW平台下常用的几个接口,包括获取设备信息、自动升级功能、续购功能以及报警管理功能等。这些接口对于开发BREW应用程序来说至关重要,能够帮助开发者更好地理解和利用这些接口来提升应用...

    brew手机常用软件集合

    不过,一般来说,一个"brew软件集合"可能包括以下几种常见的软件类型: 1. **通讯应用**:例如即时通讯软件,允许用户发送文字、语音消息,甚至进行视频通话。 2. **媒体播放器**:支持播放音频和视频文件的各种...

    brew 3.0中文API文档

    在本文中,我们将深入探讨`brew 3.0`的中文API文档,帮助开发者更好地理解和利用这个强大的工具。 `Brew 3.0`是Homebrew的最新版本,它带来了一些重要的改进和新特性。首先,我们来看API接口,API(Application ...

    深入brew开发 brew及buiw进阶手册

    《深入brew开发 brew及buiw进阶手册》是一本专为已对brew有一定基础的开发者设计的深度学习资源,旨在帮助读者全面理解和掌握这个强大的包管理工具及其相关生态系统。brew是Mac OS X系统中广泛使用的开源包管理器,...

    BREW 教程(深入BREW开发)

    【BREW教程(深入BREW开发)】 BREW,全称Binary Runtime Environment for Wireless,是一种专为移动设备设计的操作系统和应用程序开发平台。这份教程深入解析了BREW的实现原理和相关机制,旨在帮助开发者更深入地...

    25个brew应用源码

    标题中的“25个brew应用源码”指的是25个基于BREW(Binary Runtime Environment for Wireless)平台的应用程序源代码。BREW是由高通公司开发的一种面向无线设备的操作系统和应用开发环境,主要用于早期的智能手机和...

    BREW高级技术培训资料

    在学习BREW的过程中,你需要了解以下几个核心概念: 1. **BREW API**:这是BREW应用程序的基础,提供了与硬件交互的接口,如用户界面、网络通信、内存管理等。理解和掌握这些API是开发BREW应用的关键。 2. **设备...

    brew_从零开始创建brew.pdf

    在编写BREW应用程序的过程中,需要注意以下几点: 1. **代码规范**:遵循统一的编码风格和命名规则,提高代码的可读性和可维护性。 2. **性能优化**:考虑到移动设备的硬件限制,合理设计算法和数据结构以降低内存...

    BREW API 中文版

    8. **调试工具**:BREW SDK 包含了一套完整的调试工具,如模拟器和调试器,帮助开发者在开发过程中定位和解决问题。 总的来说,BREW API 中文版为中文开发者提供了一套完整的无线应用开发框架,降低了学习曲线,...

    brew3.0API+深入brew开发

    《brew3.0 API + 深入brew开发》这套资料是针对计算机软件开发者和系统管理员的宝贵资源,尤其对于那些在Unix-like操作系统(如macOS)上进行软件管理和自动化安装的用户。Brew,全称Homebrew,是这类系统中最流行的...

    Brew绿色安装3.01(BrewSDK)

    Brew(全称为Berkeley Packet Filter)是一种轻量级的软件开发工具包(SDK),主要用于在嵌入式设备上创建和管理应用程序。BrewSDK(Brew Software Development Kit)是这个平台的核心组成部分,它提供了开发、编译...

    BREW 游戏源代码

    BREW是由美国高通公司(Qualcomm)推出的一种为移动设备设计的操作系统和应用程序运行环境,主要用于早期的2G和3G手机。这个平台提供了丰富的APIs,使得开发者能够创建各种各样的应用,包括游戏。 在描述中提到,这...

    brew 的简单代码

    在这个名为“brew的简单代码”的项目中,我们似乎有一个包含多个工程的压缩包,这可能是一个学习或实践`brew`使用的小型项目集合。 1. **什么是Homebrew(Brew)**: Homebrew是用于Mac OS X的开源包管理器,由Max...

    brew widget开发源代码

    在iOS和macOS开发中,Brew Widget是一种用于构建用户界面的小型自定义视图组件。这个源代码包“Brew Widget开发源代码”显然包含了用于创建和开发这些小部件的相关资源,为开发者提供了一个实践和学习Brew Widget...

    新整理的BREW资料

    BREW(Binary Runtime Environment for Wireless)是由美国高通公司开发的一种操作系统平台,主要用于无线设备,尤其是早期的智能手机和平板电脑。它提供了一个完整的开发环境,允许开发者创建和运行针对移动设备的...

Global site tag (gtag.js) - Google Analytics