tools_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. package imaging
  2. import (
  3. "image"
  4. "testing"
  5. )
  6. func TestCrop(t *testing.T) {
  7. td := []struct {
  8. desc string
  9. src image.Image
  10. r image.Rectangle
  11. want *image.NRGBA
  12. }{
  13. {
  14. "Crop 2x3 2x1",
  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.Rect(-1, 0, 1, 1),
  25. &image.NRGBA{
  26. Rect: image.Rect(0, 0, 2, 1),
  27. Stride: 2 * 4,
  28. Pix: []uint8{
  29. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  30. },
  31. },
  32. },
  33. }
  34. for _, d := range td {
  35. got := Crop(d.src, d.r)
  36. want := d.want
  37. if !compareNRGBA(got, want, 0) {
  38. t.Errorf("test [%s] failed: %#v", d.desc, got)
  39. }
  40. }
  41. }
  42. func TestCropCenter(t *testing.T) {
  43. td := []struct {
  44. desc string
  45. src image.Image
  46. w, h int
  47. want *image.NRGBA
  48. }{
  49. {
  50. "CropCenter 2x3 2x1",
  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. 2, 1,
  61. &image.NRGBA{
  62. Rect: image.Rect(0, 0, 2, 1),
  63. Stride: 2 * 4,
  64. Pix: []uint8{
  65. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  66. },
  67. },
  68. },
  69. {
  70. "CropCenter 2x3 0x1",
  71. &image.NRGBA{
  72. Rect: image.Rect(-1, -1, 1, 2),
  73. Stride: 2 * 4,
  74. Pix: []uint8{
  75. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  76. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  77. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  78. },
  79. },
  80. 0, 1,
  81. &image.NRGBA{
  82. Rect: image.Rect(0, 0, 0, 0),
  83. Stride: 0,
  84. Pix: []uint8{},
  85. },
  86. },
  87. {
  88. "CropCenter 2x3 5x5",
  89. &image.NRGBA{
  90. Rect: image.Rect(-1, -1, 1, 2),
  91. Stride: 2 * 4,
  92. Pix: []uint8{
  93. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  94. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  95. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  96. },
  97. },
  98. 5, 5,
  99. &image.NRGBA{
  100. Rect: image.Rect(0, 0, 2, 3),
  101. Stride: 2 * 4,
  102. Pix: []uint8{
  103. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  104. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  105. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  106. },
  107. },
  108. },
  109. }
  110. for _, d := range td {
  111. got := CropCenter(d.src, d.w, d.h)
  112. want := d.want
  113. if !compareNRGBA(got, want, 0) {
  114. t.Errorf("test [%s] failed: %#v", d.desc, got)
  115. }
  116. }
  117. }
  118. func TestCropAnchor(t *testing.T) {
  119. td := []struct {
  120. desc string
  121. src image.Image
  122. w, h int
  123. anchor Anchor
  124. want *image.NRGBA
  125. }{
  126. {
  127. "CropAnchor 4x4 2x2 TopLeft",
  128. &image.NRGBA{
  129. Rect: image.Rect(-1, -1, 3, 3),
  130. Stride: 4 * 4,
  131. Pix: []uint8{
  132. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  133. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  134. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  135. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  136. },
  137. },
  138. 2, 2,
  139. TopLeft,
  140. &image.NRGBA{
  141. Rect: image.Rect(0, 0, 2, 2),
  142. Stride: 2 * 4,
  143. Pix: []uint8{
  144. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  145. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  146. },
  147. },
  148. },
  149. {
  150. "CropAnchor 4x4 2x2 Top",
  151. &image.NRGBA{
  152. Rect: image.Rect(-1, -1, 3, 3),
  153. Stride: 4 * 4,
  154. Pix: []uint8{
  155. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  156. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  157. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  158. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  159. },
  160. },
  161. 2, 2,
  162. Top,
  163. &image.NRGBA{
  164. Rect: image.Rect(0, 0, 2, 2),
  165. Stride: 2 * 4,
  166. Pix: []uint8{
  167. 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
  168. 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
  169. },
  170. },
  171. },
  172. {
  173. "CropAnchor 4x4 2x2 TopRight",
  174. &image.NRGBA{
  175. Rect: image.Rect(-1, -1, 3, 3),
  176. Stride: 4 * 4,
  177. Pix: []uint8{
  178. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  179. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  180. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  181. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  182. },
  183. },
  184. 2, 2,
  185. TopRight,
  186. &image.NRGBA{
  187. Rect: image.Rect(0, 0, 2, 2),
  188. Stride: 2 * 4,
  189. Pix: []uint8{
  190. 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  191. 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  192. },
  193. },
  194. },
  195. {
  196. "CropAnchor 4x4 2x2 Left",
  197. &image.NRGBA{
  198. Rect: image.Rect(-1, -1, 3, 3),
  199. Stride: 4 * 4,
  200. Pix: []uint8{
  201. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  202. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  203. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  204. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  205. },
  206. },
  207. 2, 2,
  208. Left,
  209. &image.NRGBA{
  210. Rect: image.Rect(0, 0, 2, 2),
  211. Stride: 2 * 4,
  212. Pix: []uint8{
  213. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  214. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  215. },
  216. },
  217. },
  218. {
  219. "CropAnchor 4x4 2x2 Center",
  220. &image.NRGBA{
  221. Rect: image.Rect(-1, -1, 3, 3),
  222. Stride: 4 * 4,
  223. Pix: []uint8{
  224. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  225. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  226. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  227. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  228. },
  229. },
  230. 2, 2,
  231. Center,
  232. &image.NRGBA{
  233. Rect: image.Rect(0, 0, 2, 2),
  234. Stride: 2 * 4,
  235. Pix: []uint8{
  236. 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
  237. 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
  238. },
  239. },
  240. },
  241. {
  242. "CropAnchor 4x4 2x2 Right",
  243. &image.NRGBA{
  244. Rect: image.Rect(-1, -1, 3, 3),
  245. Stride: 4 * 4,
  246. Pix: []uint8{
  247. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  248. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  249. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  250. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  251. },
  252. },
  253. 2, 2,
  254. Right,
  255. &image.NRGBA{
  256. Rect: image.Rect(0, 0, 2, 2),
  257. Stride: 2 * 4,
  258. Pix: []uint8{
  259. 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  260. 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  261. },
  262. },
  263. },
  264. {
  265. "CropAnchor 4x4 2x2 BottomLeft",
  266. &image.NRGBA{
  267. Rect: image.Rect(-1, -1, 3, 3),
  268. Stride: 4 * 4,
  269. Pix: []uint8{
  270. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  271. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  272. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  273. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  274. },
  275. },
  276. 2, 2,
  277. BottomLeft,
  278. &image.NRGBA{
  279. Rect: image.Rect(0, 0, 2, 2),
  280. Stride: 2 * 4,
  281. Pix: []uint8{
  282. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  283. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  284. },
  285. },
  286. },
  287. {
  288. "CropAnchor 4x4 2x2 Bottom",
  289. &image.NRGBA{
  290. Rect: image.Rect(-1, -1, 3, 3),
  291. Stride: 4 * 4,
  292. Pix: []uint8{
  293. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  294. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  295. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  296. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  297. },
  298. },
  299. 2, 2,
  300. Bottom,
  301. &image.NRGBA{
  302. Rect: image.Rect(0, 0, 2, 2),
  303. Stride: 2 * 4,
  304. Pix: []uint8{
  305. 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
  306. 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
  307. },
  308. },
  309. },
  310. {
  311. "CropAnchor 4x4 2x2 BottomRight",
  312. &image.NRGBA{
  313. Rect: image.Rect(-1, -1, 3, 3),
  314. Stride: 4 * 4,
  315. Pix: []uint8{
  316. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  317. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  318. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  319. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  320. },
  321. },
  322. 2, 2,
  323. BottomRight,
  324. &image.NRGBA{
  325. Rect: image.Rect(0, 0, 2, 2),
  326. Stride: 2 * 4,
  327. Pix: []uint8{
  328. 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  329. 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  330. },
  331. },
  332. },
  333. {
  334. "CropAnchor 4x4 0x0 BottomRight",
  335. &image.NRGBA{
  336. Rect: image.Rect(-1, -1, 3, 3),
  337. Stride: 4 * 4,
  338. Pix: []uint8{
  339. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  340. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  341. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  342. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  343. },
  344. },
  345. 0, 0,
  346. BottomRight,
  347. &image.NRGBA{
  348. Rect: image.Rect(0, 0, 0, 0),
  349. Stride: 0,
  350. Pix: []uint8{},
  351. },
  352. },
  353. {
  354. "CropAnchor 4x4 100x100 BottomRight",
  355. &image.NRGBA{
  356. Rect: image.Rect(-1, -1, 3, 3),
  357. Stride: 4 * 4,
  358. Pix: []uint8{
  359. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  360. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  361. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  362. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  363. },
  364. },
  365. 100, 100,
  366. BottomRight,
  367. &image.NRGBA{
  368. Rect: image.Rect(0, 0, 4, 4),
  369. Stride: 4 * 4,
  370. Pix: []uint8{
  371. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  372. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  373. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  374. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  375. },
  376. },
  377. },
  378. {
  379. "CropAnchor 4x4 1x100 BottomRight",
  380. &image.NRGBA{
  381. Rect: image.Rect(-1, -1, 3, 3),
  382. Stride: 4 * 4,
  383. Pix: []uint8{
  384. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  385. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  386. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  387. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  388. },
  389. },
  390. 1, 100,
  391. BottomRight,
  392. &image.NRGBA{
  393. Rect: image.Rect(0, 0, 1, 4),
  394. Stride: 1 * 4,
  395. Pix: []uint8{
  396. 0x0c, 0x0d, 0x0e, 0x0f,
  397. 0x1c, 0x1d, 0x1e, 0x1f,
  398. 0x2c, 0x2d, 0x2e, 0x2f,
  399. 0x3c, 0x3d, 0x3e, 0x3f,
  400. },
  401. },
  402. },
  403. {
  404. "CropAnchor 4x4 0x100 BottomRight",
  405. &image.NRGBA{
  406. Rect: image.Rect(-1, -1, 3, 3),
  407. Stride: 4 * 4,
  408. Pix: []uint8{
  409. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  410. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  411. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  412. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  413. },
  414. },
  415. 0, 100,
  416. BottomRight,
  417. &image.NRGBA{
  418. Rect: image.Rect(0, 0, 0, 0),
  419. Stride: 0,
  420. Pix: []uint8{},
  421. },
  422. },
  423. }
  424. for _, d := range td {
  425. got := CropAnchor(d.src, d.w, d.h, d.anchor)
  426. want := d.want
  427. if !compareNRGBA(got, want, 0) {
  428. t.Errorf("test [%s] failed: %#v", d.desc, got)
  429. }
  430. }
  431. }
  432. func TestPaste(t *testing.T) {
  433. td := []struct {
  434. desc string
  435. src1 image.Image
  436. src2 image.Image
  437. p image.Point
  438. want *image.NRGBA
  439. }{
  440. {
  441. "Paste 2x3 2x1",
  442. &image.NRGBA{
  443. Rect: image.Rect(-1, -1, 1, 2),
  444. Stride: 2 * 4,
  445. Pix: []uint8{
  446. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  447. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  448. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  449. },
  450. },
  451. &image.NRGBA{
  452. Rect: image.Rect(1, 1, 3, 2),
  453. Stride: 2 * 4,
  454. Pix: []uint8{
  455. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  456. },
  457. },
  458. image.Pt(-1, 0),
  459. &image.NRGBA{
  460. Rect: image.Rect(0, 0, 2, 3),
  461. Stride: 2 * 4,
  462. Pix: []uint8{
  463. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  464. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  465. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  466. },
  467. },
  468. },
  469. }
  470. for _, d := range td {
  471. got := Paste(d.src1, d.src2, d.p)
  472. want := d.want
  473. if !compareNRGBA(got, want, 0) {
  474. t.Errorf("test [%s] failed: %#v", d.desc, got)
  475. }
  476. }
  477. }
  478. func TestPasteCenter(t *testing.T) {
  479. td := []struct {
  480. desc string
  481. src1 image.Image
  482. src2 image.Image
  483. want *image.NRGBA
  484. }{
  485. {
  486. "PasteCenter 2x3 2x1",
  487. &image.NRGBA{
  488. Rect: image.Rect(-1, -1, 1, 2),
  489. Stride: 2 * 4,
  490. Pix: []uint8{
  491. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  492. 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
  493. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  494. },
  495. },
  496. &image.NRGBA{
  497. Rect: image.Rect(1, 1, 3, 2),
  498. Stride: 2 * 4,
  499. Pix: []uint8{
  500. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  501. },
  502. },
  503. &image.NRGBA{
  504. Rect: image.Rect(0, 0, 2, 3),
  505. Stride: 2 * 4,
  506. Pix: []uint8{
  507. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  508. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  509. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  510. },
  511. },
  512. },
  513. }
  514. for _, d := range td {
  515. got := PasteCenter(d.src1, d.src2)
  516. want := d.want
  517. if !compareNRGBA(got, want, 0) {
  518. t.Errorf("test [%s] failed: %#v", d.desc, got)
  519. }
  520. }
  521. }
  522. func TestOverlay(t *testing.T) {
  523. td := []struct {
  524. desc string
  525. src1 image.Image
  526. src2 image.Image
  527. p image.Point
  528. a float64
  529. want *image.NRGBA
  530. }{
  531. {
  532. "Overlay 2x3 2x1 1.0",
  533. &image.NRGBA{
  534. Rect: image.Rect(-1, -1, 1, 2),
  535. Stride: 2 * 4,
  536. Pix: []uint8{
  537. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  538. 0x60, 0x00, 0x90, 0xff, 0xff, 0x00, 0x99, 0x7f,
  539. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  540. },
  541. },
  542. &image.NRGBA{
  543. Rect: image.Rect(1, 1, 3, 2),
  544. Stride: 2 * 4,
  545. Pix: []uint8{
  546. 0x20, 0x40, 0x80, 0x7f, 0xaa, 0xbb, 0xcc, 0xff,
  547. },
  548. },
  549. image.Pt(-1, 0),
  550. 1.0,
  551. &image.NRGBA{
  552. Rect: image.Rect(0, 0, 2, 3),
  553. Stride: 2 * 4,
  554. Pix: []uint8{
  555. 0x00, 0x11, 0x22, 0x33, 0xcc, 0xdd, 0xee, 0xff,
  556. 0x40, 0x1f, 0x88, 0xff, 0xaa, 0xbb, 0xcc, 0xff,
  557. 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
  558. },
  559. },
  560. },
  561. {
  562. "Overlay 2x2 2x2 0.5",
  563. &image.NRGBA{
  564. Rect: image.Rect(-1, -1, 1, 1),
  565. Stride: 2 * 4,
  566. Pix: []uint8{
  567. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
  568. 0x00, 0x00, 0xff, 0xff, 0x20, 0x20, 0x20, 0x00,
  569. },
  570. },
  571. &image.NRGBA{
  572. Rect: image.Rect(-1, -1, 1, 1),
  573. Stride: 2 * 4,
  574. Pix: []uint8{
  575. 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
  576. 0xff, 0xff, 0x00, 0xff, 0x20, 0x20, 0x20, 0xff,
  577. },
  578. },
  579. image.Pt(-1, -1),
  580. 0.5,
  581. &image.NRGBA{
  582. Rect: image.Rect(0, 0, 2, 2),
  583. Stride: 2 * 4,
  584. Pix: []uint8{
  585. 0xff, 0x7f, 0x7f, 0xff, 0x00, 0xff, 0x00, 0xff,
  586. 0x7f, 0x7f, 0x7f, 0xff, 0x20, 0x20, 0x20, 0x7f,
  587. },
  588. },
  589. },
  590. }
  591. for _, d := range td {
  592. got := Overlay(d.src1, d.src2, d.p, d.a)
  593. want := d.want
  594. if !compareNRGBA(got, want, 0) {
  595. t.Errorf("test [%s] failed: %#v", d.desc, got)
  596. }
  597. }
  598. }
  599. func TestOverlayCenter(t *testing.T) {
  600. td := []struct {
  601. desc string
  602. src1 image.Image
  603. src2 image.Image
  604. a float64
  605. want *image.NRGBA
  606. }{
  607. {
  608. "OverlayCenter 2x3 2x1",
  609. &image.NRGBA{
  610. Rect: image.Rect(-1, -1, 1, 2),
  611. Stride: 2 * 4,
  612. Pix: []uint8{
  613. 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0xff,
  614. 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0xff,
  615. 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0xff,
  616. },
  617. },
  618. &image.NRGBA{
  619. Rect: image.Rect(1, 1, 3, 2),
  620. Stride: 2 * 4,
  621. Pix: []uint8{
  622. 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
  623. },
  624. },
  625. 0.5,
  626. &image.NRGBA{
  627. Rect: image.Rect(0, 0, 2, 3),
  628. Stride: 2 * 4,
  629. Pix: []uint8{
  630. 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0xff,
  631. 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
  632. 0x10, 0x10, 0x10, 0xff, 0x10, 0x10, 0x10, 0xff,
  633. },
  634. },
  635. },
  636. }
  637. for _, d := range td {
  638. got := OverlayCenter(d.src1, d.src2, 0.5)
  639. want := d.want
  640. if !compareNRGBA(got, want, 0) {
  641. t.Errorf("test [%s] failed: %#v", d.desc, got)
  642. }
  643. }
  644. }