resize_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. package imaging
  2. import (
  3. "image"
  4. "testing"
  5. )
  6. func TestResize(t *testing.T) {
  7. td := []struct {
  8. desc string
  9. src image.Image
  10. w, h int
  11. f ResampleFilter
  12. want *image.NRGBA
  13. }{
  14. {
  15. "Resize 2x2 1x1 box",
  16. &image.NRGBA{
  17. Rect: image.Rect(-1, -1, 1, 1),
  18. Stride: 2 * 4,
  19. Pix: []uint8{
  20. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  21. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  22. },
  23. },
  24. 1, 1,
  25. Box,
  26. &image.NRGBA{
  27. Rect: image.Rect(0, 0, 1, 1),
  28. Stride: 1 * 4,
  29. Pix: []uint8{0x55, 0x55, 0x55, 0xc0},
  30. },
  31. },
  32. {
  33. "Resize 2x2 2x2 box",
  34. &image.NRGBA{
  35. Rect: image.Rect(-1, -1, 1, 1),
  36. Stride: 2 * 4,
  37. Pix: []uint8{
  38. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  39. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  40. },
  41. },
  42. 2, 2,
  43. Box,
  44. &image.NRGBA{
  45. Rect: image.Rect(0, 0, 2, 2),
  46. Stride: 2 * 4,
  47. Pix: []uint8{
  48. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  49. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  50. },
  51. },
  52. },
  53. {
  54. "Resize 3x1 1x1 nearest",
  55. &image.NRGBA{
  56. Rect: image.Rect(-1, -1, 2, 0),
  57. Stride: 3 * 4,
  58. Pix: []uint8{
  59. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  60. },
  61. },
  62. 1, 1,
  63. NearestNeighbor,
  64. &image.NRGBA{
  65. Rect: image.Rect(0, 0, 1, 1),
  66. Stride: 1 * 4,
  67. Pix: []uint8{0x00, 0xff, 0x00, 0xff},
  68. },
  69. },
  70. {
  71. "Resize 2x2 0x4 box",
  72. &image.NRGBA{
  73. Rect: image.Rect(-1, -1, 1, 1),
  74. Stride: 2 * 4,
  75. Pix: []uint8{
  76. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  77. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  78. },
  79. },
  80. 0, 4,
  81. Box,
  82. &image.NRGBA{
  83. Rect: image.Rect(0, 0, 4, 4),
  84. Stride: 4 * 4,
  85. Pix: []uint8{
  86. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  87. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  88. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  89. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  90. },
  91. },
  92. },
  93. {
  94. "Resize 2x2 4x0 linear",
  95. &image.NRGBA{
  96. Rect: image.Rect(-1, -1, 1, 1),
  97. Stride: 2 * 4,
  98. Pix: []uint8{
  99. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  100. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  101. },
  102. },
  103. 4, 0,
  104. Linear,
  105. &image.NRGBA{
  106. Rect: image.Rect(0, 0, 4, 4),
  107. Stride: 4 * 4,
  108. Pix: []uint8{
  109. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xff,
  110. 0x00, 0xff, 0x00, 0x3f, 0x6d, 0x6e, 0x24, 0x6f, 0xb1, 0x13, 0x3a, 0xd0, 0xc0, 0x00, 0x3f, 0xff,
  111. 0x00, 0xff, 0x00, 0xc0, 0x13, 0xb2, 0x3a, 0xcf, 0x33, 0x32, 0x9a, 0xef, 0x3f, 0x00, 0xc0, 0xff,
  112. 0x00, 0xff, 0x00, 0xff, 0x00, 0xc0, 0x3f, 0xff, 0x00, 0x3f, 0xc0, 0xff, 0x00, 0x00, 0xff, 0xff,
  113. },
  114. },
  115. },
  116. {
  117. "Resize 0x0 1x1 box",
  118. &image.NRGBA{
  119. Rect: image.Rect(-1, -1, -1, -1),
  120. Stride: 0,
  121. Pix: []uint8{},
  122. },
  123. 1, 1,
  124. Box,
  125. &image.NRGBA{},
  126. },
  127. {
  128. "Resize 2x2 0x0 box",
  129. &image.NRGBA{
  130. Rect: image.Rect(-1, -1, 1, 1),
  131. Stride: 2 * 4,
  132. Pix: []uint8{
  133. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  134. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  135. },
  136. },
  137. 0, 0,
  138. Box,
  139. &image.NRGBA{},
  140. },
  141. {
  142. "Resize 2x2 -1x0 box",
  143. &image.NRGBA{
  144. Rect: image.Rect(-1, -1, 1, 1),
  145. Stride: 2 * 4,
  146. Pix: []uint8{
  147. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  148. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  149. },
  150. },
  151. -1, 0,
  152. Box,
  153. &image.NRGBA{},
  154. },
  155. }
  156. for _, d := range td {
  157. got := Resize(d.src, d.w, d.h, d.f)
  158. want := d.want
  159. if !compareNRGBA(got, want, 1) {
  160. t.Errorf("test [%s] failed: %#v", d.desc, got)
  161. }
  162. }
  163. for i, filter := range []ResampleFilter{
  164. NearestNeighbor,
  165. Box,
  166. Linear,
  167. Hermite,
  168. MitchellNetravali,
  169. CatmullRom,
  170. BSpline,
  171. Gaussian,
  172. Lanczos,
  173. Hann,
  174. Hamming,
  175. Blackman,
  176. Bartlett,
  177. Welch,
  178. Cosine,
  179. } {
  180. src := image.NewNRGBA(image.Rect(-1, -1, 2, 3))
  181. got := Resize(src, 5, 6, filter)
  182. want := image.NewNRGBA(image.Rect(0, 0, 5, 6))
  183. if !compareNRGBA(got, want, 0) {
  184. t.Errorf("test [Resize all filters #%d] failed: %#v", i, got)
  185. }
  186. if filter.Kernel != nil {
  187. x := filter.Kernel(filter.Support + 0.0001)
  188. if x != 0 {
  189. t.Errorf("test [ResampleFilter edge cases #%d] failed: %f", i, x)
  190. }
  191. }
  192. }
  193. bcs2 := bcspline(2, 1, 0)
  194. if bcs2 != 0 {
  195. t.Errorf("test [bcspline 2] failed: %f", bcs2)
  196. }
  197. }
  198. func TestFit(t *testing.T) {
  199. td := []struct {
  200. desc string
  201. src image.Image
  202. w, h int
  203. f ResampleFilter
  204. want *image.NRGBA
  205. }{
  206. {
  207. "Fit 2x2 1x10 box",
  208. &image.NRGBA{
  209. Rect: image.Rect(-1, -1, 1, 1),
  210. Stride: 2 * 4,
  211. Pix: []uint8{
  212. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  213. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  214. },
  215. },
  216. 1, 10,
  217. Box,
  218. &image.NRGBA{
  219. Rect: image.Rect(0, 0, 1, 1),
  220. Stride: 1 * 4,
  221. Pix: []uint8{0x55, 0x55, 0x55, 0xc0},
  222. },
  223. },
  224. {
  225. "Fit 2x2 10x1 box",
  226. &image.NRGBA{
  227. Rect: image.Rect(-1, -1, 1, 1),
  228. Stride: 2 * 4,
  229. Pix: []uint8{
  230. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  231. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  232. },
  233. },
  234. 10, 1,
  235. Box,
  236. &image.NRGBA{
  237. Rect: image.Rect(0, 0, 1, 1),
  238. Stride: 1 * 4,
  239. Pix: []uint8{0x55, 0x55, 0x55, 0xc0},
  240. },
  241. },
  242. {
  243. "Fit 2x2 10x10 box",
  244. &image.NRGBA{
  245. Rect: image.Rect(-1, -1, 1, 1),
  246. Stride: 2 * 4,
  247. Pix: []uint8{
  248. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  249. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  250. },
  251. },
  252. 10, 10,
  253. Box,
  254. &image.NRGBA{
  255. Rect: image.Rect(0, 0, 2, 2),
  256. Stride: 2 * 4,
  257. Pix: []uint8{
  258. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  259. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  260. },
  261. },
  262. },
  263. {
  264. "Fit 0x0 1x1 box",
  265. &image.NRGBA{
  266. Rect: image.Rect(-1, -1, -1, -1),
  267. Stride: 0,
  268. Pix: []uint8{},
  269. },
  270. 1, 1,
  271. Box,
  272. &image.NRGBA{},
  273. },
  274. {
  275. "Fit 2x2 0x0 box",
  276. &image.NRGBA{
  277. Rect: image.Rect(-1, -1, 1, 1),
  278. Stride: 2 * 4,
  279. Pix: []uint8{
  280. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  281. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  282. },
  283. },
  284. 0, 0,
  285. Box,
  286. &image.NRGBA{},
  287. },
  288. {
  289. "Fit 2x2 -1x0 box",
  290. &image.NRGBA{
  291. Rect: image.Rect(-1, -1, 1, 1),
  292. Stride: 2 * 4,
  293. Pix: []uint8{
  294. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  295. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  296. },
  297. },
  298. -1, 0,
  299. Box,
  300. &image.NRGBA{},
  301. },
  302. }
  303. for _, d := range td {
  304. got := Fit(d.src, d.w, d.h, d.f)
  305. want := d.want
  306. if !compareNRGBA(got, want, 0) {
  307. t.Errorf("test [%s] failed: %#v", d.desc, got)
  308. }
  309. }
  310. }
  311. func TestFill(t *testing.T) {
  312. td := []struct {
  313. desc string
  314. src image.Image
  315. w, h int
  316. a Anchor
  317. f ResampleFilter
  318. want *image.NRGBA
  319. }{
  320. {
  321. "Fill 4x4 2x2 Center Nearest",
  322. &image.NRGBA{
  323. Rect: image.Rect(-1, -1, 3, 3),
  324. Stride: 4 * 4,
  325. Pix: []uint8{
  326. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  327. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  328. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  329. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  330. },
  331. },
  332. 2, 2,
  333. Center,
  334. NearestNeighbor,
  335. &image.NRGBA{
  336. Rect: image.Rect(0, 0, 2, 2),
  337. Stride: 2 * 4,
  338. Pix: []uint8{
  339. 0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d, 0x1e, 0x1f,
  340. 0x34, 0x35, 0x36, 0x37, 0x3c, 0x3d, 0x3e, 0x3f,
  341. },
  342. },
  343. },
  344. {
  345. "Fill 4x4 1x4 TopLeft Nearest",
  346. &image.NRGBA{
  347. Rect: image.Rect(-1, -1, 3, 3),
  348. Stride: 4 * 4,
  349. Pix: []uint8{
  350. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  351. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  352. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  353. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  354. },
  355. },
  356. 1, 4,
  357. TopLeft,
  358. NearestNeighbor,
  359. &image.NRGBA{
  360. Rect: image.Rect(0, 0, 1, 4),
  361. Stride: 1 * 4,
  362. Pix: []uint8{
  363. 0x00, 0x01, 0x02, 0x03,
  364. 0x10, 0x11, 0x12, 0x13,
  365. 0x20, 0x21, 0x22, 0x23,
  366. 0x30, 0x31, 0x32, 0x33,
  367. },
  368. },
  369. },
  370. {
  371. "Fill 4x4 8x2 Bottom Nearest",
  372. &image.NRGBA{
  373. Rect: image.Rect(-1, -1, 3, 3),
  374. Stride: 4 * 4,
  375. Pix: []uint8{
  376. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  377. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  378. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  379. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  380. },
  381. },
  382. 8, 2,
  383. Bottom,
  384. NearestNeighbor,
  385. &image.NRGBA{
  386. Rect: image.Rect(0, 0, 8, 2),
  387. Stride: 8 * 4,
  388. Pix: []uint8{
  389. 0x30, 0x31, 0x32, 0x33, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x3c, 0x3d, 0x3e, 0x3f,
  390. 0x30, 0x31, 0x32, 0x33, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x3c, 0x3d, 0x3e, 0x3f,
  391. },
  392. },
  393. },
  394. {
  395. "Fill 4x4 2x8 Top Nearest",
  396. &image.NRGBA{
  397. Rect: image.Rect(-1, -1, 3, 3),
  398. Stride: 4 * 4,
  399. Pix: []uint8{
  400. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  401. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  402. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  403. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  404. },
  405. },
  406. 2, 8,
  407. Top,
  408. NearestNeighbor,
  409. &image.NRGBA{
  410. Rect: image.Rect(0, 0, 2, 8),
  411. Stride: 2 * 4,
  412. Pix: []uint8{
  413. 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
  414. 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
  415. 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
  416. 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
  417. 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
  418. 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
  419. 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
  420. 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
  421. },
  422. },
  423. },
  424. {
  425. "Fill 4x4 4x4 TopRight Box",
  426. &image.NRGBA{
  427. Rect: image.Rect(-1, -1, 3, 3),
  428. Stride: 4 * 4,
  429. Pix: []uint8{
  430. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  431. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  432. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  433. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  434. },
  435. },
  436. 4, 4,
  437. TopRight,
  438. Box,
  439. &image.NRGBA{
  440. Rect: image.Rect(0, 0, 4, 4),
  441. Stride: 4 * 4,
  442. Pix: []uint8{
  443. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  444. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  445. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  446. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  447. },
  448. },
  449. },
  450. {
  451. "Fill 4x4 0x4 Left Box",
  452. &image.NRGBA{
  453. Rect: image.Rect(-1, -1, 3, 3),
  454. Stride: 4 * 4,
  455. Pix: []uint8{
  456. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  457. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
  458. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  459. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  460. },
  461. },
  462. 0, 4,
  463. Left,
  464. Box,
  465. &image.NRGBA{},
  466. },
  467. {
  468. "Fill 0x0 4x4 Right Box",
  469. &image.NRGBA{},
  470. 4, 4,
  471. Right,
  472. Box,
  473. &image.NRGBA{},
  474. },
  475. }
  476. for _, d := range td {
  477. got := Fill(d.src, d.w, d.h, d.a, d.f)
  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 TestThumbnail(t *testing.T) {
  485. td := []struct {
  486. desc string
  487. src image.Image
  488. w, h int
  489. f ResampleFilter
  490. want *image.NRGBA
  491. }{
  492. {
  493. "Thumbnail 6x2 1x1 box",
  494. &image.NRGBA{
  495. Rect: image.Rect(-1, -1, 5, 1),
  496. Stride: 6 * 4,
  497. Pix: []uint8{
  498. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  499. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  500. },
  501. },
  502. 1, 1,
  503. Box,
  504. &image.NRGBA{
  505. Rect: image.Rect(0, 0, 1, 1),
  506. Stride: 1 * 4,
  507. Pix: []uint8{0x55, 0x55, 0x55, 0xc0},
  508. },
  509. },
  510. {
  511. "Thumbnail 2x6 1x1 box",
  512. &image.NRGBA{
  513. Rect: image.Rect(-1, -1, 1, 5),
  514. Stride: 2 * 4,
  515. Pix: []uint8{
  516. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  517. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  518. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  519. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  520. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  521. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  522. },
  523. },
  524. 1, 1,
  525. Box,
  526. &image.NRGBA{
  527. Rect: image.Rect(0, 0, 1, 1),
  528. Stride: 1 * 4,
  529. Pix: []uint8{0x55, 0x55, 0x55, 0xc0},
  530. },
  531. },
  532. {
  533. "Thumbnail 1x3 2x2 box",
  534. &image.NRGBA{
  535. Rect: image.Rect(-1, -1, 0, 2),
  536. Stride: 1 * 4,
  537. Pix: []uint8{
  538. 0x00, 0x00, 0x00, 0x00,
  539. 0xff, 0x00, 0x00, 0xff,
  540. 0xff, 0xff, 0xff, 0xff,
  541. },
  542. },
  543. 2, 2,
  544. Box,
  545. &image.NRGBA{
  546. Rect: image.Rect(0, 0, 2, 2),
  547. Stride: 2 * 4,
  548. Pix: []uint8{
  549. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  550. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  551. },
  552. },
  553. },
  554. }
  555. for _, d := range td {
  556. got := Thumbnail(d.src, d.w, d.h, d.f)
  557. want := d.want
  558. if !compareNRGBA(got, want, 0) {
  559. t.Errorf("test [%s] failed: %#v", d.desc, got)
  560. }
  561. }
  562. }