Changeset 8115


Ignore:
Timestamp:
06/02/12 11:15:10 (12 months ago)
Author:
cristy
Message:
 
Location:
ImageMagick/branches/ImageMagick-6
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ImageMagick/branches/ImageMagick-6/ChangeLog

    r8106 r8115  
    22  * The -set colorspace option sets the colorspace, it does not transform it. 
    33  * Assume grayscale images in the GIF format are linear. 
     4  * Add Nicolas Robidoux's bicubic interolation method (reference 
     5    http://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=21118). 
    46 
    572012-05-31  6.7.7-5 Cristy  <quetzlzacatenango@image...> 
  • ImageMagick/branches/ImageMagick-6/magick/pixel-private.h

    r8114 r8115  
    3535 
    3636  /* 
    37      Reciprocal alpha: clamp overshoot; ensure alpha is not negative or too 
    38      close to 0; return reciprocal. 
     37    Reciprocal alpha: clamp to [MagickEpsilon,1], return reciprocal. 
    3938  */ 
    4039  beta=(alpha > (MagickRealType) 1.0 ? (MagickRealType) 1.0 : alpha); 
    41   beta=(gamma < (MagickRealType) MagickEpsilon ? (MagickRealType) 
     40  beta=(beta < (MagickRealType) MagickEpsilon ? (MagickRealType) 
    4241    MagickEpsilon : beta); 
    4342  return((MagickRealType) 1.0/beta); 
  • ImageMagick/branches/ImageMagick-6/magick/pixel.c

    r8111 r8115  
    38123812} 
    38133813 
    3814 /* 
    3815   BicubicInterpolate() 
    3816     Interpolate a Cubic Interpolatation of array of 4 'pixels', 
    3817     for given delta_x, and save result into 'pixel' 
    3818     But what 'cubic' is this?  It does not match 'catrom' or 'lagrange' 
    3819 */ 
    3820 static void BicubicInterpolate(const MagickPixelPacket *pixels,const double dx, 
    3821   MagickPixelPacket *pixel) 
    3822 { 
    3823   MagickRealType 
    3824     dx2, 
    3825     p, 
    3826     q, 
    3827     r, 
    3828     s; 
    3829  
    3830   dx2=dx*dx; 
    3831   p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red); 
    3832   q=(pixels[0].red-pixels[1].red)-p; 
    3833   r=pixels[2].red-pixels[0].red; 
    3834   s=pixels[1].red; 
    3835   pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s; 
    3836   p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green); 
    3837   q=(pixels[0].green-pixels[1].green)-p; 
    3838   r=pixels[2].green-pixels[0].green; 
    3839   s=pixels[1].green; 
    3840   pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s; 
    3841   p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue); 
    3842   q=(pixels[0].blue-pixels[1].blue)-p; 
    3843   r=pixels[2].blue-pixels[0].blue; 
    3844   s=pixels[1].blue; 
    3845   pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s; 
    3846   p=(pixels[3].opacity-pixels[2].opacity)-(pixels[0].opacity-pixels[1].opacity); 
    3847   q=(pixels[0].opacity-pixels[1].opacity)-p; 
    3848   r=pixels[2].opacity-pixels[0].opacity; 
    3849   s=pixels[1].opacity; 
    3850   pixel->opacity=(dx*dx2*p)+(dx2*q)+(dx*r)+s; 
    3851   if (pixel->colorspace == CMYKColorspace) 
    3852     { 
    3853       p=(pixels[3].index-pixels[2].index)-(pixels[0].index-pixels[1].index); 
    3854       q=(pixels[0].index-pixels[1].index)-p; 
    3855       r=pixels[2].index-pixels[0].index; 
    3856       s=pixels[1].index; 
    3857       pixel->index=(dx*dx2*p)+(dx2*q)+(dx*r)+s; 
    3858     } 
    3859 } 
    3860  
    38613814static inline double MagickMax(const MagickRealType x,const MagickRealType y) 
    38623815{ 
     
    39373890      i=2; /* size of the area to average - average nearest 4 neighbours */ 
    39383891      if (interpolate == Average9InterpolatePixel) 
    3939         i=3,x_offset=floor(x+0.5)-1,y_offset=floor(y+0.5)-1; 
     3892        { 
     3893          i=3; 
     3894          x_offset=(ssize_t) (floor(x+0.5)-1); 
     3895          y_offset=(ssize_t) (floor(y+0.5)-1); 
     3896        } 
    39403897      else if (interpolate == Average16InterpolatePixel) 
    3941         i=4,x_offset--,y_offset--; 
    3942  
    3943       p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,i,i,exception); 
     3898        { 
     3899          i=4; 
     3900          x_offset--; 
     3901          y_offset--; 
     3902        } 
     3903 
     3904      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) i, 
     3905        (size_t) i,exception); 
    39443906      if (p == (const PixelPacket *) NULL) 
    39453907        { 
     
    39783940    case BicubicInterpolatePixel: 
    39793941    { 
    3980       MagickPixelPacket 
    3981         u[4]; 
     3942      MagickRealType 
     3943        beta[4], 
     3944        cx[4], 
     3945        cy[4]; 
    39823946 
    39833947      PointInfo 
     
    39963960      delta.x=x-x_offset; 
    39973961      delta.y=y-y_offset; 
    3998       for (i=0; i < 4L; i++) 
    3999         BicubicInterpolate(pixels+4*i,delta.x,u+i); 
    4000       BicubicInterpolate(u,delta.y,pixel); 
     3962      beta[0]=1.0-delta.x; 
     3963      beta[1]=(-0.5)*delta.x; 
     3964      beta[2]=beta[0]*beta[1]; 
     3965      cx[0]=beta[0]*beta[2]; 
     3966      cx[3]=delta.x*beta[2]; 
     3967      beta[3]=cx[3]-cx[0]; 
     3968      cx[1]=beta[0]-cx[0]+beta[3]; 
     3969      cx[2]=delta.x-cx[3]-beta[3]; 
     3970      beta[0]=1.0-delta.y; 
     3971      beta[1]=(-0.5)*delta.y; 
     3972      beta[2]=beta[0]*beta[1]; 
     3973      cy[0]=beta[0]*beta[2]; 
     3974      cy[3]=delta.y*beta[2]; 
     3975      beta[3]=cy[3]-cy[0]; 
     3976      cy[1]=beta[0]-cy[0]+beta[3]; 
     3977      cy[2]=delta.y-cy[3]-beta[3]; 
     3978      /* 
     3979        Interpolate pixel. 
     3980      */ 
     3981      pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]* 
     3982        pixels[1].red+cx[2]*pixels[2].red+cx[3]* 
     3983        pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]* 
     3984        pixels[5].red+cx[2]*pixels[6].red+cx[3]* 
     3985        pixels[7].red)+cy[2]*(cx[0]*pixels[8].red+cx[1]* 
     3986        pixels[9].red+cx[2]*pixels[10].red+cx[3]* 
     3987        pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]* 
     3988        pixels[13].red+cx[2]*pixels[14].red+cx[3]*pixels[15].red)); 
     3989      pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]* 
     3990        pixels[1].green+cx[2]*pixels[2].green+cx[3]* 
     3991        pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+cx[1]* 
     3992        pixels[5].green+cx[2]*pixels[6].green+cx[3]* 
     3993        pixels[7].green)+cy[2]*(cx[0]*pixels[8].green+cx[1]* 
     3994        pixels[9].green+cx[2]*pixels[10].green+cx[3]* 
     3995        pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+cx[1]* 
     3996        pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green)); 
     3997      pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]* 
     3998        pixels[1].blue+cx[2]*pixels[2].blue+cx[3]* 
     3999        pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]* 
     4000        pixels[5].blue+cx[2]*pixels[6].blue+cx[3]* 
     4001        pixels[7].blue)+cy[2]*(cx[0]*pixels[8].blue+cx[1]* 
     4002        pixels[9].blue+cx[2]*pixels[10].blue+cx[3]* 
     4003        pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]* 
     4004        pixels[13].blue+cx[2]*pixels[14].blue+cx[3]*pixels[15].blue)); 
     4005      pixel->opacity=(cy[0]*(cx[0]*pixels[0].opacity+cx[1]* 
     4006        pixels[1].opacity+cx[2]*pixels[2].opacity+cx[3]* 
     4007        pixels[3].opacity)+cy[1]*(cx[0]*pixels[4].opacity+cx[1]* 
     4008        pixels[5].opacity+cx[2]*pixels[6].opacity+cx[3]* 
     4009        pixels[7].opacity)+cy[2]*(cx[0]*pixels[8].opacity+cx[1]* 
     4010        pixels[9].opacity+cx[2]*pixels[10].opacity+cx[3]* 
     4011        pixels[11].opacity)+cy[3]*(cx[0]*pixels[12].opacity+cx[1]* 
     4012        pixels[13].opacity+cx[2]*pixels[14].opacity+cx[3]*pixels[15].opacity)); 
    40014013      break; 
    40024014    } 
     
    40854097      gamma = 1.0/gamma; 
    40864098      alpha[0]=1.0/(fabs((double) alpha[0]) < MagickEpsilon ? MagickEpsilon : alpha[0]); 
    4087       pixel->red   = alpha[0]*pixels->red; 
    4088       pixel->green = alpha[0]*pixels->green;  /* divide by sum of alpha */ 
    4089       pixel->blue  = alpha[0]*pixels->blue; 
    4090       pixel->index = alpha[0]*pixels->index; 
    4091       pixel->opacity = gamma*pixels->opacity; /* divide by number of pixels */ 
     4099      pixel->red   = alpha[0]*pixel->red; 
     4100      pixel->green = alpha[0]*pixel->green;  /* divide by sum of alpha */ 
     4101      pixel->blue  = alpha[0]*pixel->blue; 
     4102      pixel->index = alpha[0]*pixel->index; 
     4103      pixel->opacity = gamma*pixel->opacity; /* divide by number of pixels */ 
    40924104      break; 
    40934105    } 
Note: See TracChangeset for help on using the changeset viewer.