forked from ryderfang/multiscape
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMSImageManipulationThread.m
More file actions
151 lines (110 loc) · 4.67 KB
/
MSImageManipulationThread.m
File metadata and controls
151 lines (110 loc) · 4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//
// MSImageManipulationThread.m
// MultiScape
//
// Created by David Zwerdling on 7/28/09.
//
//This file is part of MultiScape.
//
//MultiScape is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//MultiScape is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
//along with MultiScape. If not, see <http://www.gnu.org/licenses/>.
//
#import "MSImageManipulationThread.h"
#import "MSImageManipulationDTO.h"
#import "MSImageManipulationHelper.h"
@implementation MSImageManipulationThread
@synthesize procDto;
-(void) main
{
NSLog(@"MSImageManipulationThread: main +");
NSAutoreleasePool *pool = [NSAutoreleasePool new];
fileManager = [NSFileManager defaultManager];
sysEventsBridgeApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.SystemEvents"];
if(procDto == nil)
{
NSLog(@"MSImageManipulationThread: ProcDTO is nil. Exiting thread.");
return;
}
if(procDto.shouldContinueProcessing)
{
[self executeImageProcessing];
}
else
{
NSLog(@"MSImageManipulationThread: procDto prematurely forced thread exit.");
}
[pool release];
NSLog(@"MSImageManipulationThread: main -");
}
- (void) executeImageProcessing
{
NSLog(@"MSImageManipulationThread: executeImageProcessing +");
if(procDto.imageToProcess == nil)
{
NSLog(@"MSImageManipulationThread: Image to process is nil.");
return;
}
NSRect fullSpace = [MSImageManipulationHelper fullMonitorSpace];
CIImage *baseCIImage =[CIImage imageWithData:[procDto.imageToProcess TIFFRepresentation]];
if(! procDto.shouldContinueProcessing)
{
NSLog(@"MSImageManipulationThread: procDto cancelling process after baseCIImage calculation.");
return;
}
CIImage *scaledImage = [MSImageManipulationHelper scaleImage:baseCIImage toFullSpace:fullSpace];
if(! procDto.shouldContinueProcessing)
{
NSLog(@"MSImageManipulationThread: procDto cancelling process after scaledImage calculation.");
return;
}
NSString *outputDirectory = [self outputDirectory];
NSArray *screens = [NSScreen screens];
NSMutableArray *completedDesktopPaths = [NSMutableArray array];
for (int i = 0; i < [screens count]; i++)
{
NSScreen *screen = [screens objectAtIndex:i];
CIVector *cropForScreen = [MSImageManipulationHelper cropRectForScreen:screen inFullSpace:fullSpace];
CIImage *croppedImageForScreen = [MSImageManipulationHelper cropImage:scaledImage forScreenVector:cropForScreen];
NSBitmapImageRep *bitmapImage = [MSImageManipulationHelper bitmapImageRepForImage:croppedImageForScreen];
NSString *croppedImagePath = [NSString stringWithFormat:@"%@/%i.tiff", outputDirectory, i];
NSLog(@"MSImageManipulationThread: Saving cropped image for screen %i to path %@.", i, croppedImagePath);
[self saveImageToFile:croppedImagePath imageRep:bitmapImage];
[completedDesktopPaths addObject:croppedImagePath];
}
if(! procDto.shouldContinueProcessing)
{
NSLog(@"MSImageManipulationThread: procDto cancelling process after image processing.");
return;
}
for (int i = 0; i < [screens count]; i++)
{
SystemEventsDesktop *thisDesktop = [[sysEventsBridgeApp desktops] objectAtIndex:i];
[thisDesktop setPicture:[NSURL URLWithString:[completedDesktopPaths objectAtIndex:i]]];
}
NSLog(@"MSImageManipulationThread: executeImageProcessing -");
}
-(NSString*) outputDirectory
{
NSString *directoryForOutput = [[NSString stringWithFormat:@"~/Pictures/MultiScape/%f", procDto.timeStamp] stringByExpandingTildeInPath];
NSLog(@"MSImageManipulationThread: Output directory: %@", directoryForOutput);
if(! [fileManager fileExistsAtPath:[@"~/Pictures/MultiScape" stringByExpandingTildeInPath]])
[fileManager createDirectoryAtPath:[@"~/Pictures/MultiScape" stringByExpandingTildeInPath] attributes:nil];
[fileManager createDirectoryAtPath:directoryForOutput attributes:nil];
return directoryForOutput;
}
-(void) saveImageToFile:(NSString*)fileLocation
imageRep:(NSBitmapImageRep*)outputBitmapImageRep
{
NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:1.0], NSImageCompressionFactor, [NSNumber numberWithBool:FALSE], NSImageProgressive, nil];
NSData *outputData = [outputBitmapImageRep representationUsingType:NSJPEGFileType properties:properties];
[outputData writeToFile:fileLocation atomically:NO];
}
@end