tools_test.go 18 KB

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