1// Copyright 2011 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package jpeg
6
7import (
8	"bufio"
9	"errors"
10	"image"
11	"image/color"
12	"io"
13)
14
15// min returns the minimum of two integers.
16func min(x, y int) int {
17	if x < y {
18		return x
19	}
20	return y
21}
22
23// div returns a/b rounded to the nearest integer, instead of rounded to zero.
24func div(a, b int32) int32 {
25	if a >= 0 {
26		return (a + (b >> 1)) / b
27	}
28	return -((-a + (b >> 1)) / b)
29}
30
31// bitCount counts the number of bits needed to hold an integer.
32var bitCount = [256]byte{
33	0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
34	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
35	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
36	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
37	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
38	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
39	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
40	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
41	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
42	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
43	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
44	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
45	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
46	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
47	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
48	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
49}
50
51type quantIndex int
52
53const (
54	quantIndexLuminance quantIndex = iota
55	quantIndexChrominance
56	nQuantIndex
57)
58
59// unscaledQuant are the unscaled quantization tables in zig-zag order. Each
60// encoder copies and scales the tables according to its quality parameter.
61// The values are derived from section K.1 after converting from natural to
62// zig-zag order.
63var unscaledQuant = [nQuantIndex][blockSize]byte{
64	// Luminance.
65	{
66		16, 11, 12, 14, 12, 10, 16, 14,
67		13, 14, 18, 17, 16, 19, 24, 40,
68		26, 24, 22, 22, 24, 49, 35, 37,
69		29, 40, 58, 51, 61, 60, 57, 51,
70		56, 55, 64, 72, 92, 78, 64, 68,
71		87, 69, 55, 56, 80, 109, 81, 87,
72		95, 98, 103, 104, 103, 62, 77, 113,
73		121, 112, 100, 120, 92, 101, 103, 99,
74	},
75	// Chrominance.
76	{
77		17, 18, 18, 24, 21, 24, 47, 26,
78		26, 47, 99, 66, 56, 66, 99, 99,
79		99, 99, 99, 99, 99, 99, 99, 99,
80		99, 99, 99, 99, 99, 99, 99, 99,
81		99, 99, 99, 99, 99, 99, 99, 99,
82		99, 99, 99, 99, 99, 99, 99, 99,
83		99, 99, 99, 99, 99, 99, 99, 99,
84		99, 99, 99, 99, 99, 99, 99, 99,
85	},
86}
87
88type huffIndex int
89
90const (
91	huffIndexLuminanceDC huffIndex = iota
92	huffIndexLuminanceAC
93	huffIndexChrominanceDC
94	huffIndexChrominanceAC
95	nHuffIndex
96)
97
98// huffmanSpec specifies a Huffman encoding.
99type huffmanSpec struct {
100	// count[i] is the number of codes of length i bits.
101	count [16]byte
102	// value[i] is the decoded value of the i'th codeword.
103	value []byte
104}
105
106// theHuffmanSpec is the Huffman encoding specifications.
107// This encoder uses the same Huffman encoding for all images.
108var theHuffmanSpec = [nHuffIndex]huffmanSpec{
109	// Luminance DC.
110	{
111		[16]byte{0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
112		[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
113	},
114	// Luminance AC.
115	{
116		[16]byte{0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125},
117		[]byte{
118			0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
119			0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
120			0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
121			0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
122			0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
123			0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
124			0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
125			0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
126			0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
127			0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
128			0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
129			0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
130			0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
131			0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
132			0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
133			0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
134			0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
135			0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
136			0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
137			0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
138			0xf9, 0xfa,
139		},
140	},
141	// Chrominance DC.
142	{
143		[16]byte{0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
144		[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
145	},
146	// Chrominance AC.
147	{
148		[16]byte{0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119},
149		[]byte{
150			0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
151			0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
152			0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
153			0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
154			0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
155			0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
156			0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
157			0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
158			0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
159			0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
160			0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
161			0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
162			0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
163			0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
164			0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
165			0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
166			0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
167			0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
168			0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
169			0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
170			0xf9, 0xfa,
171		},
172	},
173}
174
175// huffmanLUT is a compiled look-up table representation of a huffmanSpec.
176// Each value maps to a uint32 of which the 8 most significant bits hold the
177// codeword size in bits and the 24 least significant bits hold the codeword.
178// The maximum codeword size is 16 bits.
179type huffmanLUT []uint32
180
181func (h *huffmanLUT) init(s huffmanSpec) {
182	maxValue := 0
183	for _, v := range s.value {
184		if int(v) > maxValue {
185			maxValue = int(v)
186		}
187	}
188	*h = make([]uint32, maxValue+1)
189	code, k := uint32(0), 0
190	for i := 0; i < len(s.count); i++ {
191		nBits := uint32(i+1) << 24
192		for j := uint8(0); j < s.count[i]; j++ {
193			(*h)[s.value[k]] = nBits | code
194			code++
195			k++
196		}
197		code <<= 1
198	}
199}
200
201// theHuffmanLUT are compiled representations of theHuffmanSpec.
202var theHuffmanLUT [4]huffmanLUT
203
204func init() {
205	for i, s := range theHuffmanSpec {
206		theHuffmanLUT[i].init(s)
207	}
208}
209
210// writer is a buffered writer.
211type writer interface {
212	Flush() error
213	io.Writer
214	io.ByteWriter
215}
216
217// encoder encodes an image to the JPEG format.
218type encoder struct {
219	// w is the writer to write to. err is the first error encountered during
220	// writing. All attempted writes after the first error become no-ops.
221	w   writer
222	err error
223	// buf is a scratch buffer.
224	buf [16]byte
225	// bits and nBits are accumulated bits to write to w.
226	bits, nBits uint32
227	// quant is the scaled quantization tables, in zig-zag order.
228	quant [nQuantIndex][blockSize]byte
229}
230
231func (e *encoder) flush() {
232	if e.err != nil {
233		return
234	}
235	e.err = e.w.Flush()
236}
237
238func (e *encoder) write(p []byte) {
239	if e.err != nil {
240		return
241	}
242	_, e.err = e.w.Write(p)
243}
244
245func (e *encoder) writeByte(b byte) {
246	if e.err != nil {
247		return
248	}
249	e.err = e.w.WriteByte(b)
250}
251
252// emit emits the least significant nBits bits of bits to the bit-stream.
253// The precondition is bits < 1<<nBits && nBits <= 16.
254func (e *encoder) emit(bits, nBits uint32) {
255	nBits += e.nBits
256	bits <<= 32 - nBits
257	bits |= e.bits
258	for nBits >= 8 {
259		b := uint8(bits >> 24)
260		e.writeByte(b)
261		if b == 0xff {
262			e.writeByte(0x00)
263		}
264		bits <<= 8
265		nBits -= 8
266	}
267	e.bits, e.nBits = bits, nBits
268}
269
270// emitHuff emits the given value with the given Huffman encoder.
271func (e *encoder) emitHuff(h huffIndex, value int32) {
272	x := theHuffmanLUT[h][value]
273	e.emit(x&(1<<24-1), x>>24)
274}
275
276// emitHuffRLE emits a run of runLength copies of value encoded with the given
277// Huffman encoder.
278func (e *encoder) emitHuffRLE(h huffIndex, runLength, value int32) {
279	a, b := value, value
280	if a < 0 {
281		a, b = -value, value-1
282	}
283	var nBits uint32
284	if a < 0x100 {
285		nBits = uint32(bitCount[a])
286	} else {
287		nBits = 8 + uint32(bitCount[a>>8])
288	}
289	e.emitHuff(h, runLength<<4|int32(nBits))
290	if nBits > 0 {
291		e.emit(uint32(b)&(1<<nBits-1), nBits)
292	}
293}
294
295// writeMarkerHeader writes the header for a marker with the given length.
296func (e *encoder) writeMarkerHeader(marker uint8, markerlen int) {
297	e.buf[0] = 0xff
298	e.buf[1] = marker
299	e.buf[2] = uint8(markerlen >> 8)
300	e.buf[3] = uint8(markerlen & 0xff)
301	e.write(e.buf[:4])
302}
303
304// writeDQT writes the Define Quantization Table marker.
305func (e *encoder) writeDQT() {
306	const markerlen = 2 + int(nQuantIndex)*(1+blockSize)
307	e.writeMarkerHeader(dqtMarker, markerlen)
308	for i := range e.quant {
309		e.writeByte(uint8(i))
310		e.write(e.quant[i][:])
311	}
312}
313
314// writeSOF0 writes the Start Of Frame (Baseline) marker.
315func (e *encoder) writeSOF0(size image.Point, nComponent int) {
316	markerlen := 8 + 3*nComponent
317	e.writeMarkerHeader(sof0Marker, markerlen)
318	e.buf[0] = 8 // 8-bit color.
319	e.buf[1] = uint8(size.Y >> 8)
320	e.buf[2] = uint8(size.Y & 0xff)
321	e.buf[3] = uint8(size.X >> 8)
322	e.buf[4] = uint8(size.X & 0xff)
323	e.buf[5] = uint8(nComponent)
324	if nComponent == 1 {
325		e.buf[6] = 1
326		// No subsampling for grayscale image.
327		e.buf[7] = 0x11
328		e.buf[8] = 0x00
329	} else {
330		for i := 0; i < nComponent; i++ {
331			e.buf[3*i+6] = uint8(i + 1)
332			// We use 4:2:0 chroma subsampling.
333			e.buf[3*i+7] = "\x22\x11\x11"[i]
334			e.buf[3*i+8] = "\x00\x01\x01"[i]
335		}
336	}
337	e.write(e.buf[:3*(nComponent-1)+9])
338}
339
340// writeDHT writes the Define Huffman Table marker.
341func (e *encoder) writeDHT(nComponent int) {
342	markerlen := 2
343	specs := theHuffmanSpec[:]
344	if nComponent == 1 {
345		// Drop the Chrominance tables.
346		specs = specs[:2]
347	}
348	for _, s := range specs {
349		markerlen += 1 + 16 + len(s.value)
350	}
351	e.writeMarkerHeader(dhtMarker, markerlen)
352	for i, s := range specs {
353		e.writeByte("\x00\x10\x01\x11"[i])
354		e.write(s.count[:])
355		e.write(s.value)
356	}
357}
358
359// writeBlock writes a block of pixel data using the given quantization table,
360// returning the post-quantized DC value of the DCT-transformed block. b is in
361// natural (not zig-zag) order.
362func (e *encoder) writeBlock(b *block, q quantIndex, prevDC int32) int32 {
363	fdct(b)
364	// Emit the DC delta.
365	dc := div(b[0], 8*int32(e.quant[q][0]))
366	e.emitHuffRLE(huffIndex(2*q+0), 0, dc-prevDC)
367	// Emit the AC components.
368	h, runLength := huffIndex(2*q+1), int32(0)
369	for zig := 1; zig < blockSize; zig++ {
370		ac := div(b[unzig[zig]], 8*int32(e.quant[q][zig]))
371		if ac == 0 {
372			runLength++
373		} else {
374			for runLength > 15 {
375				e.emitHuff(h, 0xf0)
376				runLength -= 16
377			}
378			e.emitHuffRLE(h, runLength, ac)
379			runLength = 0
380		}
381	}
382	if runLength > 0 {
383		e.emitHuff(h, 0x00)
384	}
385	return dc
386}
387
388// toYCbCr converts the 8x8 region of m whose top-left corner is p to its
389// YCbCr values.
390func toYCbCr(m image.Image, p image.Point, yBlock, cbBlock, crBlock *block) {
391	b := m.Bounds()
392	xmax := b.Max.X - 1
393	ymax := b.Max.Y - 1
394	for j := 0; j < 8; j++ {
395		for i := 0; i < 8; i++ {
396			r, g, b, _ := m.At(min(p.X+i, xmax), min(p.Y+j, ymax)).RGBA()
397			yy, cb, cr := color.RGBToYCbCr(uint8(r>>8), uint8(g>>8), uint8(b>>8))
398			yBlock[8*j+i] = int32(yy)
399			cbBlock[8*j+i] = int32(cb)
400			crBlock[8*j+i] = int32(cr)
401		}
402	}
403}
404
405// grayToY stores the 8x8 region of m whose top-left corner is p in yBlock.
406func grayToY(m *image.Gray, p image.Point, yBlock *block) {
407	b := m.Bounds()
408	xmax := b.Max.X - 1
409	ymax := b.Max.Y - 1
410	pix := m.Pix
411	for j := 0; j < 8; j++ {
412		for i := 0; i < 8; i++ {
413			idx := m.PixOffset(min(p.X+i, xmax), min(p.Y+j, ymax))
414			yBlock[8*j+i] = int32(pix[idx])
415		}
416	}
417}
418
419// rgbaToYCbCr is a specialized version of toYCbCr for image.RGBA images.
420func rgbaToYCbCr(m *image.RGBA, p image.Point, yBlock, cbBlock, crBlock *block) {
421	b := m.Bounds()
422	xmax := b.Max.X - 1
423	ymax := b.Max.Y - 1
424	for j := 0; j < 8; j++ {
425		sj := p.Y + j
426		if sj > ymax {
427			sj = ymax
428		}
429		offset := (sj-b.Min.Y)*m.Stride - b.Min.X*4
430		for i := 0; i < 8; i++ {
431			sx := p.X + i
432			if sx > xmax {
433				sx = xmax
434			}
435			pix := m.Pix[offset+sx*4:]
436			yy, cb, cr := color.RGBToYCbCr(pix[0], pix[1], pix[2])
437			yBlock[8*j+i] = int32(yy)
438			cbBlock[8*j+i] = int32(cb)
439			crBlock[8*j+i] = int32(cr)
440		}
441	}
442}
443
444// scale scales the 16x16 region represented by the 4 src blocks to the 8x8
445// dst block.
446func scale(dst *block, src *[4]block) {
447	for i := 0; i < 4; i++ {
448		dstOff := (i&2)<<4 | (i&1)<<2
449		for y := 0; y < 4; y++ {
450			for x := 0; x < 4; x++ {
451				j := 16*y + 2*x
452				sum := src[i][j] + src[i][j+1] + src[i][j+8] + src[i][j+9]
453				dst[8*y+x+dstOff] = (sum + 2) >> 2
454			}
455		}
456	}
457}
458
459// sosHeaderY is the SOS marker "\xff\xda" followed by 8 bytes:
460//	- the marker length "\x00\x08",
461//	- the number of components "\x01",
462//	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
463//	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
464//	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
465//	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
466var sosHeaderY = []byte{
467	0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x00,
468}
469
470// sosHeaderYCbCr is the SOS marker "\xff\xda" followed by 12 bytes:
471//	- the marker length "\x00\x0c",
472//	- the number of components "\x03",
473//	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
474//	- component 2 uses DC table 1 and AC table 1 "\x02\x11",
475//	- component 3 uses DC table 1 and AC table 1 "\x03\x11",
476//	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
477//	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
478//	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
479var sosHeaderYCbCr = []byte{
480	0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02,
481	0x11, 0x03, 0x11, 0x00, 0x3f, 0x00,
482}
483
484// writeSOS writes the StartOfScan marker.
485func (e *encoder) writeSOS(m image.Image) {
486	switch m.(type) {
487	case *image.Gray:
488		e.write(sosHeaderY)
489	default:
490		e.write(sosHeaderYCbCr)
491	}
492	var (
493		// Scratch buffers to hold the YCbCr values.
494		// The blocks are in natural (not zig-zag) order.
495		b      block
496		cb, cr [4]block
497		// DC components are delta-encoded.
498		prevDCY, prevDCCb, prevDCCr int32
499	)
500	bounds := m.Bounds()
501	switch m := m.(type) {
502	// TODO(wathiede): switch on m.ColorModel() instead of type.
503	case *image.Gray:
504		for y := bounds.Min.Y; y < bounds.Max.Y; y += 8 {
505			for x := bounds.Min.X; x < bounds.Max.X; x += 8 {
506				p := image.Pt(x, y)
507				grayToY(m, p, &b)
508				prevDCY = e.writeBlock(&b, 0, prevDCY)
509			}
510		}
511	default:
512		rgba, _ := m.(*image.RGBA)
513		for y := bounds.Min.Y; y < bounds.Max.Y; y += 16 {
514			for x := bounds.Min.X; x < bounds.Max.X; x += 16 {
515				for i := 0; i < 4; i++ {
516					xOff := (i & 1) * 8
517					yOff := (i & 2) * 4
518					p := image.Pt(x+xOff, y+yOff)
519					if rgba != nil {
520						rgbaToYCbCr(rgba, p, &b, &cb[i], &cr[i])
521					} else {
522						toYCbCr(m, p, &b, &cb[i], &cr[i])
523					}
524					prevDCY = e.writeBlock(&b, 0, prevDCY)
525				}
526				scale(&b, &cb)
527				prevDCCb = e.writeBlock(&b, 1, prevDCCb)
528				scale(&b, &cr)
529				prevDCCr = e.writeBlock(&b, 1, prevDCCr)
530			}
531		}
532	}
533	// Pad the last byte with 1's.
534	e.emit(0x7f, 7)
535}
536
537// DefaultQuality is the default quality encoding parameter.
538const DefaultQuality = 75
539
540// Options are the encoding parameters.
541// Quality ranges from 1 to 100 inclusive, higher is better.
542type Options struct {
543	Quality int
544}
545
546// Encode writes the Image m to w in JPEG 4:2:0 baseline format with the given
547// options. Default parameters are used if a nil *Options is passed.
548func Encode(w io.Writer, m image.Image, o *Options) error {
549	b := m.Bounds()
550	if b.Dx() >= 1<<16 || b.Dy() >= 1<<16 {
551		return errors.New("jpeg: image is too large to encode")
552	}
553	var e encoder
554	if ww, ok := w.(writer); ok {
555		e.w = ww
556	} else {
557		e.w = bufio.NewWriter(w)
558	}
559	// Clip quality to [1, 100].
560	quality := DefaultQuality
561	if o != nil {
562		quality = o.Quality
563		if quality < 1 {
564			quality = 1
565		} else if quality > 100 {
566			quality = 100
567		}
568	}
569	// Convert from a quality rating to a scaling factor.
570	var scale int
571	if quality < 50 {
572		scale = 5000 / quality
573	} else {
574		scale = 200 - quality*2
575	}
576	// Initialize the quantization tables.
577	for i := range e.quant {
578		for j := range e.quant[i] {
579			x := int(unscaledQuant[i][j])
580			x = (x*scale + 50) / 100
581			if x < 1 {
582				x = 1
583			} else if x > 255 {
584				x = 255
585			}
586			e.quant[i][j] = uint8(x)
587		}
588	}
589	// Compute number of components based on input image type.
590	nComponent := 3
591	switch m.(type) {
592	// TODO(wathiede): switch on m.ColorModel() instead of type.
593	case *image.Gray:
594		nComponent = 1
595	}
596	// Write the Start Of Image marker.
597	e.buf[0] = 0xff
598	e.buf[1] = 0xd8
599	e.write(e.buf[:2])
600	// Write the quantization tables.
601	e.writeDQT()
602	// Write the image dimensions.
603	e.writeSOF0(b.Size(), nComponent)
604	// Write the Huffman tables.
605	e.writeDHT(nComponent)
606	// Write the image data.
607	e.writeSOS(m)
608	// Write the End Of Image marker.
609	e.buf[0] = 0xff
610	e.buf[1] = 0xd9
611	e.write(e.buf[:2])
612	e.flush()
613	return e.err
614}
615