@@ -343,218 +343,3 @@ gdImagePtr gdImageRotate270 (gdImagePtr src, int ignoretransparent)
343
343
344
344
return dst ;
345
345
}
346
-
347
- gdImagePtr gdImageRotate45 (gdImagePtr src , double dAngle , int clrBack , int ignoretransparent )
348
- {
349
- typedef int (* FuncPtr )(gdImagePtr , int , int );
350
- gdImagePtr dst1 ,dst2 ,dst3 ;
351
- FuncPtr f ;
352
- double dRadAngle , dSinE , dTan , dShear ;
353
- double dOffset ; /* Variable skew offset */
354
- int u , iShear , newx , newy ;
355
- int clrBackR , clrBackG , clrBackB , clrBackA ;
356
-
357
- /* See GEMS I for the algorithm details */
358
- dRadAngle = dAngle * ROTATE_DEG2RAD ; /* Angle in radians */
359
- dSinE = sin (dRadAngle );
360
- dTan = tan (dRadAngle / 2.0 );
361
-
362
- newx = (int )(src -> sx + src -> sy * fabs (dTan ));
363
- newy = src -> sy ;
364
-
365
- /* 1st shear */
366
- if (src -> trueColor ) {
367
- f = gdImageGetTrueColorPixel ;
368
- } else {
369
- f = gdImageGetPixel ;
370
- }
371
-
372
- dst1 = gdImageCreateTrueColor (newx , newy );
373
- /******* Perform 1st shear (horizontal) ******/
374
- if (dst1 == NULL ) {
375
- return NULL ;
376
- }
377
- #ifdef HAVE_GD_BUNDLED
378
- dst1 -> alphaBlendingFlag = gdEffectReplace ;
379
- #else
380
- gdImageAlphaBlending (dst1 , 0 );
381
- #endif
382
- if (dAngle == 0.0 ) {
383
- /* Returns copy of src */
384
- gdImageCopy (dst1 , src ,0 ,0 ,0 ,0 ,src -> sx ,src -> sy );
385
- return dst1 ;
386
- }
387
-
388
- gdImagePaletteCopy (dst1 , src );
389
-
390
- if (ignoretransparent ) {
391
- if (gdImageTrueColor (src )) {
392
- dst1 -> transparent = src -> transparent ;
393
- } else {
394
-
395
- dst1 -> transparent = gdTrueColorAlpha (gdImageRed (src , src -> transparent ), gdImageBlue (src , src -> transparent ), gdImageGreen (src , src -> transparent ), 127 );
396
- }
397
- }
398
-
399
- dRadAngle = dAngle * ROTATE_DEG2RAD ; /* Angle in radians */
400
- dSinE = sin (dRadAngle );
401
- dTan = tan (dRadAngle / 2.0 );
402
-
403
- for (u = 0 ; u < dst1 -> sy ; u ++ ) {
404
- if (dTan >= 0.0 ) {
405
- dShear = ((double )(u + 0.5 )) * dTan ;
406
- } else {
407
- dShear = ((double )(u - dst1 -> sy ) + 0.5 ) * dTan ;
408
- }
409
-
410
- iShear = (int )floor (dShear );
411
- gdImageSkewX (dst1 , src , u , iShear , (dShear - iShear ), clrBack , ignoretransparent );
412
- }
413
-
414
- /*
415
- The 1st shear may use the original clrBack as color index
416
- Convert it once here
417
- */
418
- if (!src -> trueColor ) {
419
- clrBackR = gdImageRed (src , clrBack );
420
- clrBackG = gdImageGreen (src , clrBack );
421
- clrBackB = gdImageBlue (src , clrBack );
422
- clrBackA = gdImageAlpha (src , clrBack );
423
- clrBack = gdTrueColorAlpha (clrBackR , clrBackG , clrBackB , clrBackA );
424
- }
425
- /* 2nd shear */
426
- newx = dst1 -> sx ;
427
-
428
- if (dSinE > 0.0 ) {
429
- dOffset = (src -> sx - 1 ) * dSinE ;
430
- } else {
431
- dOffset = - dSinE * (src -> sx - newx );
432
- }
433
-
434
- newy = (int ) ((double ) src -> sx * fabs ( dSinE ) + (double ) src -> sy * cos (dRadAngle ))+ 1 ;
435
-
436
- if (src -> trueColor ) {
437
- f = gdImageGetTrueColorPixel ;
438
- } else {
439
- f = gdImageGetPixel ;
440
- }
441
- dst2 = gdImageCreateTrueColor (newx , newy );
442
- if (dst2 == NULL ) {
443
- gdImageDestroy (dst1 );
444
- return NULL ;
445
- }
446
-
447
- #ifdef HAVE_GD_BUNDLED
448
- dst2 -> alphaBlendingFlag = gdEffectReplace ;
449
- #else
450
- gdImageAlphaBlending (dst2 , 0 );
451
- #endif
452
-
453
- if (ignoretransparent ) {
454
- dst2 -> transparent = dst1 -> transparent ;
455
- }
456
-
457
- for (u = 0 ; u < dst2 -> sx ; u ++ , dOffset -= dSinE ) {
458
- iShear = (int )floor (dOffset );
459
- gdImageSkewY (dst2 , dst1 , u , iShear , (dOffset - (double )iShear ), clrBack , ignoretransparent );
460
- }
461
-
462
- /* 3rd shear */
463
- gdImageDestroy (dst1 );
464
-
465
- newx = (int ) ((double )src -> sy * fabs (dSinE ) + (double )src -> sx * cos (dRadAngle )) + 1 ;
466
- newy = dst2 -> sy ;
467
-
468
- if (src -> trueColor ) {
469
- f = gdImageGetTrueColorPixel ;
470
- } else {
471
- f = gdImageGetPixel ;
472
- }
473
- dst3 = gdImageCreateTrueColor (newx , newy );
474
- if (dst3 == NULL ) {
475
- gdImageDestroy (dst2 );
476
- return NULL ;
477
- }
478
-
479
- #ifdef HAVE_GD_BUNDLED
480
- dst3 -> alphaBlendingFlag = gdEffectReplace ;
481
- #else
482
- gdImageAlphaBlending (dst3 , 0 );
483
- #endif
484
-
485
- if (ignoretransparent ) {
486
- dst3 -> transparent = dst2 -> transparent ;
487
- }
488
-
489
- if (dSinE >= 0.0 ) {
490
- dOffset = (double )(src -> sx - 1 ) * dSinE * - dTan ;
491
- } else {
492
- dOffset = dTan * ((double )(src -> sx - 1 ) * - dSinE + (double )(1 - newy ));
493
- }
494
-
495
- for (u = 0 ; u < dst3 -> sy ; u ++ , dOffset += dTan ) {
496
- int iShear = (int )floor (dOffset );
497
- gdImageSkewX (dst3 , dst2 , u , iShear , (dOffset - iShear ), clrBack , ignoretransparent );
498
- }
499
-
500
- gdImageDestroy (dst2 );
501
-
502
- return dst3 ;
503
- }
504
-
505
- gdImagePtr gdImageRotate (gdImagePtr src , double dAngle , int clrBack , int ignoretransparent )
506
- {
507
- gdImagePtr pMidImg ;
508
- gdImagePtr rotatedImg ;
509
-
510
- if (src == NULL ) {
511
- return NULL ;
512
- }
513
-
514
- if (!gdImageTrueColor (src ) && (clrBack < 0 || clrBack >=gdImageColorsTotal (src ))) {
515
- return NULL ;
516
- }
517
-
518
- while (dAngle >= 360.0 ) {
519
- dAngle -= 360.0 ;
520
- }
521
-
522
- while (dAngle < 0 ) {
523
- dAngle += 360.0 ;
524
- }
525
-
526
- if (dAngle == 90.00 ) {
527
- return gdImageRotate90 (src , ignoretransparent );
528
- }
529
- if (dAngle == 180.00 ) {
530
- return gdImageRotate180 (src , ignoretransparent );
531
- }
532
- if (dAngle == 270.00 ) {
533
- return gdImageRotate270 (src , ignoretransparent );
534
- }
535
-
536
- if ((dAngle > 45.0 ) && (dAngle <= 135.0 )) {
537
- pMidImg = gdImageRotate90 (src , ignoretransparent );
538
- dAngle -= 90.0 ;
539
- } else if ((dAngle > 135.0 ) && (dAngle <= 225.0 )) {
540
- pMidImg = gdImageRotate180 (src , ignoretransparent );
541
- dAngle -= 180.0 ;
542
- } else if ((dAngle > 225.0 ) && (dAngle <= 315.0 )) {
543
- pMidImg = gdImageRotate270 (src , ignoretransparent );
544
- dAngle -= 270.0 ;
545
- } else {
546
- return gdImageRotate45 (src , dAngle , clrBack , ignoretransparent );
547
- }
548
-
549
- if (pMidImg == NULL ) {
550
- return NULL ;
551
- }
552
-
553
- rotatedImg = gdImageRotate45 (pMidImg , dAngle , clrBack , ignoretransparent );
554
- gdImageDestroy (pMidImg );
555
-
556
- return rotatedImg ;
557
- }
558
- /* End Rotate function */
559
-
560
-
0 commit comments