OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 'use strict'; | |
6 | |
7 /** | |
8 * The base class for simple filters that only modify the image content | |
9 * but do not modify the image dimensions. | |
10 * @constructor | |
11 * @extends ImageEditor.Mode | |
12 */ | |
13 ImageEditor.Mode.Adjust = function() { | |
14 ImageEditor.Mode.apply(this, arguments); | |
15 this.implicitCommit = true; | |
16 this.doneMessage_ = null; | |
17 this.viewportGeneration_ = 0; | |
18 }; | |
19 | |
20 ImageEditor.Mode.Adjust.prototype = {__proto__: ImageEditor.Mode.prototype}; | |
21 | |
22 /** @override */ | |
23 ImageEditor.Mode.Adjust.prototype.getCommand = function() { | |
24 if (!this.filter_) return null; | |
25 | |
26 return new Command.Filter(this.name, this.filter_, this.doneMessage_); | |
27 }; | |
28 | |
29 /** @override */ | |
30 ImageEditor.Mode.Adjust.prototype.cleanUpUI = function() { | |
31 ImageEditor.Mode.prototype.cleanUpUI.apply(this, arguments); | |
32 this.hidePreview(); | |
33 }; | |
34 | |
35 /** | |
36 * TODO(JSDOC) | |
37 */ | |
38 ImageEditor.Mode.Adjust.prototype.hidePreview = function() { | |
39 if (this.canvas_) { | |
40 this.canvas_.parentNode.removeChild(this.canvas_); | |
41 this.canvas_ = null; | |
42 } | |
43 }; | |
44 | |
45 /** | |
46 * TODO(JSDOC) | |
47 */ | |
48 ImageEditor.Mode.Adjust.prototype.cleanUpCaches = function() { | |
49 this.filter_ = null; | |
50 this.previewImageData_ = null; | |
51 }; | |
52 | |
53 /** | |
54 * TODO(JSDOC) | |
55 */ | |
56 ImageEditor.Mode.Adjust.prototype.reset = function() { | |
57 ImageEditor.Mode.prototype.reset.call(this); | |
58 this.hidePreview(); | |
59 this.cleanUpCaches(); | |
60 }; | |
61 | |
62 /** | |
63 * TODO(JSDOC) | |
64 * @param {Object} options // TODO(JSDOC). | |
65 */ | |
66 ImageEditor.Mode.Adjust.prototype.update = function(options) { | |
67 ImageEditor.Mode.prototype.update.apply(this, arguments); | |
68 | |
69 // We assume filter names are used in the UI directly. | |
70 // This will have to change with i18n. | |
71 this.filter_ = this.createFilter(options); | |
72 this.updatePreviewImage(); | |
73 ImageUtil.trace.resetTimer('preview'); | |
74 this.filter_(this.previewImageData_, this.originalImageData, 0, 0); | |
75 ImageUtil.trace.reportTimer('preview'); | |
76 this.canvas_.getContext('2d').putImageData( | |
77 this.previewImageData_, 0, 0); | |
78 }; | |
79 | |
80 /** | |
81 * Copy the source image data for the preview. | |
82 * Use the cached copy if the viewport has not changed. | |
83 */ | |
84 ImageEditor.Mode.Adjust.prototype.updatePreviewImage = function() { | |
85 if (!this.previewImageData_ || | |
86 this.viewportGeneration_ != this.getViewport().getCacheGeneration()) { | |
87 this.viewportGeneration_ = this.getViewport().getCacheGeneration(); | |
88 | |
89 if (!this.canvas_) { | |
90 this.canvas_ = this.getImageView().createOverlayCanvas(); | |
91 } | |
92 | |
93 this.getImageView().setupDeviceBuffer(this.canvas_); | |
94 | |
95 this.originalImageData = this.getImageView().copyScreenImageData(); | |
96 this.previewImageData_ = this.getImageView().copyScreenImageData(); | |
97 } | |
98 }; | |
99 | |
100 /* | |
101 * Own methods | |
102 */ | |
103 | |
104 /** | |
105 * TODO(JSDOC) | |
106 * @param {Object} options // TODO(JSDOC). | |
107 * @return {function(ImageData,ImageData,number,number)} Created function. | |
108 */ | |
109 ImageEditor.Mode.Adjust.prototype.createFilter = function(options) { | |
110 return filter.create(this.name, options); | |
111 }; | |
112 | |
113 /** | |
114 * A base class for color filters that are scale independent. | |
115 * @constructor | |
116 */ | |
117 ImageEditor.Mode.ColorFilter = function() { | |
118 ImageEditor.Mode.Adjust.apply(this, arguments); | |
119 }; | |
120 | |
121 ImageEditor.Mode.ColorFilter.prototype = | |
122 {__proto__: ImageEditor.Mode.Adjust.prototype}; | |
123 | |
124 /** | |
125 * TODO(JSDOC) | |
126 * @return {{r: Array.<number>, g: Array.<number>, b: Array.<number>}} | |
127 * histogram. | |
128 */ | |
129 ImageEditor.Mode.ColorFilter.prototype.getHistogram = function() { | |
130 return filter.getHistogram(this.getImageView().getThumbnail()); | |
131 }; | |
132 | |
133 /** | |
134 * Exposure/contrast filter. | |
135 * @constructor | |
136 */ | |
137 ImageEditor.Mode.Exposure = function() { | |
138 ImageEditor.Mode.ColorFilter.call(this, 'exposure', 'GALLERY_EXPOSURE'); | |
139 }; | |
140 | |
141 ImageEditor.Mode.Exposure.prototype = | |
142 {__proto__: ImageEditor.Mode.ColorFilter.prototype}; | |
143 | |
144 /** | |
145 * TODO(JSDOC) | |
146 * @param {ImageEditor.Toolbar} toolbar The toolbar to populate. | |
147 */ | |
148 ImageEditor.Mode.Exposure.prototype.createTools = function(toolbar) { | |
149 toolbar.addRange('brightness', 'GALLERY_BRIGHTNESS', -1, 0, 1, 100); | |
150 toolbar.addRange('contrast', 'GALLERY_CONTRAST', -1, 0, 1, 100); | |
151 }; | |
152 | |
153 /** | |
154 * Autofix. | |
155 * @constructor | |
156 */ | |
157 ImageEditor.Mode.Autofix = function() { | |
158 ImageEditor.Mode.ColorFilter.call(this, 'autofix', 'GALLERY_AUTOFIX'); | |
159 this.doneMessage_ = 'fixed'; | |
160 }; | |
161 | |
162 ImageEditor.Mode.Autofix.prototype = | |
163 {__proto__: ImageEditor.Mode.ColorFilter.prototype}; | |
164 | |
165 /** | |
166 * TODO(JSDOC) | |
167 * @param {ImageEditor.Toolbar} toolbar The toolbar to populate. | |
168 */ | |
169 ImageEditor.Mode.Autofix.prototype.createTools = function(toolbar) { | |
170 var self = this; | |
171 toolbar.addButton('Apply', this.apply.bind(this)); | |
172 }; | |
173 | |
174 /** | |
175 * TODO(JSDOC) | |
176 * @return {boolean} // TODO(JSDOC). | |
177 */ | |
178 ImageEditor.Mode.Autofix.prototype.isApplicable = function() { | |
179 return this.getImageView().hasValidImage() && | |
180 filter.autofix.isApplicable(this.getHistogram()); | |
181 }; | |
182 | |
183 /** | |
184 * TODO(JSDOC) | |
185 */ | |
186 ImageEditor.Mode.Autofix.prototype.apply = function() { | |
187 this.update({histogram: this.getHistogram()}); | |
188 }; | |
189 | |
190 /** | |
191 * Instant Autofix. | |
192 * @constructor | |
193 */ | |
194 ImageEditor.Mode.InstantAutofix = function() { | |
195 ImageEditor.Mode.Autofix.apply(this, arguments); | |
196 this.instant = true; | |
197 }; | |
198 | |
199 ImageEditor.Mode.InstantAutofix.prototype = | |
200 {__proto__: ImageEditor.Mode.Autofix.prototype}; | |
201 | |
202 /** | |
203 * TODO(JSDOC) | |
204 */ | |
205 ImageEditor.Mode.InstantAutofix.prototype.setUp = function() { | |
206 ImageEditor.Mode.Autofix.prototype.setUp.apply(this, arguments); | |
207 this.apply(); | |
208 }; | |
209 | |
210 /** | |
211 * Blur filter. | |
212 * @constructor | |
213 */ | |
214 ImageEditor.Mode.Blur = function() { | |
215 ImageEditor.Mode.Adjust.call(this, 'blur'); | |
216 }; | |
217 | |
218 ImageEditor.Mode.Blur.prototype = | |
219 {__proto__: ImageEditor.Mode.Adjust.prototype}; | |
220 | |
221 /** | |
222 * TODO(JSDOC) | |
223 * @param {ImageEditor.Toolbar} toolbar The toolbar to populate. | |
224 */ | |
225 ImageEditor.Mode.Blur.prototype.createTools = function(toolbar) { | |
226 toolbar.addRange('strength', 'GALLERY_STRENGTH', 0, 0, 1, 100); | |
227 toolbar.addRange('radius', 'GALLERY_RADIUS', 1, 1, 3); | |
228 }; | |
229 | |
230 /** | |
231 * Sharpen filter. | |
232 * @constructor | |
233 */ | |
234 ImageEditor.Mode.Sharpen = function() { | |
235 ImageEditor.Mode.Adjust.call(this, 'sharpen'); | |
236 }; | |
237 | |
238 ImageEditor.Mode.Sharpen.prototype = | |
239 {__proto__: ImageEditor.Mode.Adjust.prototype}; | |
240 | |
241 /** | |
242 * TODO(JSDOC) | |
243 * @param {ImageEditor.Toolbar} toolbar The toolbar to populate. | |
244 */ | |
245 ImageEditor.Mode.Sharpen.prototype.createTools = function(toolbar) { | |
246 toolbar.addRange('strength', 'GALLERY_STRENGTH', 0, 0, 1, 100); | |
247 toolbar.addRange('radius', 'GALLERY_RADIUS', 1, 1, 3); | |
248 }; | |
OLD | NEW |