Skip to content

Commit 731989e

Browse files
thenickdudezbjornson
authored andcommitted
Support disabling chroma subsampling (#1092)
1 parent 77140fd commit 731989e

File tree

5 files changed

+17
-5
lines changed

5 files changed

+17
-5
lines changed

Readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ var stream = canvas.jpegStream({
171171
bufsize: 4096 // output buffer size in bytes, default: 4096
172172
, quality: 75 // JPEG quality (0-100) default: 75
173173
, progressive: false // true for progressive compression, default: false
174+
, disableChromaSubsampling: false // true to disable 2x2 subsampling of the chroma components, default: false
174175
});
175176
```
176177

lib/canvas.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ Canvas.prototype.createJPEGStream = function(options){
9494
bufsize: clampedBufSize
9595
, quality: options.quality || 75
9696
, progressive: options.progressive || false
97+
, chromaHSampFactor: options.disableChromaSubsampling ? 1 : 2
98+
, chromaVSampFactor: options.disableChromaSubsampling ? 1 : 2
9799
});
98100
};
99101

lib/jpegstream.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ JPEGStream.prototype._read = function _read() {
5454
var bufsize = this.options.bufsize;
5555
var quality = this.options.quality;
5656
var progressive = this.options.progressive;
57-
self.canvas.streamJPEGSync(bufsize, quality, progressive, function(err, chunk){
57+
var chromaHSampFactor = this.options.chromaHSampFactor;
58+
var chromaVSampFactor = this.options.chromaVSampFactor;
59+
self.canvas.streamJPEGSync(bufsize, quality, progressive, chromaHSampFactor, chromaVSampFactor, function(err, chunk){
5860
if (err) {
5961
self.emit('error', err);
6062
} else if (chunk) {

src/Canvas.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -568,15 +568,19 @@ NAN_METHOD(Canvas::StreamJPEGSync) {
568568
return Nan::ThrowTypeError("quality setting required");
569569
if (!info[2]->IsBoolean())
570570
return Nan::ThrowTypeError("progressive setting required");
571-
if (!info[3]->IsFunction())
571+
if (!info[3]->IsNumber())
572+
return Nan::ThrowTypeError("chromaHSampFactor required");
573+
if (!info[4]->IsNumber())
574+
return Nan::ThrowTypeError("chromaVSampFactor required");
575+
if (!info[5]->IsFunction())
572576
return Nan::ThrowTypeError("callback function required");
573577

574578
Canvas *canvas = Nan::ObjectWrap::Unwrap<Canvas>(info.This());
575579
closure_t closure;
576-
closure.fn = Local<Function>::Cast(info[3]);
580+
closure.fn = Local<Function>::Cast(info[5]);
577581

578582
Nan::TryCatch try_catch;
579-
write_to_jpeg_stream(canvas->surface(), info[0]->NumberValue(), info[1]->NumberValue(), info[2]->BooleanValue(), &closure);
583+
write_to_jpeg_stream(canvas->surface(), info[0]->NumberValue(), info[1]->NumberValue(), info[2]->BooleanValue(), info[3]->NumberValue(), info[4]->NumberValue(), &closure);
580584

581585
if (try_catch.HasCaught()) {
582586
try_catch.ReThrow();

src/JPEGStream.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ jpeg_closure_dest(j_compress_ptr cinfo, closure_t * closure, int bufsize){
101101
}
102102

103103
void
104-
write_to_jpeg_stream(cairo_surface_t *surface, int bufsize, int quality, bool progressive, closure_t *closure){
104+
write_to_jpeg_stream(cairo_surface_t *surface, int bufsize, int quality, bool progressive, int chromaHSampFactor, int chromaVSampFactor, closure_t *closure){
105105
int w = cairo_image_surface_get_width(surface);
106106
int h = cairo_image_surface_get_height(surface);
107107
struct jpeg_compress_struct cinfo;
@@ -118,6 +118,9 @@ write_to_jpeg_stream(cairo_surface_t *surface, int bufsize, int quality, bool pr
118118
if (progressive)
119119
jpeg_simple_progression(&cinfo);
120120
jpeg_set_quality(&cinfo, quality, (quality<25)?0:1);
121+
cinfo.comp_info[0].h_samp_factor = chromaHSampFactor;
122+
cinfo.comp_info[0].v_samp_factor = chromaVSampFactor;
123+
121124
jpeg_closure_dest(&cinfo, closure, bufsize);
122125

123126
jpeg_start_compress(&cinfo, TRUE);

0 commit comments

Comments
 (0)