@@ -1890,6 +1890,7 @@ void gdImageFill(gdImagePtr im, int x, int y, int nc)
1890
1890
1891
1891
if (nc == gdTiled ){
1892
1892
_gdImageFillTiled (im ,x ,y ,nc );
1893
+ im -> alphaBlendingFlag = alphablending_bak ;
1893
1894
return ;
1894
1895
}
1895
1896
@@ -2192,7 +2193,7 @@ void gdImageCopyMerge (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int s
2192
2193
int tox , toy ;
2193
2194
int ncR , ncG , ncB ;
2194
2195
toy = dstY ;
2195
-
2196
+ printf ( "srccpopy:%X" , src -> transparent );
2196
2197
for (y = srcY ; y < (srcY + h ); y ++ ) {
2197
2198
tox = dstX ;
2198
2199
for (x = srcX ; x < (srcX + w ); x ++ ) {
@@ -2493,7 +2494,7 @@ void gdImageCopyResampled (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, i
2493
2494
#endif /* ROTATE_PI */
2494
2495
2495
2496
#define ROTATE_DEG2RAD 3.1415926535897932384626433832795/180
2496
- void gdImageSkewX (gdImagePtr dst , gdImagePtr src , int uRow , int iOffset , double dWeight , int clrBack )
2497
+ void gdImageSkewX (gdImagePtr dst , gdImagePtr src , int uRow , int iOffset , double dWeight , int clrBack , int ignoretransparent )
2497
2498
{
2498
2499
typedef int (* FuncPtr )(gdImagePtr , int , int );
2499
2500
int i , r , g , b , a , clrBackR , clrBackG , clrBackB , clrBackA ;
@@ -2558,10 +2559,14 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double
2558
2559
a = 127 ;
2559
2560
}
2560
2561
2561
- pxlSrc = gdImageColorAllocateAlpha (dst , r , g , b , a );
2562
+ if (ignoretransparent && pxlSrc == dst -> transparent ) {
2563
+ pxlSrc = dst -> transparent ;
2564
+ } else {
2565
+ pxlSrc = gdImageColorAllocateAlpha (dst , r , g , b , a );
2562
2566
2563
- if (pxlSrc == -1 ) {
2564
- pxlSrc = gdImageColorClosestAlpha (dst , r , g , b , a );
2567
+ if (pxlSrc == -1 ) {
2568
+ pxlSrc = gdImageColorClosestAlpha (dst , r , g , b , a );
2569
+ }
2565
2570
}
2566
2571
2567
2572
if ((i + iOffset >= 0 ) && (i + iOffset < dst -> sx )) {
@@ -2586,7 +2591,7 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double
2586
2591
}
2587
2592
}
2588
2593
2589
- void gdImageSkewY (gdImagePtr dst , gdImagePtr src , int uCol , int iOffset , double dWeight , int clrBack )
2594
+ void gdImageSkewY (gdImagePtr dst , gdImagePtr src , int uCol , int iOffset , double dWeight , int clrBack , int ignoretransparent )
2590
2595
{
2591
2596
typedef int (* FuncPtr )(gdImagePtr , int , int );
2592
2597
int i , iYPos = 0 , r , g , b , a ;
@@ -2645,10 +2650,14 @@ void gdImageSkewY (gdImagePtr dst, gdImagePtr src, int uCol, int iOffset, double
2645
2650
a = 127 ;
2646
2651
}
2647
2652
2648
- pxlSrc = gdImageColorAllocateAlpha (dst , r , g , b , a );
2653
+ if (ignoretransparent && pxlSrc == dst -> transparent ) {
2654
+ pxlSrc = dst -> transparent ;
2655
+ } else {
2656
+ pxlSrc = gdImageColorAllocateAlpha (dst , r , g , b , a );
2649
2657
2650
- if (pxlSrc == -1 ) {
2651
- pxlSrc = gdImageColorClosestAlpha (dst , r , g , b , a );
2658
+ if (pxlSrc == -1 ) {
2659
+ pxlSrc = gdImageColorClosestAlpha (dst , r , g , b , a );
2660
+ }
2652
2661
}
2653
2662
2654
2663
if ((iYPos >= 0 ) && (iYPos < dst -> sy )) {
@@ -2670,7 +2679,7 @@ void gdImageSkewY (gdImagePtr dst, gdImagePtr src, int uCol, int iOffset, double
2670
2679
}
2671
2680
2672
2681
/* Rotates an image by 90 degrees (counter clockwise) */
2673
- gdImagePtr gdImageRotate90 (gdImagePtr src )
2682
+ gdImagePtr gdImageRotate90 (gdImagePtr src , int ignoretransparent )
2674
2683
{
2675
2684
int uY , uX ;
2676
2685
int c ,r ,g ,b ,a ;
@@ -2684,6 +2693,7 @@ gdImagePtr gdImageRotate90 (gdImagePtr src)
2684
2693
f = gdImageGetPixel ;
2685
2694
}
2686
2695
dst = gdImageCreateTrueColor (src -> sy , src -> sx );
2696
+ dst -> transparent = src -> transparent ;
2687
2697
2688
2698
if (dst != NULL ) {
2689
2699
gdImagePaletteCopy (dst , src );
@@ -2698,7 +2708,11 @@ gdImagePtr gdImageRotate90 (gdImagePtr src)
2698
2708
a = gdImageAlpha (src ,c );
2699
2709
c = gdTrueColorAlpha (r , g , b , a );
2700
2710
}
2701
- gdImageSetPixel (dst , uY , (dst -> sy - uX - 1 ), c );
2711
+ if (ignoretransparent && c == dst -> transparent ) {
2712
+ gdImageSetPixel (dst , uY , (dst -> sy - uX - 1 ), dst -> transparent );
2713
+ } else {
2714
+ gdImageSetPixel (dst , uY , (dst -> sy - uX - 1 ), c );
2715
+ }
2702
2716
}
2703
2717
}
2704
2718
}
@@ -2707,7 +2721,7 @@ gdImagePtr gdImageRotate90 (gdImagePtr src)
2707
2721
}
2708
2722
2709
2723
/* Rotates an image by 180 degrees (counter clockwise) */
2710
- gdImagePtr gdImageRotate180 (gdImagePtr src )
2724
+ gdImagePtr gdImageRotate180 (gdImagePtr src , int ignoretransparent )
2711
2725
{
2712
2726
int uY , uX ;
2713
2727
int c ,r ,g ,b ,a ;
@@ -2721,6 +2735,7 @@ gdImagePtr gdImageRotate180 (gdImagePtr src)
2721
2735
f = gdImageGetPixel ;
2722
2736
}
2723
2737
dst = gdImageCreateTrueColor (src -> sx , src -> sy );
2738
+ dst -> transparent = src -> transparent ;
2724
2739
2725
2740
if (dst != NULL ) {
2726
2741
gdImagePaletteCopy (dst , src );
@@ -2735,7 +2750,11 @@ gdImagePtr gdImageRotate180 (gdImagePtr src)
2735
2750
a = gdImageAlpha (src ,c );
2736
2751
c = gdTrueColorAlpha (r , g , b , a );
2737
2752
}
2738
- gdImageSetPixel (dst , (dst -> sx - uX - 1 ), (dst -> sy - uY - 1 ), c );
2753
+ if (ignoretransparent && c == dst -> transparent ) {
2754
+ gdImageSetPixel (dst , uY , (dst -> sy - uX - 1 ), dst -> transparent );
2755
+ } else {
2756
+ gdImageSetPixel (dst , uY , (dst -> sy - uX - 1 ), c );
2757
+ }
2739
2758
}
2740
2759
}
2741
2760
}
@@ -2744,7 +2763,7 @@ gdImagePtr gdImageRotate180 (gdImagePtr src)
2744
2763
}
2745
2764
2746
2765
/* Rotates an image by 270 degrees (counter clockwise) */
2747
- gdImagePtr gdImageRotate270 ( gdImagePtr src )
2766
+ gdImagePtr gdImageRotate270 (gdImagePtr src , int ignoretransparent )
2748
2767
{
2749
2768
int uY , uX ;
2750
2769
int c ,r ,g ,b ,a ;
@@ -2758,6 +2777,7 @@ gdImagePtr gdImageRotate270 ( gdImagePtr src )
2758
2777
f = gdImageGetPixel ;
2759
2778
}
2760
2779
dst = gdImageCreateTrueColor (src -> sy , src -> sx );
2780
+ dst -> transparent = src -> transparent ;
2761
2781
2762
2782
if (dst != NULL ) {
2763
2783
gdImagePaletteCopy (dst , src );
@@ -2772,15 +2792,19 @@ gdImagePtr gdImageRotate270 ( gdImagePtr src )
2772
2792
a = gdImageAlpha (src ,c );
2773
2793
c = gdTrueColorAlpha (r , g , b , a );
2774
2794
}
2775
- gdImageSetPixel (dst , (dst -> sx - uY - 1 ), uX , c );
2795
+ if (ignoretransparent && c == dst -> transparent ) {
2796
+ gdImageSetPixel (dst , uY , (dst -> sy - uX - 1 ), dst -> transparent );
2797
+ } else {
2798
+ gdImageSetPixel (dst , uY , (dst -> sy - uX - 1 ), c );
2799
+ }
2776
2800
}
2777
2801
}
2778
2802
}
2779
2803
2780
2804
return dst ;
2781
2805
}
2782
2806
2783
- gdImagePtr gdImageRotate45 (gdImagePtr src , double dAngle , int clrBack )
2807
+ gdImagePtr gdImageRotate45 (gdImagePtr src , double dAngle , int clrBack , int ignoretransparent )
2784
2808
{
2785
2809
typedef int (* FuncPtr )(gdImagePtr , int , int );
2786
2810
gdImagePtr dst1 ,dst2 ,dst3 ;
@@ -2820,6 +2844,15 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
2820
2844
2821
2845
gdImagePaletteCopy (dst1 , src );
2822
2846
2847
+ if (ignoretransparent ) {
2848
+ if (gdImageTrueColor (src )) {
2849
+ dst1 -> transparent = src -> transparent ;
2850
+ } else {
2851
+
2852
+ dst1 -> transparent = gdTrueColorAlpha (gdImageRed (src , src -> transparent ), gdImageBlue (src , src -> transparent ), gdImageGreen (src , src -> transparent ), 127 );
2853
+ }
2854
+ }
2855
+
2823
2856
dRadAngle = dAngle * ROTATE_DEG2RAD ; /* Angle in radians */
2824
2857
dSinE = sin (dRadAngle );
2825
2858
dTan = tan (dRadAngle / 2.0 );
@@ -2832,7 +2865,7 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
2832
2865
}
2833
2866
2834
2867
iShear = (int )floor (dShear );
2835
- gdImageSkewX (dst1 , src , u , iShear , (dShear - iShear ), clrBack );
2868
+ gdImageSkewX (dst1 , src , u , iShear , (dShear - iShear ), clrBack , ignoretransparent );
2836
2869
}
2837
2870
2838
2871
/*
@@ -2868,10 +2901,13 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
2868
2901
return NULL ;
2869
2902
}
2870
2903
dst2 -> alphaBlendingFlag = gdEffectReplace ;
2904
+ if (ignoretransparent ) {
2905
+ dst2 -> transparent = dst1 -> transparent ;
2906
+ }
2871
2907
2872
2908
for (u = 0 ; u < dst2 -> sx ; u ++ , dOffset -= dSinE ) {
2873
2909
iShear = (int )floor (dOffset );
2874
- gdImageSkewY (dst2 , dst1 , u , iShear , (dOffset - (double )iShear ), clrBack );
2910
+ gdImageSkewY (dst2 , dst1 , u , iShear , (dOffset - (double )iShear ), clrBack , ignoretransparent );
2875
2911
}
2876
2912
2877
2913
/* 3rd shear */
@@ -2890,23 +2926,29 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
2890
2926
gdImageDestroy (dst2 );
2891
2927
return NULL ;
2892
2928
}
2929
+
2930
+ dst3 -> alphaBlendingFlag = gdEffectReplace ;
2931
+ if (ignoretransparent ) {
2932
+ dst3 -> transparent = dst2 -> transparent ;
2933
+ }
2934
+
2893
2935
if (dSinE >= 0.0 ) {
2894
2936
dOffset = (double )(src -> sx - 1 ) * dSinE * - dTan ;
2895
2937
} else {
2896
2938
dOffset = dTan * ((double )(src -> sx - 1 ) * - dSinE + (double )(1 - newy ));
2897
2939
}
2898
2940
2899
2941
for (u = 0 ; u < dst3 -> sy ; u ++ , dOffset += dTan ) {
2900
- int iShear = (int )floor (dOffset );
2901
- gdImageSkewX (dst3 , dst2 , u , iShear , (dOffset - iShear ), clrBack );
2942
+ int iShear = (int )floor (dOffset );
2943
+ gdImageSkewX (dst3 , dst2 , u , iShear , (dOffset - iShear ), clrBack , ignoretransparent );
2902
2944
}
2903
2945
2904
2946
gdImageDestroy (dst2 );
2905
2947
2906
2948
return dst3 ;
2907
2949
}
2908
2950
2909
- gdImagePtr gdImageRotate (gdImagePtr src , double dAngle , int clrBack )
2951
+ gdImagePtr gdImageRotate (gdImagePtr src , double dAngle , int clrBack , int ignoretransparent )
2910
2952
{
2911
2953
gdImagePtr pMidImg ;
2912
2954
gdImagePtr rotatedImg ;
@@ -2928,33 +2970,33 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack)
2928
2970
}
2929
2971
2930
2972
if (dAngle == 90.00 ) {
2931
- return gdImageRotate90 (src );
2973
+ return gdImageRotate90 (src , ignoretransparent );
2932
2974
}
2933
2975
if (dAngle == 180.00 ) {
2934
- return gdImageRotate180 (src );
2976
+ return gdImageRotate180 (src , ignoretransparent );
2935
2977
}
2936
2978
if (dAngle == 270.00 ) {
2937
- return gdImageRotate270 ( src );
2979
+ return gdImageRotate270 (src , ignoretransparent );
2938
2980
}
2939
2981
2940
2982
if ((dAngle > 45.0 ) && (dAngle <= 135.0 )) {
2941
- pMidImg = gdImageRotate90 (src );
2983
+ pMidImg = gdImageRotate90 (src , ignoretransparent );
2942
2984
dAngle -= 90.0 ;
2943
2985
} else if ((dAngle > 135.0 ) && (dAngle <= 225.0 )) {
2944
- pMidImg = gdImageRotate180 (src );
2986
+ pMidImg = gdImageRotate180 (src , ignoretransparent );
2945
2987
dAngle -= 180.0 ;
2946
2988
} else if ((dAngle > 225.0 ) && (dAngle <= 315.0 )) {
2947
- pMidImg = gdImageRotate270 (src );
2989
+ pMidImg = gdImageRotate270 (src , ignoretransparent );
2948
2990
dAngle -= 270.0 ;
2949
2991
} else {
2950
- return gdImageRotate45 (src , dAngle , clrBack );
2992
+ return gdImageRotate45 (src , dAngle , clrBack , ignoretransparent );
2951
2993
}
2952
2994
2953
2995
if (pMidImg == NULL ) {
2954
2996
return NULL ;
2955
2997
}
2956
2998
2957
- rotatedImg = gdImageRotate45 (pMidImg , dAngle , clrBack );
2999
+ rotatedImg = gdImageRotate45 (pMidImg , dAngle , clrBack , ignoretransparent );
2958
3000
gdImageDestroy (pMidImg );
2959
3001
2960
3002
return rotatedImg ;
0 commit comments