WinGui: Fix another instance of the Caliburn vs Json.net sillyness where objects...
[HandBrake.git] / macosx / HBFilters.m
blob7c672f0563c8d9764fea3d8367332a8482080710
1 /*  HBFilters.m $
3  This file is part of the HandBrake source code.
4  Homepage: <http://handbrake.fr/>.
5  It may be used under the terms of the GNU General Public License. */
7 #import "HBFilters.h"
8 #import "HBCodingUtilities.h"
9 #include "hb.h"
11 NSString * const HBFiltersChangedNotification = @"HBFiltersChangedNotification";
13 @interface HBFilters ()
15 @property (nonatomic, readwrite, getter=areNotificationsEnabled) BOOL notificationsEnabled;
17 @end
19 @implementation HBFilters
21 - (instancetype)init
23     self = [super init];
24     if (self)
25     {
26         _detelecine = @"off";
27         _detelecineCustomString = @"";
28         _deinterlace = @"off";
29         _deinterlaceCustomString = @"";
30         _decomb = @"off";
31         _decombCustomString = @"";
32         _denoise = @"off";
33         _denoiseCustomString = @"";
34         _denoisePreset = @"medium";
35         _denoiseTune = @"none";
37         _notificationsEnabled = YES;
38     }
39     return self;
42 - (void)postChangedNotification
44     if (self.areNotificationsEnabled)
45     {
46         [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName:HBFiltersChangedNotification
47                                                                                               object:self
48                                                                                             userInfo:nil]];
49     }
52 #pragma mark - Setters
54 - (void)setDetelecine:(NSString *)detelecine
56     if (detelecine)
57     {
58         _detelecine = [detelecine copy];
59     }
60     else
61     {
62         _detelecine = @"off";
63     }
64     [self postChangedNotification];
67 // Override setter to avoid nil values.
68 - (void)setDetelecineCustomString:(NSString *)detelecineCustomString
70     if (detelecineCustomString)
71     {
72         _detelecineCustomString = [detelecineCustomString copy];
73     }
74     else
75     {
76         _detelecineCustomString = @"";
77     }
79     [self postChangedNotification];
82 - (void)setDeinterlace:(NSString *)deinterlace
84     if (deinterlace)
85     {
86         _deinterlace = [deinterlace copy];
87     }
88     else
89     {
90         _deinterlace = @"off";
91     }
92     [self postChangedNotification];
95 - (void)setDeinterlaceCustomString:(NSString *)deinterlaceCustomString
97     if (deinterlaceCustomString)
98     {
99         _deinterlaceCustomString = [deinterlaceCustomString copy];
100     }
101     else
102     {
103         _deinterlaceCustomString = @"";
104     }
106     [self postChangedNotification];
109 - (void)setDecomb:(NSString *)decomb
111     if (decomb)
112     {
113         _decomb = [decomb copy];
114     }
115     else
116     {
117         _decomb = @"off";
118     }
119     [self postChangedNotification];
122 - (void)setDecombCustomString:(NSString *)decombCustomString
124     if (decombCustomString)
125     {
126         _decombCustomString = [decombCustomString copy];
127     }
128     else
129     {
130         _decombCustomString = @"";
131     }
133     [self postChangedNotification];
136 - (void)setDenoise:(NSString *)denoise
138     if (denoise)
139     {
140         _denoise = [denoise copy];
141     }
142     else
143     {
144         _denoise = @"";
145     }
147     [self postChangedNotification];
150 - (void)setDenoisePreset:(NSString *)denoisePreset
152     if (denoisePreset)
153     {
154         _denoisePreset = [denoisePreset copy];
155     }
156     else
157     {
158         _denoisePreset = @"medium";
159     }
161     [self postChangedNotification];
164 - (void)setDenoiseTune:(NSString *)denoiseTune
166     if (denoiseTune)
167     {
168         _denoiseTune = [denoiseTune copy];
169     }
170     else
171     {
172         _denoiseTune = @"none";
173     }
175     [self postChangedNotification];
178 - (void)setDenoiseCustomString:(NSString *)denoiseCustomString
180     if (denoiseCustomString)
181     {
182         _denoiseCustomString = [denoiseCustomString copy];
183     }
184     else
185     {
186         _denoiseCustomString = @"";
187     }
189     [self postChangedNotification];
192 - (void)setDeblock:(int)deblock
194     _deblock = deblock;
195     [self postChangedNotification];
198 - (void)setGrayscale:(BOOL)grayscale
200     _grayscale = grayscale;
201     [self postChangedNotification];
204 - (void)setUseDecomb:(BOOL)useDecomb
206     _useDecomb = useDecomb;
207     [self postChangedNotification];
210 + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
212     NSSet *retval = nil;
214     if ([key isEqualToString:@"summary"])
215     {
216         retval = [NSSet setWithObjects:@"detelecine", @"detelecineCustomString", @"useDecomb", @"deinterlace", @"deinterlaceCustomString", @"decomb", @"decombCustomString", @"denoise", @"denoisePreset", @"denoiseTune", @"denoiseCustomString", @"deblock", @"grayscale", nil];
217     }
218     if ([key isEqualToString:@"customDetelecineSelected"] ||
219         [key isEqualToString:@"customDecombSelected"] ||
220         [key isEqualToString:@"customDeinterlaceSelected"])
221     {
222         retval = [NSSet setWithObjects:@"detelecine", @"decomb", @"deinterlace", @"useDecomb", nil];
223     }
224     if ([key isEqualToString:@"denoiseTunesAvailable"] ||
225         [key isEqualToString:@"customDenoiseSelected"])
226     {
227         retval = [NSSet setWithObjects:@"denoise", @"denoisePreset", nil];
228     }
229     if ([key isEqualToString:@"denoiseEnabled"])
230     {
231         retval = [NSSet setWithObject:@"denoise"];
232     }
233     if ([key isEqualToString:@"deblockSummary"])
234     {
235         retval = [NSSet setWithObject:@"deblock"];
236     }
237     return retval;
241 #pragma mark - NSCopying
243 - (instancetype)copyWithZone:(NSZone *)zone
245     HBFilters *copy = [[[self class] alloc] init];
247     if (copy)
248     {
249         copy->_detelecine = [_detelecine copy];
250         copy->_detelecineCustomString = [_detelecineCustomString copy];
252         copy->_deinterlace = [_deinterlace copy];
253         copy->_deinterlaceCustomString = [_deinterlaceCustomString copy];
255         copy->_decomb = [_decomb copy];
256         copy->_decombCustomString = [_decombCustomString copy];
258         copy->_denoise = [_denoise copy];
259         copy->_denoisePreset = [_denoisePreset copy];
260         copy->_denoiseTune = [_denoiseTune copy];
261         copy->_denoiseCustomString = [_denoiseCustomString copy];
263         copy->_deblock = _deblock;
264         copy->_grayscale = _grayscale;
266         copy->_useDecomb = _useDecomb;
267     }
269     return copy;
272 #pragma mark - NSCoding
274 + (BOOL)supportsSecureCoding
276     return YES;
279 - (void)encodeWithCoder:(NSCoder *)coder
281     [coder encodeInt:1 forKey:@"HBFiltersVersion"];
283     encodeObject(_detelecine);
284     encodeObject(_detelecineCustomString);
286     encodeObject(_deinterlace);
287     encodeObject(_deinterlaceCustomString);
289     encodeObject(_decomb);
290     encodeObject(_decombCustomString);
292     encodeObject(_denoise);
293     encodeObject(_denoisePreset);
294     encodeObject(_denoiseTune);
295     encodeObject(_denoiseCustomString);
297     encodeInt(_deblock);
298     encodeBool(_grayscale);
300     encodeBool(_useDecomb);
303 - (instancetype)initWithCoder:(NSCoder *)decoder
305     self = [super init];
307     decodeObject(_detelecine, NSString);
308     decodeObject(_detelecineCustomString, NSString);
310     decodeObject(_deinterlace, NSString);
311     decodeObject(_deinterlaceCustomString, NSString);
313     decodeObject(_decomb, NSString);
314     decodeObject(_decombCustomString, NSString);
316     decodeObject(_denoise, NSString);
317     decodeObject(_denoisePreset, NSString);
318     decodeObject(_denoiseTune, NSString);
319     decodeObject(_denoiseCustomString, NSString);
321     decodeInt(_deblock);
322     decodeBool(_grayscale);
324     decodeBool(_useDecomb);
326     _notificationsEnabled = YES;
328     return self;
331 #pragma mark - Presets and queue
333 - (void)writeToPreset:(NSMutableDictionary *)preset
335     preset[@"PictureDecombDeinterlace"] = @(self.useDecomb);
337     preset[@"PictureDeinterlace"] = self.deinterlace;
338     preset[@"PictureDeinterlaceCustom"] = self.deinterlaceCustomString;
340     preset[@"PictureDecomb"] = self.decomb;
341     preset[@"PictureDecombCustom"] = self.decombCustomString;
343     preset[@"PictureDetelecine"] = self.detelecine;
344     preset[@"PictureDetelecineCustom"] = self.detelecineCustomString;
346     preset[@"PictureDenoiseFilter"] = self.denoise;
347     preset[@"PictureDenoisePreset"] = self.denoisePreset;
348     preset[@"PictureDenoiseTune"] = self.denoiseTune;
349     preset[@"PictureDenoiseCustom"] = self.denoiseCustomString;
351     preset[@"PictureDeblock"] = @(self.deblock);
352     preset[@"VideoGrayScale"] = @(self.grayscale);
355 - (void)applyPreset:(NSDictionary *)preset
357     self.notificationsEnabled = NO;
359     // If the preset has an objectForKey:@"UsesPictureFilters", and handle the filters here
360     if ([preset[@"UsesPictureFilters"] boolValue])
361     {
362         // We only allow *either* Decomb or Deinterlace. So check for the PictureDecombDeinterlace key.
363         self.useDecomb = [preset[@"PictureDecombDeinterlace"] boolValue];
365         self.decomb = preset[@"PictureDecomb"];
366         self.decombCustomString = preset[@"PictureDecombCustom"];
368         self.deinterlace = preset[@"PictureDeinterlace"];
369         self.deinterlaceCustomString = preset[@"PictureDeinterlaceCustom"];
371         //Detelecine
372         self.detelecine = preset[@"PictureDetelecine"];
373         self.detelecineCustomString = preset[@"PictureDetelecineCustom"];
375         // Denoise
376         self.denoise = preset[@"PictureDenoiseFilter"];
377         self.denoisePreset = preset[@"PictureDenoisePreset"];
378         self.denoiseTune = preset[@"PictureDenoiseTune"];
380         self.denoiseCustomString = preset[@"PictureDenoiseCustom"];
382         // Deblock
383         if ([preset[@"PictureDeblock"] intValue] == 1)
384         {
385             // if its a one, then its the old on/off deblock, set on to 5
386             self.deblock = 5;
387         }
388         else
389         {
390             // use the settings intValue
391             self.deblock = [preset[@"PictureDeblock"] intValue];
392         }
394         self.grayscale = [preset[@"VideoGrayScale"] boolValue];
395     }
397     self.notificationsEnabled = YES;
400 @end