@@ -460,6 +460,83 @@ ImagingResampleVertical_8bpc(
460460 ImagingSectionLeave (& cookie );
461461}
462462
463+ void
464+ ImagingResampleHorizontal_16bpc (
465+ Imaging imOut , Imaging imIn , int offset , int ksize , int * bounds , double * kk
466+ ) {
467+ ImagingSectionCookie cookie ;
468+ double ss ;
469+ int xx , yy , x , xmin , xmax , ss_int ;
470+ double * k ;
471+
472+ int bigendian = 0 ;
473+ if (strcmp (imIn -> mode , "I;16N" ) == 0
474+ #ifdef WORDS_BIGENDIAN
475+ || strcmp (imIn -> mode , "I;16B" ) == 0
476+ #endif
477+ ) {
478+ bigendian = 1 ;
479+ }
480+
481+ ImagingSectionEnter (& cookie );
482+ for (yy = 0 ; yy < imOut -> ysize ; yy ++ ) {
483+ for (xx = 0 ; xx < imOut -> xsize ; xx ++ ) {
484+ xmin = bounds [xx * 2 + 0 ];
485+ xmax = bounds [xx * 2 + 1 ];
486+ k = & kk [xx * ksize ];
487+ ss = 0.0 ;
488+ for (x = 0 ; x < xmax ; x ++ ) {
489+ ss += (imIn -> image8 [yy + offset ][(x + xmin ) * 2 + (bigendian ? 1 : 0 )] +
490+ (imIn -> image8 [yy + offset ][(x + xmin ) * 2 + (bigendian ? 0 : 1 )]
491+ << 8 )) *
492+ k [x ];
493+ }
494+ ss_int = ROUND_UP (ss );
495+ imOut -> image8 [yy ][xx * 2 + (bigendian ? 1 : 0 )] = CLIP8 (ss_int % 256 );
496+ imOut -> image8 [yy ][xx * 2 + (bigendian ? 0 : 1 )] = CLIP8 (ss_int >> 8 );
497+ }
498+ }
499+ ImagingSectionLeave (& cookie );
500+ }
501+
502+ void
503+ ImagingResampleVertical_16bpc (
504+ Imaging imOut , Imaging imIn , int offset , int ksize , int * bounds , double * kk
505+ ) {
506+ ImagingSectionCookie cookie ;
507+ double ss ;
508+ int xx , yy , y , ymin , ymax , ss_int ;
509+ double * k ;
510+
511+ int bigendian = 0 ;
512+ if (strcmp (imIn -> mode , "I;16N" ) == 0
513+ #ifdef WORDS_BIGENDIAN
514+ || strcmp (imIn -> mode , "I;16B" ) == 0
515+ #endif
516+ ) {
517+ bigendian = 1 ;
518+ }
519+
520+ ImagingSectionEnter (& cookie );
521+ for (yy = 0 ; yy < imOut -> ysize ; yy ++ ) {
522+ ymin = bounds [yy * 2 + 0 ];
523+ ymax = bounds [yy * 2 + 1 ];
524+ k = & kk [yy * ksize ];
525+ for (xx = 0 ; xx < imOut -> xsize ; xx ++ ) {
526+ ss = 0.0 ;
527+ for (y = 0 ; y < ymax ; y ++ ) {
528+ ss += (imIn -> image8 [y + ymin ][xx * 2 + (bigendian ? 1 : 0 )] +
529+ (imIn -> image8 [y + ymin ][xx * 2 + (bigendian ? 0 : 1 )] << 8 )) *
530+ k [y ];
531+ }
532+ ss_int = ROUND_UP (ss );
533+ imOut -> image8 [yy ][xx * 2 + (bigendian ? 1 : 0 )] = CLIP8 (ss_int % 256 );
534+ imOut -> image8 [yy ][xx * 2 + (bigendian ? 0 : 1 )] = CLIP8 (ss_int >> 8 );
535+ }
536+ }
537+ ImagingSectionLeave (& cookie );
538+ }
539+
463540void
464541ImagingResampleHorizontal_32bpc (
465542 Imaging imOut , Imaging imIn , int offset , int ksize , int * bounds , double * kk
@@ -574,7 +651,12 @@ ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) {
574651 }
575652
576653 if (imIn -> type == IMAGING_TYPE_SPECIAL ) {
577- return (Imaging )ImagingError_ModeError ();
654+ if (strncmp (imIn -> mode , "I;16" , 4 ) == 0 ) {
655+ ResampleHorizontal = ImagingResampleHorizontal_16bpc ;
656+ ResampleVertical = ImagingResampleVertical_16bpc ;
657+ } else {
658+ return (Imaging )ImagingError_ModeError ();
659+ }
578660 } else if (imIn -> image8 ) {
579661 ResampleHorizontal = ImagingResampleHorizontal_8bpc ;
580662 ResampleVertical = ImagingResampleVertical_8bpc ;
0 commit comments