/**
* <p>Title: 常用的一些图片处理函数,包括MIDP1.0,NOKIA,MIDP2.0三个平台,希望大家开发时都采用这些函数来处理。
* 请大家不要从一张大图片里截取小图片并创建一张新的小图片,那将造成在其他平台上不透明</p>
* <p>Description: 下面这些函数主要处理从一张大图片里面截取一张小图片,并对图片进行镜象翻转以及旋转。
* 由于MIDP1.0不支持镜象和旋转,我们采用了自己的方法来处理,只实现了镜象翻转,对于
* 旋转部分,由于自己处理的方法比较低效,必须由美工将旋转后的图片做出来,直接画。
* 对于NOKIA和MIDP2.0,由于支持这些操作,但其实现方法不相同,因此下面对这些操作进行封装,保证接口统一性,
* 方便游戏的移植。
* 由于NOKIA和MIDP在这些操作上对应的常量不统一,为了方便,我们自己定义了一组常量,在函数里,我们做了相应的映射
* 请大家使用时注意。这些常量的对应如下:
* 操作 我们的定义 NOKIA MIDP2.0
* 直接裁减 0 0 0
* 绕Y轴镜象翻转 0x2000 FLIP_HORIZONTAL(0x2000) TRANS_MIRROR(7)
* 绕X轴镜象翻转 0x4000 FLIP_VERTICAL(0x4000) TRANS_MIRROR_ROT180(1)
* 顺时针旋转90度 90 ROTATE_270(270) TRANS_ROT90(5)
* 顺时针旋转180度 180 ROTATE_180(180) TRANS_ROT180(3)
* 顺时针旋转270度 270 ROTATE_90(90) TRANS_ROT270(6)
*
* 大家在使用这些函数时,对应的操作常量均使用我们自己定义的常量。
*</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: Bbmf</p>
* @author Beckham
* @version 1.1
*/
/**
* 对单张图片画,支持翻转,用于MIDP1.0中
* @param original Image 原始图片
* @param g Graphics
* @param x int
* @param y int
* @param mode int 模式0:直接画 0x2000:绕Y轴镜象翻转 0x4000:绕X轴镜象翻转
*/
public void drawClipImageForMIDP1(Graphics g, int x ,int y,Image original ,int mode)
{
int oldWidth = g.getClipWidth();
int oldHeight = g.getClipHeight();
int w = original.getWidth(), h = original.getHeight();
if(mode == 0)
{
g.drawImage(original,x,y,0);
}
if(mode == 0x2000)//绕Y轴旋转
{
for (int i = 0; i < w; i++) {
g.setClip(x + i, y, 1, h);
g.drawImage(original, x - w + i * 2 + 1, y, 0);
}
}
else if(mode == 0x4000)//绕X轴旋转
{
for (int i = 0; i < h; i++) {
g.setClip(x , y+ i, w, 1);
g.drawImage(original, x , y - h + i*2 + 1, 0);
}
}
g.setClip(0, 0, oldWidth, oldHeight);
}
/**
* drawClip 画一个图片的一部分,不支持翻转,用于MIDP1.0中
*
* @param g Graphics
* @param x int 要画的位置x
* @param y int 要画的位置y
* @param image Image 图片
* @param clipX int clip在图片中的坐标x
* @param clipY int clip在图片中的坐标y
* @param clipWidth int clip在图片中的宽度
* @param clipHeight int clip在图片中的高度
*/
void drawClipImageForMIDP1(Graphics g, int x, int y, Image image, int clipX, int clipY, int clipWidth, int clipHeight) {
int oldWidth = g.getClipWidth();
int oldHeight = g.getClipHeight();
g.setClip(x, y, clipWidth, clipHeight);
g.drawImage(image, x - clipX, y - clipY, 0);
g.setClip(0, 0, oldWidth, oldHeight);
}
/**
* drawClip 画一个图片的一部分,并支持翻转,用于MIDP1.0中
*
* @param g Graphics
* @param x int 要画的位置x
* @param y int 要画的位置y
* @param image Image 图片
* @param clipX int clip在图片中的坐标x
* @param clipY int clip在图片中的坐标y
* @param clipWidth int clip在图片中的宽度
* @param clipHeight int clip在图片中的高度
* @param mode int 0:不做任何转换 0x2000:绕Y轴镜象翻转 0x4000:绕X轴镜象翻转
*/
void drawClipImageForMIDP1(Graphics g, int x, int y, Image image, int
clipX, int clipY, int clipWidth, int clipHeight,int mode) {
int oldWidth = g.getClipWidth();
int oldHeight = g.getClipHeight();
if(mode == 0){//不作旋转
g.setClip(x, y, clipWidth, clipHeight);
g.drawImage(image, x - clipX, y - clipY, 0);
}
else if(mode == 0x2000){//绕Y轴镜象翻转
for(int i = 0 ; i < clipWidth; i++)
{
g.setClip(x + i, y, 1, clipHeight);
g.drawImage(image, x + i - clipX - clipWidth + i + 1, y - clipY, 0);
}
}
else if(mode == 0x4000){//绕X轴镜象翻转
for(int i = 0 ; i < clipHeight; i++)
{
g.setClip(x , y+ i, clipWidth, 1);
g.drawImage(image, x -clipX, y + i*2 - clipY - clipHeight + 1, 0);
}
}
g.setClip(0, 0, oldWidth, oldHeight);
}
/**
* drawClip 画一个图片的一部分,并支持翻转,旋转,主要用于NOKIA手机中。
*
* @param g Graphics
* @param x int 要画的位置x
* @param y int 要画的位置y
* @param image Image 图片
* @param clipX int clip在图片中的坐标x
* @param clipY int clip在图片中的坐标y
* @param clipWidth int clip在图片中的宽度
* @param clipHeight int clip在图片中的高度
* @param mode int 0:直接画 0x2000:绕Y轴镜象翻转 0x4000:绕X轴镜象翻转 90:顺时针方向90度 180:顺时针方向180度 270:顺时针方向270度
*/
void
drawClipImageForNokia(Graphics g, int x, int y, Image image, int clipX,
int clipY, int clipWidth, int clipHeight, int mode) {
//只能用left和top画。只方型有效。长方形待修改
int oldWidth = g.getClipWidth();
int oldHeight = g.getClipHeight();
if(mode==0)
{
g.setClip(x, y, clipWidth, clipHeight);
g.drawImage(image, x - clipX, y - clipY, 0);
}
else{
DirectGraphics dg=DirectUtils.getDirectGraphics(g);
switch(mode){
case 0x2000://绕Y轴翻转
g.setClip(x, y, clipWidth, clipHeight);
x = x - (image.getWidth() - clipX - clipWidth);
y = y - clipY;
break;
case 0x4000:// 绕X轴翻转
g.setClip(x, y, clipWidth, clipHeight);
x = x - clipX;
y = y - (image.getHeight() - clipY - clipHeight);
break;
case 90://顺时针方向90度
mode = DirectGraphics.ROTATE_270 ;
g.setClip(x, y, clipHeight, clipWidth);
x = x-(image.getHeight() - clipY - clipHeight);
y = y-clipX;
break;
case 180://顺时针方向180度
g.setClip(x, y, clipWidth, clipHeight);
x = x-(image.getWidth()-clipX-clipWidth);
y = y-(image.getHeight()-clipY-clipHeight);
break;
case 270://顺时针方向270度
mode = DirectGraphics.ROTATE_90 ;
g.setClip(x, y, clipHeight, clipWidth);
x = x-clipY;
y = y-(image.getWidth() - clipX - clipWidth);
break;
}
dg.drawImage(image, x, y, 0,mode);
}
g.setClip(0, 0, oldWidth , oldHeight);
}
/**
* drawClipImageForMIDP2 画一个图片的一部分,支持翻转、旋转。
* 本函数主要用于MIDP2.0中
* @param g Graphics
* @param x int 要画的位置x
* @param y int 要画的位置y
* @param image Image 图片
* @param clipX int clip在图片中的坐标x
* @param clipY int clip在图片中的坐标y
* @param clipWidth int clip在图片中的宽度
* @param clipHeight int clip在图片中的高度
* @param mode int 0:直接画 0x2000:绕Y轴翻转 0x4000:绕X轴翻转 90:顺时针方向90度 180:顺时针方向180度 270:顺时针方向270度
* 由于NOKIA和MIDP2.0对应的操作常量值不一样,为了保持一致以及移植方便,全部采用自定义的常量值,本函数对
* 自定义的常量值进行了到MIDP2.0的映射,希望大家使用时注意。
*
*/
public void drawClipImageForMIDP2(Graphics g, int x, int y, Image image,
int clipX, int clipY,int clipWidth, int clipHeight,int mode) {
int oldWidth = g.getClipWidth();
int oldHeight = g.getClipHeight();
Sprite sp;
int nm = 0;
switch(mode)
{
case 0://直接裁减
g.setClip(x, y, clipWidth,clipHeight );
nm = Sprite.TRANS_NONE;
x = x - clipX;
y = y - clipY;
break;
case 0x2000://绕Y轴镜象翻转
g.setClip(x, y, clipWidth,clipHeight );
nm = Sprite.TRANS_MIRROR;
x = x - (image.getWidth() - clipX - clipWidth);
y = y - clipY;
break;
case 0x4000://绕X轴镜象翻转
g.setClip(x, y, clipWidth,clipHeight );
nm = Sprite.TRANS_MIRROR_ROT180;
x = x - clipX;
y = y - image.getHeight() + clipY + clipHeight;
break;
case 90://顺时针旋转90
g.setClip(x, y,clipHeight, clipWidth );
nm = Sprite.TRANS_ROT90;
x = x-(image.getHeight() - clipY - clipHeight);
y = y-clipX;
break;
case 180://顺时针旋转180
g.setClip(x, y, clipWidth,clipHeight);
nm = Sprite.TRANS_ROT180;
x = x-(image.getWidth()-clipX-clipWidth);
y = y-(image.getHeight()-clipY-clipHeight);
break;
case 270://顺时针旋转270
g.setClip(x, y,clipHeight, clipWidth );
nm = nm | Sprite.TRANS_ROT270;
x = x-clipY;
y = y-(image.getWidth() - clipX - clipWidth);
break;
}
sp.setTransform(nm);
sp.setPosition(x,y);
sp.paint(g);
g.setClip(0, 0, oldWidth,oldHeight);
}