注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

AGLlib库之neutral(中)  

2011-07-04 10:58:39|  分类: AGLlib |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
J2SE的版本中,com.robin.lib.neutral包包括Graphics.java,Image.java,MotionEvent.java,Sprite.java和Util.jav共五个文件,注意Sprite.java和Util.java虽然已经包含在了J2SE版本中,但是Sprite现在只实现了很少的功能,而且在Android的版本中还没任何实现。
Graphics.java文件
package com.robin.lib.neutral;
import com.robin.lib.face.Transform;
public class Graphics {
 private final int data[];
 private final int width;
 final int height;
 int clipX0=0;
 int clipY0=0;
 int clipX1=0;
 int clipY1=0;
 int color=0;
 public final static int LEFT=0;
 public final static int RIGHT=1<<1;
 public final static int HCENTER=1<<2;
 public final static int TOP=1<<3;
 public final static int BOTTOM=1<<4;
 public final static int VCENTER=1<<5;
 Graphics(int data[],int width,int height)
 {
  this.data=data;
  this.width=width;
  this.height=height;
   clipX0=0;
   clipY0=0;
   clipX1=width;
   clipY1=height;
 }
 public void setClip(int x,int y,int w,int h)
 {
  if(w<0)
   return;
  if(h<0)
   return;
  this.clipX0=x;
  this.clipY0=y;
  this.clipX1=x+w;
  this.clipY1=y+h;
 }
 public void setColor(int color)
 {
  this.color=color;
 }
 public int getColor()
 {
  return color;
 }
 final static int kPrecision=8;
 final static int kOne=(1<<kPrecision);
 public void drawLine(int x0,int y0,int x1,int y1)
 {
  int temp=0;
  int rect[]=checkClip(x0, y0, x1, y1);
  x0=rect[0];
  y0=rect[1];
  x1=rect[2];
  y1=rect[3];
  int w=x1-x0;
  int h=y1-y0;
  int offset=0;
  if(w==0&&h==0)
   return;
  if(w==0)
  {
   if(y0>y1)
   {
    temp=y0;
    y0=y1;
    y1=temp;
   }
   offset=x0+y0*width;
   for(int i=0;i<h;i++)
   {
    data[offset]=color;
    offset=offset+width;
   }
  }
  else if(h==0)
  {
   if(x0>x1)
   {
    temp=x0;
    x0=x1;
    x1=temp;
   }
   offset=x0+y0*width;
   for(int i=0;i<w;i++)
   {
    data[offset]=color;
    offset=offset+1;
   }   
  }
  else
  {
   int k=(h<<kPrecision)/w;
   int j=0;
   int x=x0;
   int y=y0;
   int n=0;
   int m=1;
   if(k<0)
    k=-k;
   temp=k+(kOne>>1);
   while(temp/m>(kOne>>1))
   {
    m++;
   }
   int len=m*w;
   if(len<0)
    len=-len;
   int cnt=0;
   k=k/m;
   offset=x0+y0*width;
   int offsetX=1;
   int offsetY=width;
   int stepX=1;
   int stepY=1;
   if(x1<x0)
   {
    stepX=-stepX;
    offsetX=-offsetX;
   }
   if(y1<y0)
   {
    stepY=-stepY;
    offsetY=-offsetY;
   }
   for(int i=0;i<len;i++)
   {
    data[offset]=color;
    cnt++;
    if(cnt==m)
    {
     cnt=0;
     offset=offset+offsetX;
     x=x+stepX;
    }
    j=j+k;
    if(j>(kOne>>1))
    {
     offset=offset+offsetY;
     j=j-kOne;
     y=y+stepY;
     if(x1!=x)
     {
      k=((y1-y)<<kPrecision)/((x1-x)*m);
      if(k<0)
       k=-k;
     }
    }
   }
  }
 }
 public void fillRect(int x,int y,int w,int h)
 {
  int rect[]=this.checkClip(x, y, x+w, y+h);
  x=rect[0];
  y=rect[1];
  w=rect[2]-x;
  h=rect[3]-y;
  int offset=x+y*width;
  for(int j=0;j<h;j++)
  {
   for(int i=0;i<w;i++)
   {
    data[offset++]=color;   
   }
   offset=offset+width-w;
  }
 }
private int tempRect[]=new int[4];
int [] checkClip(int x0,int y0,int x1,int y1)
 {
  if(x0<clipX0)
   x0=clipX0;
  if(x0>=clipX1)
   x0=clipX1;
  if(y0<clipY0)
   y0=clipY0;
  if(y0>=clipY1)
   y0=clipY1;
  if(x1<clipX0)
   x1=clipX0;
  if(x1>=clipX1)
   x1=clipX1;
  if(y1<clipY0)
   y1=clipY0;
  if(y1>=clipY1)
   y1=clipY1;
  tempRect[0]=x0;
  tempRect[1]=y0;
  tempRect[2]=x1;
  tempRect[3]=y1;
  return tempRect;
 }
 int getWidth()
 {
return width;
 }
 int getHeight()
 {
return height;
 }
 public void drawImage(Image img,int x,int y,int anchor)
 {
drawImage(img,x,y,Transform.TRANS_NONE,anchor);
 }
 public void drawImage(Image img,int x,int y,int transform,int anchor)
 {
drawRegion(img,0,0,img.getWidth(),img.getHeight(),x,y,img.getWidth(),img.getHeight(),transform,anchor);
 }
 public void drawRegion(Image img,int x,int y,int w,int h,int desX,int desY,int desW,int desH,int transform,int anchor)
 {
if((anchor&Graphics.LEFT)!=0)
{
 
}
else if ((anchor&Graphics.RIGHT)!=0)
{
desX-=w;
}
else if ((anchor&Graphics.HCENTER)!=0)
{
desX-=(w>>1);
}
if((anchor&Graphics.TOP)!=0)
{
 
}
else if ((anchor&Graphics.BOTTOM)!=0)
{
desY-=h;
}
else if ((anchor&Graphics.VCENTER)!=0)
{
desY-=(h>>1);
}
 img.draw(this, x, y, w, h, desX, desY, desW, desH,transform);
 }
 int [] getData()
 {
return data;
 }
}
Image.java文件
package com.robin.lib.neutral;
import java.lang.UnsupportedOperationException;
import com.robin.lib.face.Transform;
public class Image {
 int data[];
 byte colorsIndex[];
 int palettes[];
 int width;
 int height;
 Graphics g;
 final static int TYPE_INDEX_COLOR=0;
 final static int TYPE_FORMAT8888=1;
 int type;
 public static Image createImage(int rgbData[],int width,int height)
 {
  return new Image(rgbData,width,height);
 }
 public static Image createImage(int width,int height)
 {
  return new Image(width,height);
 }
 Image(int width,int height)
 {
  this(new int[width*height],width,height);
 }
 Image (int rgbData[],int width,int height)
 {
type=TYPE_FORMAT8888;
this.data=rgbData;
this.width=width;
this.height=height;
 }
 Image (byte colorsIndex[],int width,int height,int palettes[])
 {
type=TYPE_INDEX_COLOR;
this.colorsIndex=colorsIndex;
this.width=width;
this.height=height;
this.palettes=palettes;
 }
 public Graphics getGraphics()
 {
if(type==TYPE_INDEX_COLOR)
throw new UnsupportedOperationException("this is a index color image,It does not support the method getGraphics()");
 if(g==null)
 {
  g=new Graphics(this.data,width,height);
 }
  return g;
 }
 public int[] getRGBData()
 {
  return data;
 }
 void setPalette(int palettes[])
 {
if(type!=TYPE_INDEX_COLOR)
throw new UnsupportedOperationException("this is not a index color image,It does not support the method setPalette(int palettes[])");
this.palettes=palettes;
 }
 int getWidth()
 {
return width;
 }
 int getHeight()
 {
return height;
 }
 final static int ONE=1000;
 void draw(Graphics target,int srcX,int srcY,int srcW,int srcH,int desX,int desY,int desW,int desH,int transform)
 {
if(type==TYPE_INDEX_COLOR)
{
drawIndexColor(target, srcX, srcY, srcW, srcH, desX, desY, desW, desH, transform);
}
else if (type==TYPE_FORMAT8888)
{
drawFormat8888(target, srcX, srcY, srcW, srcH, desX, desY, desW, desH, transform);
}
else
{
throw new UnsupportedOperationException("the format of image is wrong"); 
}
 }
 private void drawIndexColor(Graphics target,int srcX,int srcY,int srcW,int srcH,int desX,int desY,int desW,int desH,int transform)
 {
int desData[]=target.getData();
byte srcData[]=colorsIndex;
int i=0;
int j=0;
int k=0;
int m=0;
boolean noScale=(srcW==desW&&srcH==desH);
 int rect[]=target.checkClip(desX, desY, desX+desW, desY+desH);
 int diffX=rect[0]-desX;
 int diffY=rect[1]-desY;
 desX=rect[0];
 desY=rect[1];
 desW=rect[2]-rect[0];
 desH=rect[3]-rect[1];
k=desX*desY;
int diffDesX=(target.getWidth()-desW);
if(noScale)
{
 srcX=srcX+diffX;
 srcY=srcY+diffY;
if(transform==Transform.TRANS_NONE)
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i+(srcY+j)*getWidth();
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}
}
else if (transform==Transform.TRANS_MIRROR_180)//flip_X
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(width-1-i)+(srcY+j)*width;
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}  
}else if(transform==Transform.TRANS_MIRROR)//flip_Y
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i+(-srcY+(height-1-j))*width;
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}  
}
else if(transform==Transform.TRANS_180)//flip_XY
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(width-1-i)+(-srcY+(height-1-j))*width;
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}  
}
else
{
throw new UnsupportedOperationException("the value of  transform " +transform+"is not supported by now");
}
}
else
{
if(transform==Transform.TRANS_NONE)
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i*srcW/desW+(srcY+j*srcH/desH)*getWidth();
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}  
}
else if (transform==Transform.TRANS_MIRROR_180)//flip_X
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(srcW-1-i*srcW/desW)+(srcY+j*srcH/desH)*width;
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}  
}else if(transform==Transform.TRANS_MIRROR)//flip_Y
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i*srcW/desW+(-srcY+srcH-1-j*srcH/desH)*width;
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}  
}
else if (transform==Transform.TRANS_180)//flip_XY
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(srcW-1-i*srcW/desW)+(-srcY+srcH-1-j*srcH/desH)*width;
desData[k++]=palettes[srcData[m]];
}
k=k+diffDesX;
}  
}

else
{
throw new UnsupportedOperationException("the value of  transform " +transform+"is not supported by now");
}
}  
 }
 private void drawFormat8888(Graphics target,int srcX,int srcY,int srcW,int srcH,int desX,int desY,int desW,int desH,int transform)
 {
int desData[]=target.getData();
int srcData[]=data;
int i=0;
int j=0;
int k=0;
int m=0;
boolean noScale=(srcW==desW&&srcH==desH);
 int rect[]=target.checkClip(desX, desY, desX+desW, desY+desH);
 int diffX=rect[0]-desX;
 int diffY=rect[1]-desY;
 desX=rect[0];
 desY=rect[1];
 desW=rect[2]-rect[0];
 desH=rect[3]-rect[1];
 k=desX+desY*target.getWidth()-1;
int diffDesX=(target.getWidth()-desW);
if(noScale)
{
 srcX=srcX+diffX;
 srcY=srcY+diffY;
if(transform==Transform.TRANS_NONE)
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i+(srcY+j)*width;
desData[k++]=srcData[m];
}
k=k+diffDesX;
}
}
else if(transform==Transform.TRANS_MIRROR_180)//flip_X
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(width-1-i)+(srcY+j)*width;
desData[k++]=srcData[m];
}
k=k+diffDesX;
}  
}
else if(transform==Transform.TRANS_MIRROR)//flip_Y
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i+(-srcY+(height-1-j))*width;
desData[k++]=srcData[m];
}
k=k+diffDesX;
}  
}
else if(transform==Transform.TRANS_180)//flip_XY
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(width-1-i)+(-srcY+(height-1-j))*width;
desData[k++]=srcData[m];
}
k=k+diffDesX;
}  
}

else
{
throw new UnsupportedOperationException("the value of  transform " +transform+"is not supported by now");
}
}
else
{
if(transform==Transform.TRANS_NONE)
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i*srcW/desW+(srcY+j*srcH/desH)*getWidth();
desData[k++]=srcData[m];
}
k=k+diffDesX;
}  
}
else if(transform==Transform.TRANS_MIRROR_180)//flip_X
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(srcW-1-i*srcW/desW)+(srcY+j*srcH/desH)*width;
desData[k++]=srcData[m];
}
k=k+diffDesX;
}  
}
else if(transform==Transform.TRANS_MIRROR)//flip_Y
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=srcX+i*srcW/desW+(-srcY+srcH-1-j*srcH/desH)*width;
desData[k++]=srcData[m];
}
k=k+diffDesX;
}  
}
else if(transform==Transform.TRANS_180)//flip_XY
{
for(j=0;j<desH;j++)
{
for(i=0;i<desW;i++)
{
m=-srcX+(srcW-1-i*srcW/desW)+(-srcY+srcH-1-j*srcH/desH)*width;
desData[k++]=srcData[m];
}
k=k+diffDesX;
}  
}

else
{
throw new UnsupportedOperationException("the value of  transform " +transform+"is not supported by now");
}
}  
 }
}
MotionEvent.java文件
package com.robin.lib.neutral;
import java.awt.event.MouseEvent;
public class MotionEvent {
 final MouseEvent motionEvent;
 final int action;
 public final static int ACTION_DOWN=0;
 public final static int ACTION_UP=1;
 public final static int ACTION_DRAGGED=2;
 public MotionEvent(int action,MouseEvent motionEvent)
 {
  this.action=action;
  this.motionEvent=motionEvent;
 }
 public float getX()
 {
  return motionEvent.getX();
 }
 public float getY()
 {
  return motionEvent.getY();
 }
 public int getAction()
 {
  return action;
 }
}
  评论这张
 
阅读(533)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017