transform_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. package imaging
  2. import (
  3. "image"
  4. "image/color"
  5. "testing"
  6. )
  7. func TestFlipH(t *testing.T) {
  8. td := []struct {
  9. desc string
  10. src image.Image
  11. want *image.NRGBA
  12. }{
  13. {
  14. "FlipH 2x3",
  15. &image.NRGBA{
  16. Rect: image.Rect(-1, -1, 1, 2),
  17. Stride: 2 * 4,
  18. Pix: []uint8{
  19. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  20. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  21. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  22. },
  23. },
  24. &image.NRGBA{
  25. Rect: image.Rect(0, 0, 2, 3),
  26. Stride: 2 * 4,
  27. Pix: []uint8{
  28. 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33,
  29. 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
  30. 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
  31. },
  32. },
  33. },
  34. }
  35. for _, d := range td {
  36. got := FlipH(d.src)
  37. want := d.want
  38. if !compareNRGBA(got, want, 0) {
  39. t.Errorf("test [%s] failed: %#v", d.desc, got)
  40. }
  41. }
  42. }
  43. func TestFlipV(t *testing.T) {
  44. td := []struct {
  45. desc string
  46. src image.Image
  47. want *image.NRGBA
  48. }{
  49. {
  50. "FlipV 2x3",
  51. &image.NRGBA{
  52. Rect: image.Rect(-1, -1, 1, 2),
  53. Stride: 2 * 4,
  54. Pix: []uint8{
  55. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  56. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  57. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  58. },
  59. },
  60. &image.NRGBA{
  61. Rect: image.Rect(0, 0, 2, 3),
  62. Stride: 2 * 4,
  63. Pix: []uint8{
  64. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  65. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  66. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  67. },
  68. },
  69. },
  70. }
  71. for _, d := range td {
  72. got := FlipV(d.src)
  73. want := d.want
  74. if !compareNRGBA(got, want, 0) {
  75. t.Errorf("test [%s] failed: %#v", d.desc, got)
  76. }
  77. }
  78. }
  79. func TestTranspose(t *testing.T) {
  80. td := []struct {
  81. desc string
  82. src image.Image
  83. want *image.NRGBA
  84. }{
  85. {
  86. "Transpose 2x3",
  87. &image.NRGBA{
  88. Rect: image.Rect(-1, -1, 1, 2),
  89. Stride: 2 * 4,
  90. Pix: []uint8{
  91. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  92. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  93. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  94. },
  95. },
  96. &image.NRGBA{
  97. Rect: image.Rect(0, 0, 3, 2),
  98. Stride: 3 * 4,
  99. Pix: []uint8{
  100. 0x00, 0x11, 0x22, 0x33, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
  101. 0xcc, 0xdd, 0xee, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
  102. },
  103. },
  104. },
  105. }
  106. for _, d := range td {
  107. got := Transpose(d.src)
  108. want := d.want
  109. if !compareNRGBA(got, want, 0) {
  110. t.Errorf("test [%s] failed: %#v", d.desc, got)
  111. }
  112. }
  113. }
  114. func TestTransverse(t *testing.T) {
  115. td := []struct {
  116. desc string
  117. src image.Image
  118. want *image.NRGBA
  119. }{
  120. {
  121. "Transverse 2x3",
  122. &image.NRGBA{
  123. Rect: image.Rect(-1, -1, 1, 2),
  124. Stride: 2 * 4,
  125. Pix: []uint8{
  126. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  127. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  128. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  129. },
  130. },
  131. &image.NRGBA{
  132. Rect: image.Rect(0, 0, 3, 2),
  133. Stride: 3 * 4,
  134. Pix: []uint8{
  135. 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xcc, 0xdd, 0xee, 0xff,
  136. 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x33,
  137. },
  138. },
  139. },
  140. }
  141. for _, d := range td {
  142. got := Transverse(d.src)
  143. want := d.want
  144. if !compareNRGBA(got, want, 0) {
  145. t.Errorf("test [%s] failed: %#v", d.desc, got)
  146. }
  147. }
  148. }
  149. func TestRotate90(t *testing.T) {
  150. td := []struct {
  151. desc string
  152. src image.Image
  153. want *image.NRGBA
  154. }{
  155. {
  156. "Rotate90 2x3",
  157. &image.NRGBA{
  158. Rect: image.Rect(-1, -1, 1, 2),
  159. Stride: 2 * 4,
  160. Pix: []uint8{
  161. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  162. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  163. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  164. },
  165. },
  166. &image.NRGBA{
  167. Rect: image.Rect(0, 0, 3, 2),
  168. Stride: 3 * 4,
  169. Pix: []uint8{
  170. 0xcc, 0xdd, 0xee, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
  171. 0x00, 0x11, 0x22, 0x33, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
  172. },
  173. },
  174. },
  175. }
  176. for _, d := range td {
  177. got := Rotate90(d.src)
  178. want := d.want
  179. if !compareNRGBA(got, want, 0) {
  180. t.Errorf("test [%s] failed: %#v", d.desc, got)
  181. }
  182. }
  183. }
  184. func TestRotate180(t *testing.T) {
  185. td := []struct {
  186. desc string
  187. src image.Image
  188. want *image.NRGBA
  189. }{
  190. {
  191. "Rotate180 2x3",
  192. &image.NRGBA{
  193. Rect: image.Rect(-1, -1, 1, 2),
  194. Stride: 2 * 4,
  195. Pix: []uint8{
  196. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  197. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  198. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  199. },
  200. },
  201. &image.NRGBA{
  202. Rect: image.Rect(0, 0, 2, 3),
  203. Stride: 2 * 4,
  204. Pix: []uint8{
  205. 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
  206. 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
  207. 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33,
  208. },
  209. },
  210. },
  211. }
  212. for _, d := range td {
  213. got := Rotate180(d.src)
  214. want := d.want
  215. if !compareNRGBA(got, want, 0) {
  216. t.Errorf("test [%s] failed: %#v", d.desc, got)
  217. }
  218. }
  219. }
  220. func TestRotate270(t *testing.T) {
  221. td := []struct {
  222. desc string
  223. src image.Image
  224. want *image.NRGBA
  225. }{
  226. {
  227. "Rotate270 2x3",
  228. &image.NRGBA{
  229. Rect: image.Rect(-1, -1, 1, 2),
  230. Stride: 2 * 4,
  231. Pix: []uint8{
  232. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  233. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  234. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  235. },
  236. },
  237. &image.NRGBA{
  238. Rect: image.Rect(0, 0, 3, 2),
  239. Stride: 3 * 4,
  240. Pix: []uint8{
  241. 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x33,
  242. 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xcc, 0xdd, 0xee, 0xff,
  243. },
  244. },
  245. },
  246. }
  247. for _, d := range td {
  248. got := Rotate270(d.src)
  249. want := d.want
  250. if !compareNRGBA(got, want, 0) {
  251. t.Errorf("test [%s] failed: %#v", d.desc, got)
  252. }
  253. }
  254. }
  255. func TestRotate(t *testing.T) {
  256. testCases := []struct {
  257. desc string
  258. src image.Image
  259. angle float64
  260. bg color.Color
  261. want *image.NRGBA
  262. }{
  263. {
  264. "Rotate 0",
  265. &image.NRGBA{
  266. Rect: image.Rect(-1, -1, 3, 3),
  267. Stride: 4 * 4,
  268. Pix: []uint8{
  269. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  270. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  271. 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  272. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  273. },
  274. },
  275. 0,
  276. color.Black,
  277. &image.NRGBA{
  278. Rect: image.Rect(0, 0, 4, 4),
  279. Stride: 4 * 4,
  280. Pix: []uint8{
  281. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  282. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  283. 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  284. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  285. },
  286. },
  287. },
  288. {
  289. "Rotate 90",
  290. &image.NRGBA{
  291. Rect: image.Rect(-1, -1, 3, 3),
  292. Stride: 4 * 4,
  293. Pix: []uint8{
  294. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  295. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  296. 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  297. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  298. },
  299. },
  300. 90,
  301. color.Black,
  302. &image.NRGBA{
  303. Rect: image.Rect(0, 0, 4, 4),
  304. Stride: 4 * 4,
  305. Pix: []uint8{
  306. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  307. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  308. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  309. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  310. },
  311. },
  312. },
  313. {
  314. "Rotate 180",
  315. &image.NRGBA{
  316. Rect: image.Rect(-1, -1, 3, 3),
  317. Stride: 4 * 4,
  318. Pix: []uint8{
  319. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  320. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  321. 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  322. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  323. },
  324. },
  325. 180,
  326. color.Black,
  327. &image.NRGBA{
  328. Rect: image.Rect(0, 0, 4, 4),
  329. Stride: 4 * 4,
  330. Pix: []uint8{
  331. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  332. 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  333. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  334. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  335. },
  336. },
  337. },
  338. {
  339. "Rotate 45",
  340. &image.NRGBA{
  341. Rect: image.Rect(-1, -1, 3, 3),
  342. Stride: 4 * 4,
  343. Pix: []uint8{
  344. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  345. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  346. 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  347. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  348. },
  349. },
  350. 45,
  351. color.Black,
  352. &image.NRGBA{
  353. Rect: image.Rect(0, 0, 6, 6),
  354. Stride: 6 * 4,
  355. Pix: []uint8{
  356. 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x58, 0x08, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
  357. 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0xe9, 0x16, 0x00, 0xff, 0x35, 0xca, 0x00, 0xff, 0x00, 0x30, 0x30, 0xff, 0x00, 0x00, 0x00, 0xff,
  358. 0x61, 0x00, 0x00, 0xff, 0xe9, 0x16, 0x00, 0xff, 0x35, 0xca, 0x00, 0xff, 0x00, 0x80, 0x80, 0xff, 0x35, 0x35, 0xff, 0xff, 0x58, 0x58, 0x61, 0xff,
  359. 0x58, 0x08, 0x00, 0xff, 0x35, 0xca, 0x00, 0xff, 0x00, 0x80, 0x80, 0xff, 0x35, 0x35, 0xff, 0xff, 0xe9, 0xe9, 0xff, 0xff, 0x61, 0x61, 0x61, 0xff,
  360. 0x00, 0x00, 0x00, 0xff, 0x00, 0x30, 0x30, 0xff, 0x35, 0x35, 0xff, 0xff, 0xe9, 0xe9, 0xff, 0xff, 0x61, 0x61, 0x61, 0xff, 0x00, 0x00, 0x00, 0xff,
  361. 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x58, 0x58, 0x61, 0xff, 0x61, 0x61, 0x61, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
  362. },
  363. },
  364. },
  365. {
  366. "Rotate 0x0",
  367. &image.NRGBA{
  368. Rect: image.Rect(0, 0, 0, 0),
  369. Stride: 0,
  370. Pix: []uint8{},
  371. },
  372. 123,
  373. color.Black,
  374. &image.NRGBA{
  375. Rect: image.Rect(0, 0, 0, 0),
  376. Stride: 0,
  377. Pix: []uint8{},
  378. },
  379. },
  380. {
  381. "Rotate -90",
  382. &image.NRGBA{
  383. Rect: image.Rect(-1, -1, 0, 1),
  384. Stride: 1 * 4,
  385. Pix: []uint8{
  386. 0xff, 0x00, 0x00, 0xff,
  387. 0x00, 0xff, 0x00, 0xff,
  388. },
  389. },
  390. -90,
  391. color.Black,
  392. &image.NRGBA{
  393. Rect: image.Rect(0, 0, 2, 1),
  394. Stride: 2 * 4,
  395. Pix: []uint8{
  396. 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  397. },
  398. },
  399. },
  400. {
  401. "Rotate -360*10",
  402. &image.NRGBA{
  403. Rect: image.Rect(-1, -1, 0, 1),
  404. Stride: 1 * 4,
  405. Pix: []uint8{
  406. 0x00, 0xff, 0x00, 0xff,
  407. 0xff, 0x00, 0x00, 0xff,
  408. },
  409. },
  410. -360 * 10,
  411. color.Black,
  412. &image.NRGBA{
  413. Rect: image.Rect(0, 0, 1, 2),
  414. Stride: 1 * 4,
  415. Pix: []uint8{
  416. 0x00, 0xff, 0x00, 0xff,
  417. 0xff, 0x00, 0x00, 0xff,
  418. },
  419. },
  420. },
  421. {
  422. "Rotate -360*10 + 90",
  423. &image.NRGBA{
  424. Rect: image.Rect(-1, -1, 0, 1),
  425. Stride: 1 * 4,
  426. Pix: []uint8{
  427. 0xff, 0x00, 0x00, 0xff,
  428. 0x00, 0xff, 0x00, 0xff,
  429. },
  430. },
  431. -360*10 + 90,
  432. color.Black,
  433. &image.NRGBA{
  434. Rect: image.Rect(0, 0, 2, 1),
  435. Stride: 2 * 4,
  436. Pix: []uint8{
  437. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  438. },
  439. },
  440. },
  441. {
  442. "Rotate -360*10 + 180",
  443. &image.NRGBA{
  444. Rect: image.Rect(-1, -1, 0, 1),
  445. Stride: 1 * 4,
  446. Pix: []uint8{
  447. 0xff, 0x00, 0x00, 0xff,
  448. 0x00, 0xff, 0x00, 0xff,
  449. },
  450. },
  451. -360*10 + 180,
  452. color.Black,
  453. &image.NRGBA{
  454. Rect: image.Rect(0, 0, 1, 2),
  455. Stride: 1 * 4,
  456. Pix: []uint8{
  457. 0x00, 0xff, 0x00, 0xff,
  458. 0xff, 0x00, 0x00, 0xff,
  459. },
  460. },
  461. },
  462. {
  463. "Rotate -360*10 + 270",
  464. &image.NRGBA{
  465. Rect: image.Rect(-1, -1, 0, 1),
  466. Stride: 1 * 4,
  467. Pix: []uint8{
  468. 0xff, 0x00, 0x00, 0xff,
  469. 0x00, 0xff, 0x00, 0xff,
  470. },
  471. },
  472. -360*10 + 270,
  473. color.Black,
  474. &image.NRGBA{
  475. Rect: image.Rect(0, 0, 2, 1),
  476. Stride: 2 * 4,
  477. Pix: []uint8{
  478. 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  479. },
  480. },
  481. },
  482. {
  483. "Rotate 360*10",
  484. &image.NRGBA{
  485. Rect: image.Rect(-1, -1, 0, 1),
  486. Stride: 1 * 4,
  487. Pix: []uint8{
  488. 0x00, 0xff, 0x00, 0xff,
  489. 0xff, 0x00, 0x00, 0xff,
  490. },
  491. },
  492. 360 * 10,
  493. color.Black,
  494. &image.NRGBA{
  495. Rect: image.Rect(0, 0, 1, 2),
  496. Stride: 1 * 4,
  497. Pix: []uint8{
  498. 0x00, 0xff, 0x00, 0xff,
  499. 0xff, 0x00, 0x00, 0xff,
  500. },
  501. },
  502. },
  503. {
  504. "Rotate 360*10 + 90",
  505. &image.NRGBA{
  506. Rect: image.Rect(-1, -1, 0, 1),
  507. Stride: 1 * 4,
  508. Pix: []uint8{
  509. 0xff, 0x00, 0x00, 0xff,
  510. 0x00, 0xff, 0x00, 0xff,
  511. },
  512. },
  513. 360*10 + 90,
  514. color.Black,
  515. &image.NRGBA{
  516. Rect: image.Rect(0, 0, 2, 1),
  517. Stride: 2 * 4,
  518. Pix: []uint8{
  519. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  520. },
  521. },
  522. },
  523. {
  524. "Rotate 360*10 + 180",
  525. &image.NRGBA{
  526. Rect: image.Rect(-1, -1, 0, 1),
  527. Stride: 1 * 4,
  528. Pix: []uint8{
  529. 0xff, 0x00, 0x00, 0xff,
  530. 0x00, 0xff, 0x00, 0xff,
  531. },
  532. },
  533. 360*10 + 180,
  534. color.Black,
  535. &image.NRGBA{
  536. Rect: image.Rect(0, 0, 1, 2),
  537. Stride: 1 * 4,
  538. Pix: []uint8{
  539. 0x00, 0xff, 0x00, 0xff,
  540. 0xff, 0x00, 0x00, 0xff,
  541. },
  542. },
  543. },
  544. {
  545. "Rotate 360*10 + 270",
  546. &image.NRGBA{
  547. Rect: image.Rect(-1, -1, 0, 1),
  548. Stride: 1 * 4,
  549. Pix: []uint8{
  550. 0xff, 0x00, 0x00, 0xff,
  551. 0x00, 0xff, 0x00, 0xff,
  552. },
  553. },
  554. 360*10 + 270,
  555. color.Black,
  556. &image.NRGBA{
  557. Rect: image.Rect(0, 0, 2, 1),
  558. Stride: 2 * 4,
  559. Pix: []uint8{
  560. 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  561. },
  562. },
  563. },
  564. }
  565. for _, test := range testCases {
  566. got := Rotate(test.src, test.angle, test.bg)
  567. want := test.want
  568. if !compareNRGBA(got, want, 0) {
  569. t.Errorf("test [%s] failed: %#v", test.desc, got)
  570. }
  571. }
  572. }