@@ -49,6 +49,15 @@ static PyObject *extloadobj = NULL;
49
49
static PyObject * extsaveobj = NULL ;
50
50
static PyObject * extverobj = NULL ;
51
51
52
+ static inline void
53
+ pad (char * * data , int padding )
54
+ {
55
+ if (padding ) {
56
+ memset (* data , 0 , padding );
57
+ * data += padding ;
58
+ }
59
+ }
60
+
52
61
static const char *
53
62
find_extension (const char * fullname )
54
63
{
@@ -414,7 +423,7 @@ tobytes_surf_32bpp_sse42(SDL_Surface *surf, int flipped, char *data,
414
423
static void
415
424
tobytes_surf_32bpp (SDL_Surface * surf , int flipped , int hascolorkey ,
416
425
Uint32 colorkey , char * serialized_image , int color_offset ,
417
- int alpha_offset )
426
+ int alpha_offset , int padding )
418
427
{
419
428
int w , h ;
420
429
@@ -441,7 +450,8 @@ tobytes_surf_32bpp(SDL_Surface *surf, int flipped, int hascolorkey,
441
450
sizeof (int ) == sizeof (Uint32 ) &&
442
451
4 * sizeof (Uint32 ) == sizeof (__m128i ) &&
443
452
!hascolorkey /* No color key */
444
- && SDL_HasSSE42 () == SDL_TRUE
453
+ && !padding &&
454
+ SDL_HasSSE42 () == SDL_TRUE
445
455
/* The SSE code assumes it will always read at least 4 pixels */
446
456
&& surf -> w >= 4
447
457
/* Our SSE code assumes masks are at most 0xff */
@@ -480,6 +490,7 @@ tobytes_surf_32bpp(SDL_Surface *surf, int flipped, int hascolorkey,
480
490
: 255 );
481
491
serialized_image += 4 ;
482
492
}
493
+ pad (& serialized_image , padding );
483
494
}
484
495
}
485
496
@@ -490,25 +501,25 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
490
501
PyObject * bytes = NULL ;
491
502
char * format , * data ;
492
503
SDL_Surface * surf ;
493
- int w , h , flipped = 0 ;
494
- int byte_width ;
504
+ int w , h , flipped = 0 , pitch = -1 ;
505
+ int byte_width , padding ;
495
506
Py_ssize_t len ;
496
507
Uint32 Rmask , Gmask , Bmask , Amask , Rshift , Gshift , Bshift , Ashift , Rloss ,
497
508
Gloss , Bloss , Aloss ;
498
509
int hascolorkey = 0 ;
499
510
Uint32 color , colorkey ;
500
511
Uint32 alpha ;
501
- static char * kwds [] = {"surface" , "format" , "flipped" , NULL };
512
+ static char * kwds [] = {"surface" , "format" , "flipped" , "pitch" , NULL };
502
513
503
514
#ifdef _MSC_VER
504
515
/* MSVC static analyzer false alarm: assure format is NULL-terminated by
505
516
* making analyzer assume it was initialised */
506
517
__analysis_assume (format = "inited" );
507
518
#endif
508
519
509
- if (!PyArg_ParseTupleAndKeywords (arg , kwarg , "O!s|i " , kwds ,
520
+ if (!PyArg_ParseTupleAndKeywords (arg , kwarg , "O!s|ii " , kwds ,
510
521
& pgSurface_Type , & surfobj , & format ,
511
- & flipped ))
522
+ & flipped , & pitch ))
512
523
return NULL ;
513
524
surf = pgSurface_AsSurface (surfobj );
514
525
@@ -555,16 +566,32 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
555
566
return RAISE (PyExc_ValueError , "Unrecognized type of format" );
556
567
}
557
568
558
- bytes = PyBytes_FromStringAndSize (NULL , (Py_ssize_t )byte_width * surf -> h );
569
+ if (pitch == -1 ) {
570
+ pitch = byte_width ;
571
+ padding = 0 ;
572
+ }
573
+ else if (pitch < byte_width ) {
574
+ return RAISE (PyExc_ValueError ,
575
+ "Pitch must be greater than or equal to the width "
576
+ "as per the format" );
577
+ }
578
+ else {
579
+ padding = pitch - byte_width ;
580
+ }
581
+
582
+ bytes = PyBytes_FromStringAndSize (NULL , (Py_ssize_t )pitch * surf -> h );
559
583
if (!bytes )
560
584
return NULL ;
561
585
PyBytes_AsStringAndSize (bytes , & data , & len );
562
586
563
587
if (!strcmp (format , "P" )) {
564
588
pgSurface_Lock (surfobj );
565
- for (h = 0 ; h < surf -> h ; ++ h )
566
- memcpy (DATAROW (data , h , byte_width , surf -> h , flipped ),
567
- (char * )surf -> pixels + (h * surf -> pitch ), surf -> w );
589
+ for (h = 0 ; h < surf -> h ; ++ h ) {
590
+ Uint8 * ptr = (Uint8 * )DATAROW (data , h , pitch , surf -> h , flipped );
591
+ memcpy (ptr , (char * )surf -> pixels + (h * surf -> pitch ), surf -> w );
592
+ if (padding )
593
+ memset (ptr + byte_width , 0 , padding );
594
+ }
568
595
pgSurface_Unlock (surfobj );
569
596
}
570
597
else if (!strcmp (format , "RGB" )) {
@@ -582,6 +609,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
582
609
data [2 ] = (char )surf -> format -> palette -> colors [color ].b ;
583
610
data += 3 ;
584
611
}
612
+ pad (& data , padding );
585
613
}
586
614
break ;
587
615
case 2 :
@@ -595,6 +623,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
595
623
data [2 ] = (char )(((color & Bmask ) >> Bshift ) << Bloss );
596
624
data += 3 ;
597
625
}
626
+ pad (& data , padding );
598
627
}
599
628
break ;
600
629
case 3 :
@@ -613,6 +642,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
613
642
data [2 ] = (char )(((color & Bmask ) >> Bshift ) << Bloss );
614
643
data += 3 ;
615
644
}
645
+ pad (& data , padding );
616
646
}
617
647
break ;
618
648
case 4 :
@@ -626,6 +656,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
626
656
data [2 ] = (char )(((color & Bmask ) >> Bshift ) << Rloss );
627
657
data += 3 ;
628
658
}
659
+ pad (& data , padding );
629
660
}
630
661
break ;
631
662
}
@@ -648,6 +679,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
648
679
: (char )255 ;
649
680
data += 4 ;
650
681
}
682
+ pad (& data , padding );
651
683
}
652
684
break ;
653
685
case 2 :
@@ -667,6 +699,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
667
699
: 255 );
668
700
data += 4 ;
669
701
}
702
+ pad (& data , padding );
670
703
}
671
704
break ;
672
705
case 3 :
@@ -691,11 +724,12 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
691
724
: 255 );
692
725
data += 4 ;
693
726
}
727
+ pad (& data , padding );
694
728
}
695
729
break ;
696
730
case 4 :
697
731
tobytes_surf_32bpp (surf , flipped , hascolorkey , colorkey , data ,
698
- 0 , 3 );
732
+ 0 , 3 , padding );
699
733
break ;
700
734
}
701
735
pgSurface_Unlock (surfobj );
@@ -715,6 +749,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
715
749
data [0 ] = (char )255 ;
716
750
data += 4 ;
717
751
}
752
+ pad (& data , padding );
718
753
}
719
754
break ;
720
755
case 2 :
@@ -731,6 +766,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
731
766
: 255 );
732
767
data += 4 ;
733
768
}
769
+ pad (& data , padding );
734
770
}
735
771
break ;
736
772
case 3 :
@@ -752,11 +788,12 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
752
788
: 255 );
753
789
data += 4 ;
754
790
}
791
+ pad (& data , padding );
755
792
}
756
793
break ;
757
794
case 4 :
758
795
tobytes_surf_32bpp (surf , flipped , hascolorkey , colorkey , data ,
759
- 1 , 0 );
796
+ 1 , 0 , padding );
760
797
break ;
761
798
}
762
799
pgSurface_Unlock (surfobj );
@@ -776,6 +813,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
776
813
data [3 ] = (char )255 ;
777
814
data += 4 ;
778
815
}
816
+ pad (& data , padding );
779
817
}
780
818
break ;
781
819
case 2 :
@@ -792,6 +830,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
792
830
: 255 );
793
831
data += 4 ;
794
832
}
833
+ pad (& data , padding );
795
834
}
796
835
break ;
797
836
case 3 :
@@ -813,6 +852,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
813
852
: 255 );
814
853
data += 4 ;
815
854
}
855
+ pad (& data , padding );
816
856
}
817
857
break ;
818
858
case 4 :
@@ -829,6 +869,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
829
869
: 255 );
830
870
data += 4 ;
831
871
}
872
+ pad (& data , padding );
832
873
}
833
874
break ;
834
875
}
@@ -856,6 +897,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
856
897
data [3 ] = (char )alpha ;
857
898
data += 4 ;
858
899
}
900
+ pad (& data , padding );
859
901
}
860
902
break ;
861
903
case 3 :
@@ -882,6 +924,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
882
924
data [3 ] = (char )alpha ;
883
925
data += 4 ;
884
926
}
927
+ pad (& data , padding );
885
928
}
886
929
break ;
887
930
case 4 :
@@ -908,6 +951,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
908
951
data [3 ] = (char )alpha ;
909
952
data += 4 ;
910
953
}
954
+ pad (& data , padding );
911
955
}
912
956
break ;
913
957
}
@@ -935,6 +979,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
935
979
data [0 ] = (char )alpha ;
936
980
data += 4 ;
937
981
}
982
+ pad (& data , padding );
938
983
}
939
984
break ;
940
985
case 3 :
@@ -961,6 +1006,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
961
1006
data [0 ] = (char )alpha ;
962
1007
data += 4 ;
963
1008
}
1009
+ pad (& data , padding );
964
1010
}
965
1011
break ;
966
1012
case 4 :
@@ -987,6 +1033,7 @@ image_tobytes(PyObject *self, PyObject *arg, PyObject *kwarg)
987
1033
data [0 ] = (char )alpha ;
988
1034
data += 4 ;
989
1035
}
1036
+ pad (& data , padding );
990
1037
}
991
1038
break ;
992
1039
}
0 commit comments