| |
1 /* |
| |
2 * camdata.c |
| |
3 * basecame |
| |
4 * |
| |
5 * Created by CS194 on Mon Apr 26 2004. |
| |
6 * Copyright (c) 2004 __MyCompanyName__. All rights reserved. |
| |
7 * |
| |
8 */ |
| |
9 |
| |
10 #include "camdata.h" |
| |
11 //#include "AppBlit_Component.h" |
| |
12 #include "QTUtilities.h" |
| |
13 #include "Utilities.h" |
| |
14 |
| |
15 |
| |
16 #define BailNULL(n) if (!n) goto bail; |
| |
17 #define BailError(n) if (n) goto bail; |
| |
18 #define BailNil(n) if (!n) goto bail; |
| |
19 #define BailErr(x) {if (x != noErr) goto bail;} |
| |
20 #define bitdepth 32 |
| |
21 |
| |
22 mungDataPtr myMungData = NULL; |
| |
23 long mWorlds[20]; |
| |
24 UInt32 mRedCount[256], mGreenCound[256], mBlueCount[256]; |
| |
25 |
| |
26 static void DecompressSequencePreflight(GWorldPtr srcGWorld, |
| |
27 ImageSequence *imageSeq, |
| |
28 GWorldPtr destGWorld, |
| |
29 Rect *srcRect); |
| |
30 //static void DrawRGBHistogram(mungDataRecord *theMungData); |
| |
31 //static void CreateEffectDescription(mungDataRecord *theMungData); |
| |
32 //static void CreateEffectDecompSequence(mungDataRecord *theMungData); |
| |
33 //static void AddGWorldDataSourceToEffectDecompSeq(mungDataRecord *theMungData); |
| |
34 //static void MakeEffectTimeBaseForEffect(mungDataRecord *theMungData); |
| |
35 //static void DrawUsingEffect(mungDataRecord *theMungData); |
| |
36 |
| |
37 |
| |
38 OSErr InitializeMungData(Rect bounds) |
| |
39 { |
| |
40 OSErr err = noErr; |
| |
41 |
| |
42 if(myMungData) |
| |
43 { |
| |
44 DisposeMungData(); |
| |
45 } |
| |
46 |
| |
47 myMungData = (mungDataPtr)NewPtrClear(sizeof(mungDataRecord)); |
| |
48 if (myMungData == nil) |
| |
49 { |
| |
50 err = MemError(); |
| |
51 goto bail; |
| |
52 } |
| |
53 |
| |
54 myMungData->effect = 0; // always |
| |
55 |
| |
56 |
| |
57 BailErr(QTNewGWorld(&(myMungData->gw),bitdepth,&bounds,0,0,0)); |
| |
58 LockPixels(GetGWorldPixMap(myMungData->gw)); |
| |
59 |
| |
60 SetMungDataColorDefaults(); |
| |
61 |
| |
62 |
| |
63 |
| |
64 myMungData->selectedIndex = 0; |
| |
65 myMungData->overlay = NULL; |
| |
66 |
| |
67 SetCurrentClamp(-1); |
| |
68 |
| |
69 |
| |
70 |
| |
71 myMungData->bounds = bounds; |
| |
72 |
| |
73 SetRect(&bounds, 0, 0, 256*2+4, 128*3 + 20); |
| |
74 BailErr(QTNewGWorld(&(myMungData->histoWorld),bitdepth,&bounds,0,0,0)); |
| |
75 LockPixels(GetGWorldPixMap(myMungData->histoWorld)); |
| |
76 |
| |
77 bail: |
| |
78 return err; |
| |
79 } |
| |
80 |
| |
81 OSErr DisposeMungData(void) |
| |
82 { // check this out |
| |
83 OSErr err = noErr; |
| |
84 |
| |
85 if(myMungData) |
| |
86 { |
| |
87 //if(myMungData->drawSeq) |
| |
88 //{ |
| |
89 // CDSequenceEnd(myMungData->drawSeq); |
| |
90 //} |
| |
91 |
| |
92 if(myMungData->gw) |
| |
93 { |
| |
94 DisposeGWorld(myMungData->gw); |
| |
95 myMungData->gw = nil; |
| |
96 } |
| |
97 |
| |
98 if(myMungData->overlay) |
| |
99 { |
| |
100 DisposeGWorld(myMungData->overlay); |
| |
101 myMungData->overlay = nil; |
| |
102 } |
| |
103 |
| |
104 if(myMungData->histoWorld) |
| |
105 { |
| |
106 DisposeGWorld(myMungData->histoWorld); |
| |
107 myMungData->histoWorld = nil; |
| |
108 } |
| |
109 |
| |
110 if (myMungData->effectTimeBase) |
| |
111 { |
| |
112 DisposeTimeBase(myMungData->effectTimeBase); |
| |
113 } |
| |
114 if (myMungData->effectParams) |
| |
115 { |
| |
116 QTDisposeAtomContainer(myMungData->effectParams); |
| |
117 } |
| |
118 if (myMungData->effectDesc) |
| |
119 { |
| |
120 DisposeHandle((Handle)myMungData->effectDesc); |
| |
121 } |
| |
122 |
| |
123 DisposePtr((Ptr)myMungData); |
| |
124 myMungData = nil; |
| |
125 } |
| |
126 return err; |
| |
127 } |
| |
128 |
| |
129 static void DecompressSequencePreflight(GWorldPtr srcGWorld, |
| |
130 ImageSequence *imageSeq, |
| |
131 GWorldPtr destGWorld, |
| |
132 Rect *srcRect) |
| |
133 // might not need this one |
| |
134 |
| |
135 { |
| |
136 ImageDescriptionHandle imageDesc = nil; |
| |
137 |
| |
138 BailErr(MakeImageDescriptionForPixMap (GetGWorldPixMap(srcGWorld), &imageDesc)); |
| |
139 |
| |
140 // use our built-in decompressor to draw |
| |
141 // (**imageDesc).cType = kCustomDecompressorType; |
| |
142 |
| |
143 // *********** MIGHT BE MAKING A BIG MISTAKE ****************** |
| |
144 // pass a compressed sample so a codec can perform preflighting before the first DecompressSequenceFrameWhen call |
| |
145 |
| |
146 BailErr(DecompressSequenceBegin(imageSeq, |
| |
147 imageDesc, |
| |
148 destGWorld, |
| |
149 0, |
| |
150 srcRect, |
| |
151 nil, |
| |
152 srcCopy, |
| |
153 nil, |
| |
154 0, |
| |
155 codecNormalQuality, |
| |
156 bestSpeedCodec)); |
| |
157 |
| |
158 bail: |
| |
159 if (imageDesc) |
| |
160 { |
| |
161 DisposeHandle((Handle)imageDesc); |
| |
162 } |
| |
163 } |
| |
164 |
| |
165 ImageSequence GetMungDataDrawSeq() |
| |
166 { |
| |
167 return myMungData->drawSeq; |
| |
168 } |
| |
169 |
| |
170 void SetMungDataColorDefaults() |
| |
171 { |
| |
172 if(myMungData) |
| |
173 { |
| |
174 myMungData->redMin = 2; |
| |
175 myMungData->redMax = 254; |
| |
176 myMungData->greenMin = 2; |
| |
177 myMungData->greenMax = 254; |
| |
178 myMungData->blueMin = 2; |
| |
179 myMungData->blueMax = 254; |
| |
180 } |
| |
181 } |
| |
182 |
| |
183 void GetMungDataBoundsRect(Rect *boundsRect) |
| |
184 // might not need this one |
| |
185 { |
| |
186 MacSetRect (boundsRect, |
| |
187 myMungData->bounds.left, |
| |
188 myMungData->bounds.top, |
| |
189 myMungData->bounds.right, |
| |
190 myMungData->bounds.bottom |
| |
191 ); |
| |
192 } |
| |
193 |
| |
194 void SetCurrentClamp(short index) // :crazy:20040426 |
| |
195 { |
| |
196 myMungData->selectedIndex = index; |
| |
197 } |
| |
198 |
| |
199 GWorldPtr GetMungDataOffscreen() |
| |
200 { |
| |
201 return (myMungData->gw); |
| |
202 } |
| |
203 |
| |
204 void SetMungDataDrawSeq(ImageSequence theDrawSeq) |
| |
205 { |
| |
206 myMungData->drawSeq = theDrawSeq; |
| |
207 } |
| |
208 |
| |
209 |
| |
210 CGrafPtr GetMungDataWindowPort() |
| |
211 { |
| |
212 return GetWindowPort(myMungData->window); |
| |
213 } |