1package matchers
2
3var (
4	TypeJpeg = newType("jpg", "image/jpeg")
5	TypePng  = newType("png", "image/png")
6	TypeGif  = newType("gif", "image/gif")
7	TypeWebp = newType("webp", "image/webp")
8	TypeCR2  = newType("cr2", "image/x-canon-cr2")
9	TypeTiff = newType("tif", "image/tiff")
10	TypeBmp  = newType("bmp", "image/bmp")
11	TypeJxr  = newType("jxr", "image/vnd.ms-photo")
12	TypePsd  = newType("psd", "image/vnd.adobe.photoshop")
13	TypeIco  = newType("ico", "image/x-icon")
14)
15
16var Image = Map{
17	TypeJpeg: Jpeg,
18	TypePng:  Png,
19	TypeGif:  Gif,
20	TypeWebp: Webp,
21	TypeCR2:  CR2,
22	TypeTiff: Tiff,
23	TypeBmp:  Bmp,
24	TypeJxr:  Jxr,
25	TypePsd:  Psd,
26	TypeIco:  Ico,
27}
28
29func Jpeg(buf []byte) bool {
30	return len(buf) > 2 &&
31		buf[0] == 0xFF &&
32		buf[1] == 0xD8 &&
33		buf[2] == 0xFF
34}
35
36func Png(buf []byte) bool {
37	return len(buf) > 3 &&
38		buf[0] == 0x89 && buf[1] == 0x50 &&
39		buf[2] == 0x4E && buf[3] == 0x47
40}
41
42func Gif(buf []byte) bool {
43	return len(buf) > 2 &&
44		buf[0] == 0x47 && buf[1] == 0x49 && buf[2] == 0x46
45}
46
47func Webp(buf []byte) bool {
48	return len(buf) > 11 &&
49		buf[8] == 0x57 && buf[9] == 0x45 &&
50		buf[10] == 0x42 && buf[11] == 0x50
51}
52
53func CR2(buf []byte) bool {
54	return len(buf) > 9 &&
55		((buf[0] == 0x49 && buf[1] == 0x49 && buf[2] == 0x2A && buf[3] == 0x0) ||
56			(buf[0] == 0x4D && buf[1] == 0x4D && buf[2] == 0x0 && buf[3] == 0x2A)) &&
57		buf[8] == 0x43 && buf[9] == 0x52
58}
59
60func Tiff(buf []byte) bool {
61	return len(buf) > 3 &&
62		((buf[0] == 0x49 && buf[1] == 0x49 && buf[2] == 0x2A && buf[3] == 0x0) ||
63			(buf[0] == 0x4D && buf[1] == 0x4D && buf[2] == 0x0 && buf[3] == 0x2A))
64}
65
66func Bmp(buf []byte) bool {
67	return len(buf) > 1 &&
68		buf[0] == 0x42 &&
69		buf[1] == 0x4D
70}
71
72func Jxr(buf []byte) bool {
73	return len(buf) > 2 &&
74		buf[0] == 0x49 &&
75		buf[1] == 0x49 &&
76		buf[2] == 0xBC
77}
78
79func Psd(buf []byte) bool {
80	return len(buf) > 3 &&
81		buf[0] == 0x38 && buf[1] == 0x42 &&
82		buf[2] == 0x50 && buf[3] == 0x53
83}
84
85func Ico(buf []byte) bool {
86	return len(buf) > 3 &&
87		buf[0] == 0x00 && buf[1] == 0x00 &&
88		buf[2] == 0x01 && buf[3] == 0x00
89}
90