Skip to content

Commit

Permalink
Update gradient filter
Browse files Browse the repository at this point in the history
  • Loading branch information
easylogic committed Jul 30, 2018
1 parent b76dbd9 commit 0f1db4c
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 19 deletions.
33 changes: 28 additions & 5 deletions addon/codemirror-colorpicker.js
Original file line number Diff line number Diff line change
Expand Up @@ -1217,7 +1217,7 @@ var color = {
return this.gray(this.RGBtoYCrCb(r, g, b).y);
},
brightness: function brightness(r, g, b) {
return r * 0.2126 + g * 0.7152 + b * 0.0722;
return Math.ceil(r * 0.2126 + g * 0.7152 + b * 0.0722);
},
RGBtoYCrCb: function RGBtoYCrCb(r, g, b) {

Expand All @@ -1231,7 +1231,7 @@ var color = {
var Cb = 0.564 * (b - Y);
var Cr = 0.713 * (r - Y);

return { y: Math.ceil(Y), cr: Cr, cb: Cb };
return { y: Y, cr: Cr, cb: Cb };
},
YCrCbtoRGB: function YCrCbtoRGB(y, cr, cb, bit) {

Expand Down Expand Up @@ -2242,6 +2242,9 @@ function makeFilter(filter) {

var filterFunction = F[filterName];

if (!filterFunction) {
throw new Error(filterName + ' is not filter. please check filter name.');
}
return filterFunction.apply(filterFunction, params);
}

Expand Down Expand Up @@ -2302,6 +2305,7 @@ F.multi = function () {
filters = filters.map(function (f) {
return makeFilter(f);
});

return function (bitmap) {
return filters.reduce(function (bitmap, f) {
return f(bitmap);
Expand Down Expand Up @@ -2458,6 +2462,27 @@ F.bitonal = function (darkColor, lightColor) {
});
};

F.duotone = function (gradientColor) {
var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 256;

var colors = color.gradient(gradientColor, scale).map(function (c) {
return color.parse(c);
});

return pack$1(function (pixels, i) {
var colorIndex = F.clamp(color.brightness(pixels[i], pixels[i + 1], pixels[i + 2]));
var newColorIndex = F.clamp(Math.floor(colorIndex * (scale / 256)));
var color$$1 = colors[newColorIndex];

pixels[i] = color$$1.r;
pixels[i + 1] = color$$1.g;
pixels[i + 2] = color$$1.b;
pixels[i + 3] = F.clamp(Math.floor(color$$1.a * 256));
});
};

F.gradient = F.duotone;

F.tint = function () {
var redTint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
var greenTint = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
Expand All @@ -2471,9 +2496,7 @@ F.tint = function () {
};

F.clamp = function (num) {
if (num < 0) return 0;
if (num > 255) return 255;
return num;
return Math.min(255, num);
};
/**
*
Expand Down
33 changes: 28 additions & 5 deletions dist/codemirror-colorpicker.js
Original file line number Diff line number Diff line change
Expand Up @@ -1219,7 +1219,7 @@ var color = {
return this.gray(this.RGBtoYCrCb(r, g, b).y);
},
brightness: function brightness(r, g, b) {
return r * 0.2126 + g * 0.7152 + b * 0.0722;
return Math.ceil(r * 0.2126 + g * 0.7152 + b * 0.0722);
},
RGBtoYCrCb: function RGBtoYCrCb(r, g, b) {

Expand All @@ -1233,7 +1233,7 @@ var color = {
var Cb = 0.564 * (b - Y);
var Cr = 0.713 * (r - Y);

return { y: Math.ceil(Y), cr: Cr, cb: Cb };
return { y: Y, cr: Cr, cb: Cb };
},
YCrCbtoRGB: function YCrCbtoRGB(y, cr, cb, bit) {

Expand Down Expand Up @@ -2244,6 +2244,9 @@ function makeFilter(filter) {

var filterFunction = F[filterName];

if (!filterFunction) {
throw new Error(filterName + ' is not filter. please check filter name.');
}
return filterFunction.apply(filterFunction, params);
}

Expand Down Expand Up @@ -2304,6 +2307,7 @@ F.multi = function () {
filters = filters.map(function (f) {
return makeFilter(f);
});

return function (bitmap) {
return filters.reduce(function (bitmap, f) {
return f(bitmap);
Expand Down Expand Up @@ -2460,6 +2464,27 @@ F.bitonal = function (darkColor, lightColor) {
});
};

F.duotone = function (gradientColor) {
var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 256;

var colors = color.gradient(gradientColor, scale).map(function (c) {
return color.parse(c);
});

return pack$1(function (pixels, i) {
var colorIndex = F.clamp(color.brightness(pixels[i], pixels[i + 1], pixels[i + 2]));
var newColorIndex = F.clamp(Math.floor(colorIndex * (scale / 256)));
var color$$1 = colors[newColorIndex];

pixels[i] = color$$1.r;
pixels[i + 1] = color$$1.g;
pixels[i + 2] = color$$1.b;
pixels[i + 3] = F.clamp(Math.floor(color$$1.a * 256));
});
};

F.gradient = F.duotone;

F.tint = function () {
var redTint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
var greenTint = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
Expand All @@ -2473,9 +2498,7 @@ F.tint = function () {
};

F.clamp = function (num) {
if (num < 0) return 0;
if (num > 255) return 255;
return num;
return Math.min(255, num);
};
/**
*
Expand Down
2 changes: 1 addition & 1 deletion dist/codemirror-colorpicker.min.js

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -660,6 +660,12 @@ <h1> Image Filter </h1>
<div>
<button type="button" onclick="view_histogram()">Histogram</button>
</div>
<div>
<button type="button" onclick="filter_image(['gradient', 'black, yellow'])">duotone(red, yellow)</button>
</div>
<div>
<button type="button" onclick="filter_image(['gradient', 'black, white', 2])">duotone(black, white)</button>
</div>
<div>
<button type="button" onclick="filter_image(['grayscale', +document.getElementById('scale-value').value])">Gray</button>
<input type="range" min="0" max="200" step="1" value="100" id="scale-value" />
Expand Down Expand Up @@ -955,6 +961,8 @@ <h1 class="title">Default Html Sample </h1>
var ImageFilter = CodeMirrorColorPicker.ImageFilter;
document.getElementById('sampled-image').src = URL.createObjectURL(file);

console.log(args);

Color.ImageToURL(file, ImageFilter.merge(args), function (url) {
document.getElementById('filtered-image').src = url;
})
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "codemirror-colorpicker",
"version": "1.7.16",
"version": "1.7.17",
"description": "colorpicker for codemirror",
"main": "./dist/codemirror-colorpicker.js",
"scripts": {
Expand Down
4 changes: 2 additions & 2 deletions src/util/Color.js
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ const color = {
return this.gray(this.RGBtoYCrCb(r, g, b).y);
},
brightness(r, g, b) {
return r * 0.2126 + g * 0.7152 + b * 0.0722;
return Math.ceil(r * 0.2126 + g * 0.7152 + b * 0.0722);
},
RGBtoYCrCb(r, g, b) {

Expand All @@ -532,7 +532,7 @@ const color = {
const Cb = 0.564 * (b - Y)
const Cr = 0.713 * (r - Y)

return { y: Math.ceil(Y), cr: Cr, cb: Cb };
return { y: Y, cr: Cr, cb: Cb };
},
YCrCbtoRGB(y, cr, cb, bit) {

Expand Down
29 changes: 24 additions & 5 deletions src/util/ImageFilter.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ function makeFilter(filter) {

const filterFunction = F[filterName];

if (!filterFunction) {
throw new Error(`${filterName} is not filter. please check filter name.`)
}
return filterFunction.apply(filterFunction, params);
}

Expand Down Expand Up @@ -89,11 +92,9 @@ function putBitmap(bitmap, subBitmap, area) {
return Canvas.putBitmap(bitmap, subBitmap, area);
}


let F = {};
let ImageFilter = F


/**
*
* multiply filters
Expand All @@ -105,6 +106,7 @@ F.multi = function (...filters) {
filters = filters.map(f => {
return makeFilter(f);
})

return function (bitmap) {
return filters.reduce((bitmap, f) => {
return f(bitmap);
Expand Down Expand Up @@ -247,9 +249,28 @@ F.bitonal = function (darkColor, lightColor, threshold = 100) {
pixels[i + 2] = lightColor.b;
}
})
}


F.duotone = function (gradientColor, scale = 256) {
let colors = Color.gradient(gradientColor, scale).map(c => {
return Color.parse(c)
})

return pack((pixels, i) => {
const colorIndex = F.clamp(Color.brightness(pixels[i] , pixels[i + 1] , pixels[i + 2]))
const newColorIndex = F.clamp(Math.floor(colorIndex * (scale / 256)))
const color = colors[newColorIndex]

pixels[i] = color.r;
pixels[i + 1] = color.g;
pixels[i + 2] = color.b;
pixels[i + 3] = F.clamp(Math.floor(color.a * 256));
})
}

F.gradient = F.duotone;

F.tint = function (redTint = 1, greenTint = 1, blueTint = 1) {
return pack((pixels, i) => {
pixels[i] += (255 - pixels[i]) * redTint;
Expand All @@ -260,9 +281,7 @@ F.tint = function (redTint = 1, greenTint = 1, blueTint = 1) {
}

F.clamp = function (num) {
if (num < 0) return 0
if (num > 255) return 255
return num
return Math.min(255, num)
}
/**
*
Expand Down

0 comments on commit 0f1db4c

Please sign in to comment.