You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by de...@apache.org on 2001/10/10 19:18:27 UTC

cvs commit: xml-batik/sources/org/apache/batik/ext/awt/image/rendered SpecularLightingRed.java

deweese     01/10/10 10:18:27

  Modified:    sources/org/apache/batik/ext/awt/image/rendered
                        SpecularLightingRed.java
  Log:
  1) Improved implementation of SpecularLighting
  
  Revision  Changes    Path
  1.10      +34 -68    xml-batik/sources/org/apache/batik/ext/awt/image/rendered/SpecularLightingRed.java
  
  Index: SpecularLightingRed.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/rendered/SpecularLightingRed.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- SpecularLightingRed.java	2001/10/10 14:45:18	1.9
  +++ SpecularLightingRed.java	2001/10/10 17:18:27	1.10
  @@ -25,7 +25,7 @@
   /**
    * 
    * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: SpecularLightingRed.java,v 1.9 2001/10/10 14:45:18 deweese Exp $
  + * @version $Id: SpecularLightingRed.java,v 1.10 2001/10/10 17:18:27 deweese Exp $
    */
   public class SpecularLightingRed extends AbstractTiledRed{
       /**
  @@ -83,9 +83,9 @@
   
           ColorModel cm;
           if (linear)
  -            cm = GraphicsUtil.Linear_sRGB_Pre;
  +            cm = GraphicsUtil.Linear_sRGB_Unpre;
           else
  -            cm = GraphicsUtil.sRGB_Pre;
  +            cm = GraphicsUtil.sRGB_Unpre;
   
           int tw = litRegion.width;
           int th = litRegion.height;
  @@ -135,8 +135,24 @@
           // x and y are in user space
           double x = scaleX*minX;
           double y = scaleY*minY;
  -        double ksPwNHns = 0, norm = 0;
  +        double norm = 0;
   
  +        int pixel = 0, tmp;
  +        double mult;
  +        mult = (lightColor[0]>lightColor[1])?lightColor[0]:lightColor[1];
  +        mult = (mult>lightColor[2])?mult:lightColor[2];
  +        
  +        double scale = 255/mult;
  +        pixel = (int)(lightColor[0]*scale+0.5);
  +        tmp   = (int)(lightColor[1]*scale+0.5);
  +        pixel = pixel<<8 | tmp;
  +        tmp   = (int)(lightColor[2]*scale+0.5);
  +        pixel = pixel<<8 | tmp;
  +
  +        mult*=255*ks;
  +
  +        // System.out.println("Pixel: 0x" + Integer.toHexString(pixel));
  +
           final double[][][] NA = bumpMap.getNormalArray(minX, minY, w, h);
   
           // System.out.println("Entering Specular Lighting");
  @@ -155,44 +171,18 @@
   
                       // Compute Half-way vector
                       L[2] += 1;
  -                    norm = Math.sqrt(L[0]*L[0] + L[1]*L[1] + L[2]*L[2]);
  -                    if(norm > 0){
  -                        double iNorm = 1.0/norm;
  -                        L[0] *= iNorm;
  -                        L[1] *= iNorm;
  -                        L[2] *= iNorm;
  +                    norm = L[0]*L[0] + L[1]*L[1] + L[2]*L[2];
  +                    if(norm == 0) 
  +                        a = (int)(mult+0.5);
  +                    else {
  +                        norm = Math.sqrt(norm);
  +                        a = (int)(mult*Math.pow((N[0]*L[0] + 
  +                                                 N[1]*L[1] + N[2]*L[2])/norm, 
  +                                                specularExponent) + 0.5);
  +                        if ((a & 0xFFFFFF00) != 0)
  +                            a = ((a & 0x80000000) != 0)?0:255;
                       }
  -                    
  -                    ksPwNHns = 255.*ks*Math.pow(N[0]*L[0] + 
  -                                                N[1]*L[1] + 
  -                                                N[2]*L[2], specularExponent);
  -                    
  -                    r = (int)(ksPwNHns*lightColor[0]);
  -                    g = (int)(ksPwNHns*lightColor[1]);
  -                    b = (int)(ksPwNHns*lightColor[2]);
  -                    
  -                    
  -                    // If any high bits are set we are not in range.
  -                    // If the highest bit is set then we are negative so
  -                    // clamp to zero else we are > 255 so clamp to 255.
  -                    if ((r & 0xFFFFFF00) != 0)
  -                        r = ((r & 0x80000000) != 0)?0:255;
  -                    if ((g & 0xFFFFFF00) != 0)
  -                        g = ((g & 0x80000000) != 0)?0:255;
  -                    if ((b & 0xFFFFFF00) != 0)
  -                        b = ((b & 0x80000000) != 0)?0:255;
  -                    
  -                    a = r > g ? r : g;
  -                    a = a > b ? a : b;
  -                    
  -                    pixels[p++] = (a << 24
  -                                   |
  -                                   r << 16
  -                                   |
  -                                   g << 8
  -                                   |
  -                                   b);
  -                    
  +                    pixels[p++] = (a << 24 | pixel);
                   }
                   p += adjust;
               }
  @@ -216,35 +206,11 @@
                   for(j=0; j<w; j++){
                       // Get Normal 
                       final double [] N = NR[j];
  -                    
  -                    ksPwNHns = 255.*ks*Math.pow(N[0]*L[0] + N[1]*L[1] + N[2]*L[2],
  -                                                specularExponent);
  -                    
  -                    r = (int)(ksPwNHns*lightColor[0]);
  -                    g = (int)(ksPwNHns*lightColor[1]);
  -                    b = (int)(ksPwNHns*lightColor[2]);
  -                    
  -                    // If any high bits are set we are not in range.
  -                    // If the highest bit is set then we are negative so
  -                    // clamp to zero else we are > 255 so clamp to 255.
  -                    if ((r & 0xFFFFFF00) != 0)
  -                        r = ((r & 0x80000000) != 0)?0:255;
  -                    if ((g & 0xFFFFFF00) != 0)
  -                        g = ((g & 0x80000000) != 0)?0:255;
  -                    if ((b & 0xFFFFFF00) != 0)
  -                        b = ((b & 0x80000000) != 0)?0:255;
  -                    
  -                    a = r > g ? r : g;
  -                    a = a > b ? a : b;
                       
  -                    pixels[p++] = (a << 24
  -                                   |
  -                                   r << 16
  -                                   |
  -                                   g << 8
  -                                   |
  -                                   b);
  +                    a = (int)(mult*Math.pow(N[0]*L[0] + N[1]*L[1] + N[2]*L[2], 
  +                                            specularExponent) + 0.5);
                       
  +                    pixels[p++] = (a << 24 | pixel);
                   }
                   p += adjust;
               }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org