PageRenderTime 28ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/Dependencies/VideoEffects/VideoThemesData.m

https://gitlab.com/Mr.Tomato/VideoEffects
Objective C | 503 lines | 410 code | 74 blank | 19 comment | 31 complexity | 4f85f667d6a34bf8b313e7b2e5febd0a MD5 | raw file
  1. //
  2. // VideoThemesData.m
  3. // VideoEffects
  4. //
  5. // Created by Johnny Xu(徐景周) on 8/11/14.
  6. // Copyright (c) 2014 Future Studio. All rights reserved.
  7. //
  8. #import "VideoThemesData.h"
  9. @interface VideoThemesData()
  10. {
  11. NSMutableDictionary *_themesDic;
  12. NSMutableDictionary *_filterFromOthers;
  13. NSMutableDictionary *_filterFromSystemCamera;
  14. }
  15. @property (retain, nonatomic) NSMutableDictionary *themesDic;
  16. @property (retain, nonatomic) NSMutableDictionary *filterFromOthers;
  17. @property (retain, nonatomic) NSMutableDictionary *filterFromSystemCamera;
  18. @end
  19. @implementation VideoThemesData
  20. @synthesize themesDic = _themesDic;
  21. @synthesize filterFromOthers = _filterFromOthers;
  22. @synthesize filterFromSystemCamera = _filterFromSystemCamera;
  23. #pragma mark - Singleton
  24. + (VideoThemesData *) sharedInstance
  25. {
  26. static VideoThemesData *singleton = nil;
  27. static dispatch_once_t once = 0;
  28. dispatch_once(&once, ^{
  29. singleton = [[VideoThemesData alloc] init];
  30. });
  31. return singleton;
  32. }
  33. #pragma mark - Life cycle
  34. - (id)init
  35. {
  36. self = [super init];
  37. if (self)
  38. {
  39. // Only run once
  40. [self initThemesData];
  41. self.filterFromOthers = [self createThemeFilter:FALSE];
  42. self.filterFromSystemCamera = [self createThemeFilter:TRUE];
  43. }
  44. return self;
  45. }
  46. - (void)dealloc
  47. {
  48. [self clearAll];
  49. }
  50. - (void) clearAll
  51. {
  52. if (self.filterFromOthers && [self.filterFromOthers count]>0)
  53. {
  54. [self.filterFromOthers removeAllObjects];
  55. self.filterFromOthers = nil;
  56. }
  57. if (self.filterFromSystemCamera && [self.filterFromSystemCamera count]>0)
  58. {
  59. for (GPUImageOutput<GPUImageInput> *filter in self.filterFromOthers)
  60. {
  61. [filter removeAllTargets];
  62. }
  63. [self.filterFromSystemCamera removeAllObjects];
  64. self.filterFromSystemCamera = nil;
  65. }
  66. if (self.themesDic && [self.themesDic count]>0)
  67. {
  68. [self.themesDic removeAllObjects];
  69. self.themesDic = nil;
  70. }
  71. }
  72. #pragma mark - Common function
  73. - (NSString*) getWeekdayFromDate:(NSDate*)date
  74. {
  75. NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
  76. NSDateComponents* components = nil; //[[NSDateComponents alloc] init];
  77. NSInteger unitFlags = NSYearCalendarUnit |
  78. NSMonthCalendarUnit |
  79. NSDayCalendarUnit |
  80. NSWeekdayCalendarUnit |
  81. NSHourCalendarUnit |
  82. NSMinuteCalendarUnit |
  83. NSSecondCalendarUnit;
  84. components = [calendar components:unitFlags fromDate:date];
  85. NSUInteger weekday = [components weekday];
  86. NSString *result = nil;
  87. switch (weekday)
  88. {
  89. case 1:
  90. {
  91. result = @"Sunday";
  92. break;
  93. }
  94. case 2:
  95. {
  96. result = @"Monday";
  97. break;
  98. }
  99. case 3:
  100. {
  101. result = @"Tuesday";
  102. break;
  103. }
  104. case 4:
  105. {
  106. result = @"Wednesday";
  107. break;
  108. }
  109. case 5:
  110. {
  111. result = @"Thursday";
  112. break;
  113. }
  114. case 6:
  115. {
  116. result = @"Friday";
  117. break;
  118. }
  119. case 7:
  120. {
  121. result = @"Saturday";
  122. break;
  123. }
  124. default:
  125. break;
  126. }
  127. return result;
  128. }
  129. -(NSString*) getStringFromDate:(NSDate*)date
  130. {
  131. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
  132. [dateFormatter setDateFormat:@"yyyy/MM/dd"];
  133. NSString *strDate = [dateFormatter stringFromDate:date];
  134. return strDate;
  135. }
  136. - (GPUImageOutput<GPUImageInput> *) createFilterNostalgia:(BOOL)fromSystemCamera
  137. {
  138. // Filter
  139. GPUImageOutput<GPUImageInput> *filterNostalgia = [[GPUImageFilterGroup alloc] init];
  140. CGFloat rotationAngle = 0;
  141. if (fromSystemCamera)
  142. {
  143. rotationAngle = M_PI_2;
  144. }
  145. GPUImageTransformFilter *transformFilter = [[GPUImageTransformFilter alloc] init];
  146. [(GPUImageTransformFilter *)transformFilter setAffineTransform:CGAffineTransformMakeRotation(rotationAngle)];
  147. [(GPUImageTransformFilter *)transformFilter setIgnoreAspectRatio:YES];
  148. [(GPUImageFilterGroup *)filterNostalgia addFilter:transformFilter];
  149. GPUImageSwirlFilter *swirlFilter = [[GPUImageSwirlFilter alloc] init];
  150. [swirlFilter setAngle:0.2];
  151. [(GPUImageFilterGroup *)filterNostalgia addFilter:swirlFilter];
  152. [transformFilter addTarget:swirlFilter];
  153. [(GPUImageFilterGroup *)filterNostalgia setInitialFilters:[NSArray arrayWithObject:transformFilter]];
  154. [(GPUImageFilterGroup *)filterNostalgia setTerminalFilter:swirlFilter];
  155. return filterNostalgia;
  156. }
  157. - (VideoThemes*) createThemeNostalgia
  158. {
  159. VideoThemes *themeNostalgia = [[VideoThemes alloc] init];
  160. themeNostalgia.ID = kThemeNostalgia;
  161. themeNostalgia.thumbImageName = @"themeNostalgia";
  162. themeNostalgia.name = GBLocalizedString(@"Swirl");
  163. themeNostalgia.textStar = nil;
  164. themeNostalgia.textGradient = GBLocalizedString(@"ToMyLover");
  165. themeNostalgia.textSparkle = GBLocalizedString(@"MissYou");
  166. themeNostalgia.bgMusicFile = @"A Little Kiss.mp3";
  167. themeNostalgia.imageFile = nil;
  168. // Scroll text
  169. NSMutableArray *scrollText = [[NSMutableArray alloc] init];
  170. [scrollText addObject:(id)[self getStringFromDate:[NSDate date]]];
  171. [scrollText addObject:(id)[self getWeekdayFromDate:[NSDate date]]];
  172. [scrollText addObject:GBLocalizedString(@"AValuableDay")];
  173. themeNostalgia.scrollText = scrollText;
  174. themeNostalgia.imageVideoBorder = [NSString stringWithFormat:@"border_25"];
  175. // Animation effects
  176. NSArray *aniActions = [NSArray arrayWithObjects:[NSNumber numberWithInt:kAnimationVideoBorder], [NSNumber numberWithInt:kAnimationTextScroll], [NSNumber numberWithInt:kAnimationTextGradient], [NSNumber numberWithInt:kAnimationTextSparkle], nil];
  177. themeNostalgia.animationActions = [NSArray arrayWithArray:aniActions];
  178. return themeNostalgia;
  179. }
  180. - (GPUImageOutput<GPUImageInput> *) createFilterMood:(BOOL)fromSystemCamera
  181. {
  182. // Filter
  183. GPUImageOutput<GPUImageInput> *filterMood = [[GPUImageFilterGroup alloc] init];
  184. CGFloat rotationAngle = 0;
  185. if (fromSystemCamera)
  186. {
  187. rotationAngle = M_PI_2;
  188. }
  189. GPUImageTransformFilter *transformFilter = [[GPUImageTransformFilter alloc] init];
  190. [(GPUImageTransformFilter *)transformFilter setAffineTransform:CGAffineTransformMakeRotation(rotationAngle)];
  191. [(GPUImageTransformFilter *)transformFilter setIgnoreAspectRatio:YES];
  192. [(GPUImageFilterGroup *)filterMood addFilter:transformFilter];
  193. GPUImagePixellateFilter *pixellateFilter = [[GPUImagePixellateFilter alloc] init];
  194. [pixellateFilter setFractionalWidthOfAPixel:0.05];
  195. [(GPUImageFilterGroup *)filterMood addFilter:pixellateFilter];
  196. [transformFilter addTarget:pixellateFilter];
  197. [(GPUImageFilterGroup *)filterMood setInitialFilters:[NSArray arrayWithObject:transformFilter]];
  198. [(GPUImageFilterGroup *)filterMood setTerminalFilter:pixellateFilter];
  199. return filterMood;
  200. }
  201. - (VideoThemes*) createThemeMood
  202. {
  203. VideoThemes *theme = [[VideoThemes alloc] init];
  204. theme.ID = kThemeMood;
  205. theme.thumbImageName = @"themeMood";
  206. theme.name = GBLocalizedString(@"Mosaic");
  207. theme.textStar = nil;
  208. theme.textGradient = GBLocalizedString(@"ToMyLover");
  209. theme.textSparkle = GBLocalizedString(@"MissYou");
  210. theme.bgMusicFile = @"Dolphin Tango.mp3";
  211. theme.imageFile = nil;
  212. // Scroll text
  213. NSMutableArray *scrollText = [[NSMutableArray alloc] init];
  214. [scrollText addObject:(id)[self getStringFromDate:[NSDate date]]];
  215. [scrollText addObject:(id)[self getWeekdayFromDate:[NSDate date]]];
  216. [scrollText addObject:GBLocalizedString(@"AValuableDay")];
  217. theme.scrollText = scrollText;
  218. theme.imageVideoBorder = [NSString stringWithFormat:@"border_21"];
  219. // Animation effects
  220. NSArray *aniActions = [NSArray arrayWithObjects:[NSNumber numberWithInt:kAnimationVideoBorder], [NSNumber numberWithInt:kAnimationTextScroll], [NSNumber numberWithInt:kAnimationTextGradient], [NSNumber numberWithInt:kAnimationTextSparkle], nil];
  221. theme.animationActions = [NSArray arrayWithArray:aniActions];
  222. return theme;
  223. }
  224. - (GPUImageOutput<GPUImageInput> *) createFilterOldFilms:(BOOL)fromSystemCamera
  225. {
  226. GPUImageOutput<GPUImageInput> *filterOldFilm = [[GPUImageFilterGroup alloc] init];
  227. CGFloat rotationAngle = 0;
  228. if (fromSystemCamera)
  229. {
  230. rotationAngle = M_PI_2;
  231. }
  232. // If this is from system camera, it will rotate 90c
  233. GPUImageTransformFilter *transformFilter = [[GPUImageTransformFilter alloc] init];
  234. [(GPUImageTransformFilter *)transformFilter setAffineTransform:CGAffineTransformMakeRotation(rotationAngle)];
  235. [(GPUImageTransformFilter *)transformFilter setIgnoreAspectRatio:YES];
  236. [(GPUImageFilterGroup *)filterOldFilm addFilter:transformFilter];
  237. // GPUImageGlassSphereFilter *spherefilter = [[GPUImageGlassSphereFilter alloc] init];
  238. // [(GPUImageGlassSphereFilter *)spherefilter setRadius:1.0];
  239. GPUImagePinchDistortionFilter *distortionFilter = [[GPUImagePinchDistortionFilter alloc] init];
  240. [distortionFilter setScale:0.5];
  241. GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
  242. [(GPUImageFilterGroup *)filterOldFilm addFilter:sepiaFilter];
  243. GPUImageEmbossFilter *embossFilter = [[GPUImageEmbossFilter alloc] init];
  244. [(GPUImageEmbossFilter *)embossFilter setIntensity:0.1];
  245. [(GPUImageFilterGroup *)filterOldFilm addFilter:embossFilter];
  246. [sepiaFilter addTarget:distortionFilter];
  247. [embossFilter addTarget:sepiaFilter];
  248. [transformFilter addTarget:embossFilter];
  249. [(GPUImageFilterGroup *)filterOldFilm setInitialFilters:[NSArray arrayWithObject:transformFilter]];
  250. [(GPUImageFilterGroup *)filterOldFilm setTerminalFilter:distortionFilter];
  251. return filterOldFilm;
  252. }
  253. - (VideoThemes*) createThemeOldFilm
  254. {
  255. VideoThemes *theme = [[VideoThemes alloc] init];
  256. theme.ID = KThemeOldFilm;
  257. theme.thumbImageName = @"themeOldFilm";
  258. theme.name = GBLocalizedString(@"OldFilm");
  259. theme.textStar = nil;
  260. theme.textGradient = GBLocalizedString(@"ToMyLover");
  261. theme.textSparkle = GBLocalizedString(@"MissYou");
  262. theme.bgMusicFile = @"Swing Dance Two.mp3";
  263. theme.imageFile = nil;
  264. // Scroll text
  265. NSMutableArray *scrollText = [[NSMutableArray alloc] init];
  266. [scrollText addObject:(id)[self getStringFromDate:[NSDate date]]];
  267. [scrollText addObject:(id)[self getWeekdayFromDate:[NSDate date]]];
  268. [scrollText addObject:GBLocalizedString(@"AValuableDay")];
  269. theme.scrollText = scrollText;
  270. theme.imageVideoBorder = [NSString stringWithFormat:@"border_22"];
  271. // Animation effects
  272. NSArray *aniActions = [NSArray arrayWithObjects:[NSNumber numberWithInt:kAnimationScrollScreen], [NSNumber numberWithInt:kAnimationBlackWhiteDot], [NSNumber numberWithInt:kAnimationScrollLine], [NSNumber numberWithInt:kAnimationFlashScreen], [NSNumber numberWithInt:kAnimationVideoBorder], [NSNumber numberWithInt:kAnimationTextScroll], [NSNumber numberWithInt:kAnimationTextGradient], [NSNumber numberWithInt:kAnimationTextSparkle], nil];
  273. theme.animationActions = [NSArray arrayWithArray:aniActions];
  274. return theme;
  275. }
  276. - (void) initThemesData
  277. {
  278. self.themesDic = [NSMutableDictionary dictionaryWithCapacity:4];
  279. VideoThemes *theme = nil;
  280. for (int i = kThemeNone; i <= KThemeOldFilm; ++i)
  281. {
  282. switch (i)
  283. {
  284. case kThemeNone:
  285. {
  286. break;
  287. }
  288. case kThemeMood:
  289. {
  290. theme = [self createThemeMood];
  291. break;
  292. }
  293. case kThemeNostalgia:
  294. {
  295. theme = [self createThemeNostalgia];
  296. break;
  297. }
  298. case KThemeOldFilm:
  299. {
  300. theme = [self createThemeOldFilm];
  301. break;
  302. }
  303. default:
  304. break;
  305. }
  306. if (i == kThemeNone)
  307. {
  308. [self.themesDic setObject:[NSNull null] forKey:[NSNumber numberWithInt:kThemeNone]];
  309. }
  310. else
  311. {
  312. [self.themesDic setObject:theme forKey:[NSNumber numberWithInt:i]];
  313. }
  314. }
  315. }
  316. - (NSMutableDictionary*) createThemeFilter:(BOOL)fromSystemCamera
  317. {
  318. NSMutableDictionary *themesFilter = [[NSMutableDictionary alloc]initWithCapacity:4];
  319. for (int i = kThemeNone; i < self.themesDic.count; ++i)
  320. {
  321. switch (i)
  322. {
  323. case kThemeNone:
  324. {
  325. [themesFilter setObject:[NSNull null] forKey:[NSNumber numberWithInt:kThemeNone]];
  326. break;
  327. }
  328. case kThemeMood:
  329. {
  330. GPUImageOutput<GPUImageInput> *filterMood = [self createFilterMood:fromSystemCamera];
  331. if (filterMood == nil)
  332. {
  333. [themesFilter setObject:[NSNull null] forKey:[NSNumber numberWithInt:kThemeMood]];
  334. }
  335. else
  336. {
  337. [themesFilter setObject:filterMood forKey:[NSNumber numberWithInt:kThemeMood]];
  338. }
  339. break;
  340. }
  341. case kThemeNostalgia:
  342. {
  343. GPUImageOutput<GPUImageInput> *filterNostalgia = [self createFilterNostalgia:fromSystemCamera];
  344. if (filterNostalgia == nil)
  345. {
  346. [themesFilter setObject:[NSNull null] forKey:[NSNumber numberWithInt:kThemeNostalgia]];
  347. }
  348. else
  349. {
  350. [themesFilter setObject:filterNostalgia forKey:[NSNumber numberWithInt:kThemeNostalgia]];
  351. }
  352. break;
  353. }
  354. case KThemeOldFilm:
  355. {
  356. GPUImageOutput<GPUImageInput> *filterOldFilm = [self createFilterOldFilms:fromSystemCamera];
  357. if (filterOldFilm == nil)
  358. {
  359. [themesFilter setObject:[NSNull null] forKey:[NSNumber numberWithInt:KThemeOldFilm]];
  360. }
  361. else
  362. {
  363. [themesFilter setObject:filterOldFilm forKey:[NSNumber numberWithInt:KThemeOldFilm]];
  364. }
  365. break;
  366. }
  367. default:
  368. break;
  369. }
  370. }
  371. return themesFilter;
  372. }
  373. - (GPUImageOutput<GPUImageInput> *) createThemeFilter:(ThemesType)themeType fromSystemCamera:(BOOL)fromSystemCamera
  374. {
  375. GPUImageOutput<GPUImageInput> *filter = nil;
  376. switch (themeType)
  377. {
  378. case kThemeNone:
  379. {
  380. break;
  381. }
  382. case kThemeMood:
  383. {
  384. filter = [self createFilterMood:fromSystemCamera];
  385. break;
  386. }
  387. case kThemeNostalgia:
  388. {
  389. filter = [self createFilterNostalgia:fromSystemCamera];
  390. break;
  391. }
  392. case KThemeOldFilm:
  393. {
  394. filter = [self createFilterOldFilms:fromSystemCamera];
  395. break;
  396. }
  397. default:
  398. break;
  399. }
  400. return filter;
  401. }
  402. - (NSMutableDictionary*) getThemeFilter:(BOOL)fromSystemCamera
  403. {
  404. if (fromSystemCamera)
  405. {
  406. return self.filterFromSystemCamera;
  407. }
  408. else
  409. {
  410. return self.filterFromOthers;
  411. }
  412. }
  413. - (VideoThemes*) getThemeByType:(ThemesType)themeType
  414. {
  415. if (self.themesDic && [self.themesDic count] > 0)
  416. {
  417. VideoThemes* theme = [self.themesDic objectForKey:[NSNumber numberWithInt:themeType]];
  418. if (theme && ((NSNull*)theme != [NSNull null]))
  419. {
  420. return theme;
  421. }
  422. }
  423. return nil;
  424. }
  425. - (NSMutableDictionary*) getThemeData
  426. {
  427. return self.themesDic;
  428. }
  429. @end