图片处理部分函数

  /**
   * <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 = new Sprite(image);
    sp.setTransform(nm);
    sp.setPosition(x,y);
    sp.paint(g);
    g.setClip(0, 0, oldWidth,oldHeight);
 }