Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   /*
    * Copyright 1999-2101 Alibaba Group.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.alibaba.simpleimage.jai.scale;
  
  
  import  javax.media.jai.RasterAccessor;
  import  javax.media.jai.RasterFormatTag;
  
Lanczos缩路算法实现,参考自ImageMagick http://www.imagemagick.org

Author(s):
wendell 2011-3-29 上午11:13:35
  
  public class LanczosScaleOp {
  
      static final double           WORK_LOAD_FACTOR = 0.265;
  
      protected double              scaleX;
      protected double              scaleY;
      protected LanczosResizeFilter filter;
      protected double              scaleFactor;
      protected Rectangle           filterRect;
      protected Rectangle           destRect;
      protected int                 destWidth;
      protected int                 destHeight;
  
      public LanczosScaleOp(double scaleXdouble scaleY){
          this. = scaleX;
          this. = scaleY;
          this. = new LanczosResizeFilter();
          this. = this. * this.;
      }
  
      public BufferedImage compute(BufferedImage src) {
          this. = (int) (src.getWidth() * );
          this. = (int) (src.getHeight() * );
          if ( <= 0) {
               = 1;
          }
          if ( <= 0) {
               = 1;
          }
           = new Rectangle();
  
          if ( > ) {
               = new Rectangle(src.getHeight());
          } else {
               = new Rectangle(src.getWidth(), );
          }
  
          WritableRaster srcRst = src.getRaster();
  
          ColorModel srcCM = src.getColorModel();
          WritableRaster destRst = Raster.createWritableRaster(destSM.getLocation());
  
          WritableRaster filterRst = Raster.createWritableRaster(filterSM.getLocation());
  
          BufferedImage dest = new BufferedImage(srcCMdestRstsrc.isAlphaPremultiplied(), null);
  
          RasterFormatTag[] formatTags = RasterAccessor.findCompatibleTags(new RenderedImage[] { src }, dest);
          RasterAccessor srcRA = new RasterAccessor(srcRstsrcRst.getBounds(), formatTags[0], src.getColorModel());
          RasterAccessor filterRA = new RasterAccessor(filterRstformatTags[1], src.getColorModel());
          RasterAccessor dstRA = new RasterAccessor(destRstformatTags[1], dest.getColorModel());
  
          switch (dstRA.getDataType()) {
              case .:
                  computeRectByte(srcRAfilterRAdstRA);
                  break;
              case .:
                  computeRectUShort(srcRAfilterRAdstRA);
                  break;
              case .:
                  computeRectShort(srcRAfilterRAdstRA);
                  break;
             case .:
                 computeRectInt(srcRAfilterRAdstRA);
                 break;
             case .:
                 computeRectFloat(srcRAfilterRAdstRA);
                 break;
             case .:
                 computeRectDouble(srcRAfilterRAdstRA);
                 break;
             default:
                 throw new IllegalArgumentException("");
         }
 
         return dest;
     }
 
     private void computeRectByte(RasterAccessor src, RasterAccessor mid, RasterAccessor dst) {
         if ( > ) {
             lanczosHorizontalFilterByte(srcmid);
             lanczosVerticalFilterByte(middst);
         } else {
             lanczosVerticalFilterByte(srcmid);
             lanczosHorizontalFilterByte(middst);
         }
     }
 
     private void computeRectUShort(RasterAccessor src, RasterAccessor mid, RasterAccessor dst) {
         if ( > ) {
              lanczosHorizontalFilterUShort(srcmid);
              lanczosVerticalFilterUShort(middst);
         } else {
              lanczosVerticalFilterUShort(srcmid);
              lanczosHorizontalFilterUShort(middst);
         }
     }
 
     private void computeRectShort(RasterAccessor src, RasterAccessor mid, RasterAccessor dst) {
         if ( > ) {
              lanczosHorizontalFilterShort(srcmid);
              lanczosVerticalFilterShort(middst);
         } else {
              lanczosVerticalFilterShort(srcmid);
              lanczosHorizontalFilterShort(middst);
         }
     }
 
     private void computeRectInt(RasterAccessor src, RasterAccessor mid, RasterAccessor dst) {
         if ( > ) {
              lanczosHorizontalFilterInt(srcmid);
              lanczosVerticalFilterInt(middst);
         } else {
              lanczosVerticalFilterInt(srcmid);
              lanczosHorizontalFilterInt(middst);
         }
     }
 
     private void computeRectFloat(RasterAccessor src, RasterAccessor mid, RasterAccessor dst) {
         if ( > ) {
              lanczosHorizontalFilterFloat(srcmid);
              lanczosVerticalFilterFloat(middst);
         } else {
              lanczosVerticalFilterFloat(srcmid);
              lanczosHorizontalFilterFloat(middst);
         }
     }
 
     private void computeRectDouble(RasterAccessor src, RasterAccessor mid, RasterAccessor dst) {
         if ( > ) {
              lanczosHorizontalFilterDouble(srcmid);
              lanczosVerticalFilterDouble(middst);
         } else {
              lanczosVerticalFilterDouble(srcmid);
              lanczosHorizontalFilterDouble(middst);
         }
     }
 
     private void lanczosHorizontalFilterByte(RasterAccessor src, RasterAccessor dst) {
         double scale = Math.max(1.0 / , 1.0);
         double support = scale * .getSupport() * .getBlur();
 
         if (support < 0.5) {
             support = 0.5;
             scale = 1.0;
         }
 
         byte[][] srcDataArrays = src.getByteDataArrays();
         byte[][] dstDataArrays = dst.getByteDataArrays();
         double pixel[] = { 0, 0, 0, 0 };
         final int channel = src.getNumBands();
         scale = 1.0 / scale;
 
         int contributionsNum = (int) (2.0 * support + 3.0);
         LanczosContributionInfo contribution[] = new LanczosContributionInfo[contributionsNum];
         for (int t = 0; t < contributionsNumt++) {
             contribution[t] = new LanczosContributionInfo();
         }
 
         double centert1t2density;
         int startstopn;
         final int dstWidth = dst.getWidth(), dstHeight = dst.getHeight();
         final int srcWidth = src.getWidth();
         final int dstScanlineStride = dst.getScanlineStride();
         final int srcScanlineStride = src.getScanlineStride();
 
         for (int x = 0; x < dstWidthx++) {
             /*
              * Get the location of the piexls that will be used to compute new pixel
              */
             center = (x + 0.5) / ;
             t1 = center - support + 0.5;
             t2 = center + support + 0.5;
             start = (int) (t1 > 0 ? t1 : 0);
             stop = (int) (t2 < (srcWidth) ? t2 : srcWidth);
             density = 0.0;
 
             for (n = 0; n < (stop - start); n++) {
                 contribution[n]. = start + n;
                 contribution[n]. = getLanczosResizeFilterWeight(scale * ((double) (start + n) - center + 0.5));
                 density += contribution[n].;
             }
             if ((density != 0.0) && (density != 1.0)) {
                 density = 1.0 / density;
                 for (int i = 0; i < ni++) {
                     contribution[i]. *= density;
                 }
             }
 
             int tmp3 = x * channel;
             int tmp5 = ((int) (start - center) + (intcenter) * channel;
 
             /* Start compute new piexl */
             if (channel == 3) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++] & 0xFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp6++] & 0xFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp6++] & 0xFF) * contribution[i].;
                     }
 
                     int tmp4 = tmp3;
                     dstDataArrays[0][tmp4++] = ImageUtils.clampRoundByte(pixel[0]);
                     dstDataArrays[1][tmp4++] = ImageUtils.clampRoundByte(pixel[1]);
                     dstDataArrays[2][tmp4] = ImageUtils.clampRoundByte(pixel[2]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 1) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++] & 0xFF) * contribution[i].;
                     }
 
                     dstDataArrays[0][tmp3] = ImageUtils.clampRoundByte(pixel[0]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 4) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
                     pixel[3] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++] & 0xFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp6++] & 0xFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp6++] & 0xFF) * contribution[i].;
                         pixel[3] += (srcDataArrays[3][tmp6++] & 0xFF) * contribution[i].;
                     }
 
                     int tmp4 = tmp3;
                     dstDataArrays[0][tmp4++] = ImageUtils.clampRoundByte(pixel[0]);
                     dstDataArrays[1][tmp4++] = ImageUtils.clampRoundByte(pixel[1]);
                     dstDataArrays[2][tmp4++] = ImageUtils.clampRoundByte(pixel[2]);
                     dstDataArrays[3][tmp4] = ImageUtils.clampRoundByte(pixel[3]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else {
                 throw new IllegalArgumentException("Unsupported channels num : " + channel);
             }
         }
     }
 
     private void lanczosVerticalFilterByte(RasterAccessor src, RasterAccessor dst) {
         double scale = Math.max(1.0 / , 1.0);
         double support = scale * .getSupport() * .getBlur();
 
         if (support < 0.5) {
             support = 0.5;
             scale = 1.0;
         }
 
         /* Get memory of filter array */
         scale = 1.0 / scale;
         byte[][] srcDataArrays = src.getByteDataArrays();
         byte[][] dstDataArrays = dst.getByteDataArrays();
         double pixel[] = { 0, 0, 0, 0 };
         final int channel = dst.getNumBands();
 
         int contributionNums = (int) (2.0 * support + 3.0);
         LanczosContributionInfo contribution[] = new LanczosContributionInfo[contributionNums];
         for (int t = 0; t < contributionNumst++) {
             contribution[t] = new LanczosContributionInfo();
         }
 
         double centert1t2density;
         int startstopn;
         final int dstHeight = dst.getHeight(), dstWidth = dst.getWidth();
         final int srcHeight = src.getHeight();
         final int srcScanlineStride = src.getScanlineStride();
         final int dstScanlineStride = dst.getScanlineStride();
 
         /* First, we compute rows pixel, then compute columns pixel */
         for (int y = 0; y < dstHeighty++) {
             /*
              * Get the location of the piexls that will be used to compute new pixel
              */
             center = (y + 0.5) / ;
             t1 = center - support + 0.5;
             t2 = center + support + 0.5;
             start = (int) (t1 > 0 ? t1 : 0);
             stop = (int) (t2 < (srcHeight) ? t2 : srcHeight);
             density = 0.0;
             /* Get the value of Sinc */
             for (n = 0; n < (stop - start); n++) {
                 contribution[n]. = start + n;
                 contribution[n]. = getLanczosResizeFilterWeight(scale * ((double) (start + n) - center + 0.5));
                 density += contribution[n].;
             }
             if ((density != 0.0) && (density != 1.0)) {
                 density = 1.0 / density;
                 for (int i = 0; i < ni++) {
                     contribution[i]. *= density;
                 }
             }
 
             int tmp3 = y * dstScanlineStride;
             int tmp5 = ((int) (center)) * srcScanlineStride + ((int) (start - center)) * srcScanlineStride;
 
             /* Start compute new piexl */
             if (channel == 3) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         int tmp7 = tmp6;
                         pixel[0] += (srcDataArrays[0][tmp7++] & 0xFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp7++] & 0xFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp7] & 0xFF) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundByte(pixel[0]);
                     dstDataArrays[1][tmp3++] = ImageUtils.clampRoundByte(pixel[1]);
                     dstDataArrays[2][tmp3++] = ImageUtils.clampRoundByte(pixel[2]);
 
                     tmp5 += channel;
                 }
             } else if (channel == 1) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6] & 0xFF) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundByte(pixel[0]);
 
                     tmp5 += channel;
                 }
             } else if (channel == 4) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
                     pixel[3] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         int tmp7 = tmp6;
                         pixel[0] += (srcDataArrays[0][tmp7++] & 0xFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp7++] & 0xFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp7++] & 0xFF) * contribution[i].;
                         pixel[3] += (srcDataArrays[3][tmp7] & 0xFF) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundByte(pixel[0]);
                     dstDataArrays[1][tmp3++] = ImageUtils.clampRoundByte(pixel[1]);
                     dstDataArrays[2][tmp3++] = ImageUtils.clampRoundByte(pixel[2]);
                     dstDataArrays[3][tmp3++] = ImageUtils.clampRoundByte(pixel[3]);
 
                     tmp5 += channel;
                 }
             } else {
                 throw new IllegalArgumentException("Unsupported channels num : " + channel);
             }
         }
     }
 
     private void lanczosHorizontalFilterUShort(RasterAccessor src, RasterAccessor dst) {
         double scale = Math.max(1.0 / , 1.0);
         double support = scale * .getSupport() * .getBlur();
 
         if (support < 0.5) {
             support = 0.5;
             scale = 1.0;
         }
 
         short[][] srcDataArrays = src.getShortDataArrays();
         short[][] dstDataArrays = dst.getShortDataArrays();
         double pixel[] = { 0, 0, 0, 0 };
         final int channel = src.getNumBands();
         scale = 1.0 / scale;
 
         int contributionsNum = (int) (2.0 * support + 3.0);
         LanczosContributionInfo contribution[] = new LanczosContributionInfo[contributionsNum];
         for (int t = 0; t < contributionsNumt++) {
             contribution[t] = new LanczosContributionInfo();
         }
 
         double centert1t2density;
         int startstopn;
         final int dstWidth = dst.getWidth(), dstHeight = dst.getHeight();
         final int srcWidth = src.getWidth();
         final int dstScanlineStride = dst.getScanlineStride();
         final int srcScanlineStride = src.getScanlineStride();
 
         for (int x = 0; x < dstWidthx++) {
             /*
              * Get the location of the piexls that will be used to compute new pixel
              */
             center = (x + 0.5) / ;
             t1 = center - support + 0.5;
             t2 = center + support + 0.5;
             start = (int) (t1 > 0 ? t1 : 0);
             stop = (int) (t2 < (srcWidth) ? t2 : srcWidth);
             density = 0.0;
 
             for (n = 0; n < (stop - start); n++) {
                 contribution[n]. = start + n;
                 contribution[n]. = getLanczosResizeFilterWeight(scale * ((double) (start + n) - center + 0.5));
                 density += contribution[n].;
             }
             if ((density != 0.0) && (density != 1.0)) {
                 density = 1.0 / density;
                 for (int i = 0; i < ni++) {
                     contribution[i]. *= density;
                 }
             }
 
             int tmp3 = x * channel;
             int tmp5 = ((int) (start - center) + (intcenter) * channel;
 
             /* Start compute new piexl */
             if (channel == 3) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++] & 0xFFFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp6++] & 0xFFFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp6++] & 0xFFFF) * contribution[i].;
                     }
 
                     int tmp4 = tmp3;
                     dstDataArrays[0][tmp4++] = ImageUtils.clampRoundUShort(pixel[0]);
                     dstDataArrays[1][tmp4++] = ImageUtils.clampRoundUShort(pixel[1]);
                     dstDataArrays[2][tmp4] = ImageUtils.clampRoundUShort(pixel[2]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 1) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++] & 0xFFFF) * contribution[i].;
                     }
 
                     dstDataArrays[0][tmp3] = ImageUtils.clampRoundUShort(pixel[0]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 4) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
                     pixel[3] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++] & 0xFFFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp6++] & 0xFFFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp6++] & 0xFFFF) * contribution[i].;
                         pixel[3] += (srcDataArrays[3][tmp6++] & 0xFFFF) * contribution[i].;
                     }
 
                     int tmp4 = tmp3;
                     dstDataArrays[0][tmp4++] = ImageUtils.clampRoundUShort(pixel[0]);
                     dstDataArrays[1][tmp4++] = ImageUtils.clampRoundUShort(pixel[1]);
                     dstDataArrays[2][tmp4++] = ImageUtils.clampRoundUShort(pixel[2]);
                     dstDataArrays[3][tmp4] = ImageUtils.clampRoundUShort(pixel[3]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else {
                 throw new IllegalArgumentException("Unsupported channels num : " + channel);
             }
         }
     }
     
     private void lanczosVerticalFilterUShort(RasterAccessor src, RasterAccessor dst) {
         double scale = Math.max(1.0 / , 1.0);
         double support = scale * .getSupport() * .getBlur();
 
         if (support < 0.5) {
             support = 0.5;
             scale = 1.0;
         }
 
         /* Get memory of filter array */
         scale = 1.0 / scale;
         short[][] srcDataArrays = src.getShortDataArrays();
         short[][] dstDataArrays = dst.getShortDataArrays();
         double pixel[] = { 0, 0, 0, 0 };
         final int channel = dst.getNumBands();
 
         int contributionNums = (int) (2.0 * support + 3.0);
         LanczosContributionInfo contribution[] = new LanczosContributionInfo[contributionNums];
         for (int t = 0; t < contributionNumst++) {
             contribution[t] = new LanczosContributionInfo();
         }
 
         double centert1t2density;
         int startstopn;
         final int dstHeight = dst.getHeight(), dstWidth = dst.getWidth();
         final int srcHeight = src.getHeight();
         final int srcScanlineStride = src.getScanlineStride();
         final int dstScanlineStride = dst.getScanlineStride();
 
         /* First, we compute rows pixel, then compute columns pixel */
         for (int y = 0; y < dstHeighty++) {
             /*
              * Get the location of the piexls that will be used to compute new pixel
              */
             center = (y + 0.5) / ;
             t1 = center - support + 0.5;
             t2 = center + support + 0.5;
             start = (int) (t1 > 0 ? t1 : 0);
             stop = (int) (t2 < (srcHeight) ? t2 : srcHeight);
             density = 0.0;
             /* Get the value of Sinc */
             for (n = 0; n < (stop - start); n++) {
                 contribution[n]. = start + n;
                 contribution[n]. = getLanczosResizeFilterWeight(scale * ((double) (start + n) - center + 0.5));
                 density += contribution[n].;
             }
             if ((density != 0.0) && (density != 1.0)) {
                 density = 1.0 / density;
                 for (int i = 0; i < ni++) {
                     contribution[i]. *= density;
                 }
             }
 
             int tmp3 = y * dstScanlineStride;
             int tmp5 = ((int) (center)) * srcScanlineStride + ((int) (start - center)) * srcScanlineStride;
 
             /* Start compute new piexl */
             if (channel == 3) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         int tmp7 = tmp6;
                         pixel[0] += (srcDataArrays[0][tmp7++] & 0xFFFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp7++] & 0xFFFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp7] & 0xFFFF) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundUShort(pixel[0]);
                     dstDataArrays[1][tmp3++] = ImageUtils.clampRoundUShort(pixel[1]);
                     dstDataArrays[2][tmp3++] = ImageUtils.clampRoundUShort(pixel[2]);
 
                     tmp5 += channel;
                 }
             } else if (channel == 1) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6] & 0xFFFF) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundUShort(pixel[0]);
 
                     tmp5 += channel;
                 }
             } else if (channel == 4) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
                     pixel[3] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         int tmp7 = tmp6;
                         pixel[0] += (srcDataArrays[0][tmp7++] & 0xFFFF) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp7++] & 0xFFFF) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp7++] & 0xFFFF) * contribution[i].;
                         pixel[3] += (srcDataArrays[3][tmp7] & 0xFFFF) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundUShort(pixel[0]);
                     dstDataArrays[1][tmp3++] = ImageUtils.clampRoundUShort(pixel[1]);
                     dstDataArrays[2][tmp3++] = ImageUtils.clampRoundUShort(pixel[2]);
                     dstDataArrays[3][tmp3++] = ImageUtils.clampRoundUShort(pixel[3]);
 
                     tmp5 += channel;
                 }
             } else {
                 throw new IllegalArgumentException("Unsupported channels num : " + channel);
             }
         }
     }
     
     private void lanczosHorizontalFilterShort(RasterAccessor src, RasterAccessor dst) {
         double scale = Math.max(1.0 / , 1.0);
         double support = scale * .getSupport() * .getBlur();
 
         if (support < 0.5) {
             support = 0.5;
             scale = 1.0;
         }
 
         short[][] srcDataArrays = src.getShortDataArrays();
         short[][] dstDataArrays = dst.getShortDataArrays();
         double pixel[] = { 0, 0, 0, 0 };
         final int channel = src.getNumBands();
         scale = 1.0 / scale;
 
         int contributionsNum = (int) (2.0 * support + 3.0);
         LanczosContributionInfo contribution[] = new LanczosContributionInfo[contributionsNum];
         for (int t = 0; t < contributionsNumt++) {
             contribution[t] = new LanczosContributionInfo();
         }
 
         double centert1t2density;
         int startstopn;
         final int dstWidth = dst.getWidth(), dstHeight = dst.getHeight();
         final int srcWidth = src.getWidth();
         final int dstScanlineStride = dst.getScanlineStride();
         final int srcScanlineStride = src.getScanlineStride();
 
         for (int x = 0; x < dstWidthx++) {
             /*
              * Get the location of the piexls that will be used to compute new pixel
              */
             center = (x + 0.5) / ;
             t1 = center - support + 0.5;
             t2 = center + support + 0.5;
             start = (int) (t1 > 0 ? t1 : 0);
             stop = (int) (t2 < (srcWidth) ? t2 : srcWidth);
             density = 0.0;
 
             for (n = 0; n < (stop - start); n++) {
                 contribution[n]. = start + n;
                 contribution[n]. = getLanczosResizeFilterWeight(scale * ((double) (start + n) - center + 0.5));
                 density += contribution[n].;
             }
             if ((density != 0.0) && (density != 1.0)) {
                 density = 1.0 / density;
                 for (int i = 0; i < ni++) {
                     contribution[i]. *= density;
                 }
             }
 
             int tmp3 = x * channel;
             int tmp5 = ((int) (start - center) + (intcenter) * channel;
 
             /* Start compute new piexl */
             if (channel == 3) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++]) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp6++]) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp6++]) * contribution[i].;
                     }
 
                     int tmp4 = tmp3;
                     dstDataArrays[0][tmp4++] = ImageUtils.clampRoundShort(pixel[0]);
                     dstDataArrays[1][tmp4++] = ImageUtils.clampRoundShort(pixel[1]);
                     dstDataArrays[2][tmp4] = ImageUtils.clampRoundShort(pixel[2]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 1) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++]) * contribution[i].;
                     }
 
                     dstDataArrays[0][tmp3] = ImageUtils.clampRoundShort(pixel[0]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 4) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
                     pixel[3] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++]) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp6++]) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp6++]) * contribution[i].;
                         pixel[3] += (srcDataArrays[3][tmp6++]) * contribution[i].;
                     }
 
                     int tmp4 = tmp3;
                     dstDataArrays[0][tmp4++] = ImageUtils.clampRoundShort(pixel[0]);
                     dstDataArrays[1][tmp4++] = ImageUtils.clampRoundShort(pixel[1]);
                     dstDataArrays[2][tmp4++] = ImageUtils.clampRoundShort(pixel[2]);
                     dstDataArrays[3][tmp4] = ImageUtils.clampRoundShort(pixel[3]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else {
                 throw new IllegalArgumentException("Unsupported channels num : " + channel);
             }
         }
     }
     
     private void lanczosVerticalFilterShort(RasterAccessor src, RasterAccessor dst) {
         double scale = Math.max(1.0 / , 1.0);
         double support = scale * .getSupport() * .getBlur();
 
         if (support < 0.5) {
             support = 0.5;
             scale = 1.0;
         }
 
         /* Get memory of filter array */
         scale = 1.0 / scale;
         short[][] srcDataArrays = src.getShortDataArrays();
         short[][] dstDataArrays = dst.getShortDataArrays();
         double pixel[] = { 0, 0, 0, 0 };
         final int channel = dst.getNumBands();
 
         int contributionNums = (int) (2.0 * support + 3.0);
         LanczosContributionInfo contribution[] = new LanczosContributionInfo[contributionNums];
         for (int t = 0; t < contributionNumst++) {
             contribution[t] = new LanczosContributionInfo();
         }
 
         double centert1t2density;
         int startstopn;
         final int dstHeight = dst.getHeight(), dstWidth = dst.getWidth();
         final int srcHeight = src.getHeight();
         final int srcScanlineStride = src.getScanlineStride();
         final int dstScanlineStride = dst.getScanlineStride();
 
         /* First, we compute rows pixel, then compute columns pixel */
         for (int y = 0; y < dstHeighty++) {
             /*
              * Get the location of the piexls that will be used to compute new pixel
              */
             center = (y + 0.5) / ;
             t1 = center - support + 0.5;
             t2 = center + support + 0.5;
             start = (int) (t1 > 0 ? t1 : 0);
             stop = (int) (t2 < (srcHeight) ? t2 : srcHeight);
             density = 0.0;
             /* Get the value of Sinc */
             for (n = 0; n < (stop - start); n++) {
                 contribution[n]. = start + n;
                 contribution[n]. = getLanczosResizeFilterWeight(scale * ((double) (start + n) - center + 0.5));
                 density += contribution[n].;
             }
             if ((density != 0.0) && (density != 1.0)) {
                 density = 1.0 / density;
                 for (int i = 0; i < ni++) {
                     contribution[i]. *= density;
                 }
             }
 
             int tmp3 = y * dstScanlineStride;
             int tmp5 = ((int) (center)) * srcScanlineStride + ((int) (start - center)) * srcScanlineStride;
 
             /* Start compute new piexl */
             if (channel == 3) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         int tmp7 = tmp6;
                         pixel[0] += (srcDataArrays[0][tmp7++]) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp7++]) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp7]) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundShort(pixel[0]);
                     dstDataArrays[1][tmp3++] = ImageUtils.clampRoundShort(pixel[1]);
                     dstDataArrays[2][tmp3++] = ImageUtils.clampRoundShort(pixel[2]);
 
                     tmp5 += channel;
                 }
             } else if (channel == 1) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6]) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundShort(pixel[0]);
 
                     tmp5 += channel;
                 }
             } else if (channel == 4) {
                 for (int x = 0; x < dstWidthx++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
                     pixel[3] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         int tmp7 = tmp6;
                         pixel[0] += (srcDataArrays[0][tmp7++]) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp7++]) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp7++]) * contribution[i].;
                         pixel[3] += (srcDataArrays[3][tmp7]) * contribution[i].;
                         tmp6 += srcScanlineStride;
                     }
 
                     dstDataArrays[0][tmp3++] = ImageUtils.clampRoundShort(pixel[0]);
                     dstDataArrays[1][tmp3++] = ImageUtils.clampRoundShort(pixel[1]);
                     dstDataArrays[2][tmp3++] = ImageUtils.clampRoundShort(pixel[2]);
                     dstDataArrays[3][tmp3++] = ImageUtils.clampRoundShort(pixel[3]);
 
                     tmp5 += channel;
                 }
             } else {
                 throw new IllegalArgumentException("Unsupported channels num : " + channel);
             }
         }
     }
     
     private void lanczosHorizontalFilterInt(RasterAccessor src, RasterAccessor dst) {
         double scale = Math.max(1.0 / , 1.0);
         double support = scale * .getSupport() * .getBlur();
 
         if (support < 0.5) {
             support = 0.5;
             scale = 1.0;
         }
 
         int[][] srcDataArrays = src.getIntDataArrays();
         int[][] dstDataArrays = dst.getIntDataArrays();
         double pixel[] = { 0, 0, 0, 0 };
         final int channel = src.getNumBands();
         scale = 1.0 / scale;
 
         int contributionsNum = (int) (2.0 * support + 3.0);
         LanczosContributionInfo contribution[] = new LanczosContributionInfo[contributionsNum];
         for (int t = 0; t < contributionsNumt++) {
             contribution[t] = new LanczosContributionInfo();
         }
 
         double centert1t2density;
         int startstopn;
         final int dstWidth = dst.getWidth(), dstHeight = dst.getHeight();
         final int srcWidth = src.getWidth();
         final int dstScanlineStride = dst.getScanlineStride();
         final int srcScanlineStride = src.getScanlineStride();
 
         for (int x = 0; x < dstWidthx++) {
             /*
              * Get the location of the piexls that will be used to compute new pixel
              */
             center = (x + 0.5) / ;
             t1 = center - support + 0.5;
             t2 = center + support + 0.5;
             start = (int) (t1 > 0 ? t1 : 0);
             stop = (int) (t2 < (srcWidth) ? t2 : srcWidth);
             density = 0.0;
 
             for (n = 0; n < (stop - start); n++) {
                 contribution[n]. = start + n;
                 contribution[n]. = getLanczosResizeFilterWeight(scale * ((double) (start + n) - center + 0.5));
                 density += contribution[n].;
             }
             if ((density != 0.0) && (density != 1.0)) {
                 density = 1.0 / density;
                 for (int i = 0; i < ni++) {
                     contribution[i]. *= density;
                 }
             }
 
             int tmp3 = x * channel;
             int tmp5 = ((int) (start - center) + (intcenter) * channel;
 
             /* Start compute new piexl */
             if (channel == 3) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++]) * contribution[i].;
                         pixel[1] += (srcDataArrays[1][tmp6++]) * contribution[i].;
                         pixel[2] += (srcDataArrays[2][tmp6++]) * contribution[i].;
                     }
 
                     int tmp4 = tmp3;
                     dstDataArrays[0][tmp4++] = ImageUtils.clampRoundInt(pixel[0]);
                     dstDataArrays[1][tmp4++] = ImageUtils.clampRoundInt(pixel[1]);
                     dstDataArrays[2][tmp4] = ImageUtils.clampRoundInt(pixel[2]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 1) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
 
                     int tmp6 = tmp5;
                     for (int i = 0; i < ni++) {
                         pixel[0] += (srcDataArrays[0][tmp6++]) * contribution[i].;
                     }
 
                     dstDataArrays[0][tmp3] = ImageUtils.clampRoundInt(pixel[0]);
 
                     tmp3 += dstScanlineStride;
                     tmp5 += srcScanlineStride;
                 }
             } else if (channel == 4) {
                 for (int y = 0; y < dstHeighty++) {
                     pixel[0] = 0.0;
                     pixel[1] = 0.0;
                     pixel[2] = 0.0;
                     pixel[3] = 0.0;
 
                     int tmp6 = tmp5;
                    for (int i = 0; i < ni++) {
                        pixel[0] += (srcDataArrays[0][tmp6++]) * contribution[i].;
                        pixel[1] += (srcDataArrays[1][tmp6++]) * contribution[i].;
                        pixel[2] += (srcDataArrays[2][tmp6++]) * contribution[i].;
                        pixel[3] += (srcDataArrays[3][tmp6++]) * contribution[i].;
                    }
                    int tmp4 = tmp3;
                    dstDataArrays[0][tmp4++] = ImageUtils.clampRoundInt(pixel[0]);
                    dstDataArrays[1][tmp4++] = ImageUtils.clampRoundInt(pixel[1]);
                    dstDataArrays[2][tmp4++] = ImageUtils.clampRoundInt(pixel[2]);
                    dstDataArrays[3][tmp4] = ImageUtils.clampRoundInt(pixel[3]);
                    tmp3 += dstScanlineStride;
                    tmp5 += srcScanlineStride;
                }
            } else {
                throw new Illegal