1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: | |
19: | |
20: | |
21: | |
22: |
|
23: |
|
24: | namespace WideImage\Operation;
|
25: |
|
26: | use WideImage\WideImage;
|
27: |
|
28: | |
29: | |
30: | |
31: | |
32: |
|
33: | class RoundCorners
|
34: | {
|
35: | |
36: | |
37: | |
38: | |
39: | |
40: | |
41: |
|
42: | public function execute($image, $radius, $color, $smoothness, $corners)
|
43: | {
|
44: | if ($smoothness < 1) {
|
45: | $sample_ratio = 1;
|
46: | } elseif ($smoothness > 16) {
|
47: | $sample_ratio = 16;
|
48: | } else {
|
49: | $sample_ratio = $smoothness;
|
50: | }
|
51: |
|
52: | $corner = WideImage::createTrueColorImage($radius * $sample_ratio, $radius * $sample_ratio);
|
53: |
|
54: | if ($color === null) {
|
55: | imagepalettecopy($corner->getHandle(), $image->getHandle());
|
56: | $bg_color = $corner->allocateColor(0, 0, 0);
|
57: |
|
58: | $corner->fill(0, 0, $bg_color);
|
59: | $fg_color = $corner->allocateColor(255, 255, 255);
|
60: | $corner->getCanvas()->filledEllipse($radius * $sample_ratio, $radius * $sample_ratio, $radius * 2 * $sample_ratio, $radius * 2 * $sample_ratio, $fg_color);
|
61: | $corner = $corner->resize($radius, $radius);
|
62: |
|
63: | $result = $image->asTrueColor();
|
64: |
|
65: | $tc = $result->getTransparentColor();
|
66: |
|
67: | if ($tc == -1) {
|
68: | $tc = $result->allocateColorAlpha(255, 255, 255, 127);
|
69: | imagecolortransparent($result->getHandle(), $tc);
|
70: | $result->setTransparentColor($tc);
|
71: | }
|
72: |
|
73: | if ($corners & WideImage::SIDE_TOP_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_TOP) {
|
74: | $result = $result->applyMask($corner, -1, -1);
|
75: | }
|
76: |
|
77: | $corner = $corner->rotate(90);
|
78: | if ($corners & WideImage::SIDE_TOP_RIGHT || $corners & WideImage::SIDE_TOP || $corners & WideImage::SIDE_RIGHT) {
|
79: | $result = $result->applyMask($corner, $result->getWidth() - $corner->getWidth() + 1, -1, 100);
|
80: | }
|
81: |
|
82: | $corner = $corner->rotate(90);
|
83: | if ($corners & WideImage::SIDE_BOTTOM_RIGHT || $corners & WideImage::SIDE_RIGHT || $corners & WideImage::SIDE_BOTTOM) {
|
84: | $result = $result->applyMask($corner, $result->getWidth() - $corner->getWidth() + 1, $result->getHeight() - $corner->getHeight() + 1, 100);
|
85: | }
|
86: |
|
87: | $corner = $corner->rotate(90);
|
88: | if ($corners & WideImage::SIDE_BOTTOM_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_BOTTOM) {
|
89: | $result = $result->applyMask($corner, -1, $result->getHeight() - $corner->getHeight() + 1, 100);
|
90: | }
|
91: |
|
92: | return $result;
|
93: | } else {
|
94: | $bg_color = $color;
|
95: |
|
96: | $corner->fill(0, 0, $bg_color);
|
97: | $fg_color = $corner->allocateColorAlpha(127, 127, 127, 127);
|
98: | $corner->getCanvas()->filledEllipse($radius * $sample_ratio, $radius * $sample_ratio, $radius * 2 * $sample_ratio, $radius * 2 * $sample_ratio, $fg_color);
|
99: | $corner = $corner->resize($radius, $radius);
|
100: |
|
101: | $result = $image->copy();
|
102: | if ($corners & WideImage::SIDE_TOP_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_TOP) {
|
103: | $result = $result->merge($corner, -1, -1, 100);
|
104: | }
|
105: |
|
106: | $corner = $corner->rotate(90);
|
107: | if ($corners & WideImage::SIDE_TOP_RIGHT || $corners & WideImage::SIDE_TOP || $corners & WideImage::SIDE_RIGHT) {
|
108: | $result = $result->merge($corner, $result->getWidth() - $corner->getWidth() + 1, -1, 100);
|
109: | }
|
110: |
|
111: | $corner = $corner->rotate(90);
|
112: | if ($corners & WideImage::SIDE_BOTTOM_RIGHT || $corners & WideImage::SIDE_RIGHT || $corners & WideImage::SIDE_BOTTOM) {
|
113: | $result = $result->merge($corner, $result->getWidth() - $corner->getWidth() + 1, $result->getHeight() - $corner->getHeight() + 1, 100);
|
114: | }
|
115: |
|
116: | $corner = $corner->rotate(90);
|
117: | if ($corners & WideImage::SIDE_BOTTOM_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_BOTTOM) {
|
118: | $result = $result->merge($corner, -1, $result->getHeight() - $corner->getHeight() + 1, 100);
|
119: | }
|
120: |
|
121: | return $result;
|
122: | }
|
123: | }
|
124: | }
|
125: | |