OSDN Git Service

Credit Nyx's b-frame work
[handbrake-jp/handbrake-jp-git.git] / macosx / PictureController.mm
1 /* $Id: PictureController.mm,v 1.11 2005/08/01 15:10:44 titer Exp $
2
3    This file is part of the HandBrake source code.
4    Homepage: <http://handbrake.m0k.org/>.
5    It may be used under the terms of the GNU General Public License. */
6
7 #include "PictureController.h"
8
9 static int GetAlignedSize( int size )
10 {
11     int result = 1;
12     while( result < size )
13     {
14         result *= 2;
15     }
16     return result;
17 }
18
19 @implementation PictureController
20
21 - (void) SetHandle: (hb_handle_t *) handle
22 {
23     fHandle = handle;
24
25     fHasQE = CGDisplayUsesOpenGLAcceleration( kCGDirectMainDisplay );
26
27     fBuffer     = NULL;
28     fBufferSize = 0;
29     fTexBuf[0]  = NULL;
30     fTexBuf[1]  = NULL;
31     fTexBufSize = 0;
32
33     [fWidthStepper  setValueWraps: NO];
34     [fWidthStepper  setIncrement: 16];
35     [fWidthStepper  setMinValue: 16];
36     [fHeightStepper setValueWraps: NO];
37     [fHeightStepper setIncrement: 16];
38     [fHeightStepper setMinValue: 16];
39
40     [fCropTopStepper    setIncrement: 2];
41     [fCropTopStepper    setMinValue:  0];
42     [fCropBottomStepper setIncrement: 2];
43     [fCropBottomStepper setMinValue:  0];
44     [fCropLeftStepper   setIncrement: 2];
45     [fCropLeftStepper   setMinValue:  0];
46     [fCropRightStepper  setIncrement: 2];
47     [fCropRightStepper  setMinValue:  0];
48 }
49
50 - (void) SetTitle: (hb_title_t *) title
51 {
52     hb_job_t * job = title->job;
53
54     fTitle = title;
55
56     /* Make sure we have big enough buffers */
57     int newSize;
58     newSize = ( title->width + 2 ) * (title->height + 2 ) * 4;
59     if( fBufferSize < newSize )
60     {
61         fBufferSize = newSize;
62         fBuffer     = (uint8_t *) realloc( fBuffer, fBufferSize );
63     }
64     if( !fHasQE )
65     {
66         newSize = ( GetAlignedSize( title->width + 2 ) *
67             GetAlignedSize( title->height + 2 ) * 4 );
68     }
69     if( fTexBufSize < newSize )
70     {
71         fTexBufSize = newSize;
72         fTexBuf[0]  = (uint8_t *) realloc( fTexBuf[0], fTexBufSize );
73         fTexBuf[1]  = (uint8_t *) realloc( fTexBuf[1], fTexBufSize );
74     }
75
76
77     [fWidthStepper      setMaxValue: title->width];
78     [fWidthStepper      setIntValue: job->width];
79     [fWidthField        setIntValue: job->width];
80     [fHeightStepper     setMaxValue: title->height];
81     [fHeightStepper     setIntValue: job->height];
82     [fHeightField       setIntValue: job->height];
83     [fRatioCheck        setState:    job->keep_ratio ? NSOnState : NSOffState];
84     [fCropTopStepper    setMaxValue: title->height/2-2];
85     [fCropBottomStepper setMaxValue: title->height/2-2];
86     [fCropLeftStepper   setMaxValue: title->width/2-2];
87     [fCropRightStepper  setMaxValue: title->width/2-2];
88     [fDeinterlaceCheck  setState:    job->deinterlace ? NSOnState : NSOffState];
89         [fPARCheck  setState:    job->pixel_ratio ? NSOnState : NSOffState];
90
91     MaxOutputWidth = job->width;
92         MaxOutputHeight = job->height;
93     fPicture = 0;
94     [self SettingsChanged: nil];
95 }
96
97 - (void) Display: (int) anim
98 {
99     hb_get_preview( fHandle, fTitle, fPicture, fBuffer );
100
101     /* Backup previous picture (for effects) */
102     memcpy( fTexBuf[1], fTexBuf[0], fTexBufSize );
103
104     if( fHasQE )
105     {
106         /* Simply copy */
107         memcpy( fTexBuf[0], fBuffer, fTexBufSize );
108     }
109     else
110     {
111         /* Copy line by line */
112         uint8_t * in  = fBuffer;
113         uint8_t * out = fTexBuf[0];
114                 
115         for( int i = fTitle->height + 2; i--; )
116         {
117             memcpy( out, in, 4 * ( fTitle->width + 2 ) );
118             in  += 4 * ( fTitle->width + 2 );
119             out += 4 * GetAlignedSize( fTitle->width + 2 );
120         }
121         
122     }
123
124     if( [fEffectsCheck state] == NSOffState )
125     {
126         anim = HB_ANIMATE_NONE;
127     }
128     else if( [[NSApp currentEvent] modifierFlags] & NSShiftKeyMask )
129     {
130         anim |= HB_ANIMATE_SLOW;
131     }
132
133     [fPictureGLView Display: anim buffer1: fTexBuf[0]
134         buffer2: fTexBuf[1] width: ( fTitle->width + 2 )
135         height: ( fTitle->height + 2 )];
136         
137         /* Set the Output Display below the Preview Picture*/
138         int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3];
139         int arpwidth = fTitle->job->pixel_aspect_width;
140         int arpheight = fTitle->job->pixel_aspect_height;
141         int displayparwidth = titlewidth * arpwidth / arpheight;
142         int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1];
143         if (fTitle->job->pixel_ratio == 1)
144         {
145         
146         [fInfoField setStringValue: [NSString stringWithFormat:
147         @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d", fTitle->width, fTitle->height,
148         MaxOutputWidth, displayparheight, displayparwidth,
149         displayparheight]];
150         
151         
152         }
153         else
154         {
155         [fInfoField setStringValue: [NSString stringWithFormat:
156         @"Source: %dx%d, Output: %dx%d", fTitle->width, fTitle->height,
157         fTitle->job->width, fTitle->job->height]];      
158         }
159
160
161     [fPrevButton setEnabled: ( fPicture > 0 )];
162     [fNextButton setEnabled: ( fPicture < 9 )];
163 }
164
165 - (IBAction) SettingsChanged: (id) sender
166 {
167     hb_job_t * job = fTitle->job;
168     
169         if ([fPARCheck state] == 1 )
170         {
171         [fWidthStepper      setIntValue: MaxOutputWidth];
172         [fWidthField        setIntValue: MaxOutputWidth];
173         
174         /* This will show correct anamorphic height values, but
175         show distorted preview picture ratio */
176         [fHeightStepper      setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]];
177         [fHeightField        setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]];
178         
179         /* This will show wrong anamorphic height values, but
180         show proper preview picture ratio */
181         //[fHeightStepper      setIntValue: MaxOutputHeight];
182         //[fHeightField        setIntValue: MaxOutputHeight];
183         [fRatioCheck        setState: 0];
184
185         [fWidthStepper setEnabled: NO];
186         [fWidthField setEnabled: NO];
187         [fHeightStepper setEnabled: NO];
188         [fHeightField setEnabled: NO];
189         [fRatioCheck setEnabled: NO];
190         
191         
192         }
193         else
194         {
195         [fWidthStepper setEnabled: YES];
196         [fWidthField setEnabled: YES];
197         [fHeightStepper setEnabled: YES];
198         [fHeightField setEnabled: YES];
199         [fRatioCheck setEnabled: YES];
200         }
201         
202         
203         
204     job->width       = [fWidthStepper  intValue];
205     job->height      = [fHeightStepper intValue];
206     job->keep_ratio  = ( [fRatioCheck state] == NSOnState );
207     job->deinterlace = ( [fDeinterlaceCheck state] == NSOnState );
208         job->pixel_ratio = ( [fPARCheck state] == NSOnState );
209
210
211
212     bool autocrop = ( [fCropMatrix selectedRow] == 0 );
213     [fCropTopStepper    setEnabled: !autocrop];
214     [fCropBottomStepper setEnabled: !autocrop];
215     [fCropLeftStepper   setEnabled: !autocrop];
216     [fCropRightStepper  setEnabled: !autocrop];
217     if( autocrop )
218     {
219         memcpy( job->crop, fTitle->crop, 4 * sizeof( int ) );
220     }
221     else
222     {
223         job->crop[0] = [fCropTopStepper    intValue];
224         job->crop[1] = [fCropBottomStepper intValue];
225         job->crop[2] = [fCropLeftStepper   intValue];
226         job->crop[3] = [fCropRightStepper  intValue];
227     }
228
229     if( job->keep_ratio )
230     {
231         if( sender == fWidthStepper || sender == fRatioCheck ||
232             sender == fCropTopStepper || sender == fCropBottomStepper )
233         {
234             hb_fix_aspect( job, HB_KEEP_WIDTH );
235             if( job->height > fTitle->height )
236             {
237                 job->height = fTitle->height;
238                 hb_fix_aspect( job, HB_KEEP_HEIGHT );
239             }
240         }
241         else
242         {
243             hb_fix_aspect( job, HB_KEEP_HEIGHT );
244             if( job->width > fTitle->width )
245             {
246                 job->width = fTitle->width;
247                 hb_fix_aspect( job, HB_KEEP_WIDTH );
248             }
249         }
250     }
251     
252     [fWidthStepper      setIntValue: job->width];
253     [fWidthField        setIntValue: job->width];
254     [fHeightStepper     setIntValue: job->height];
255     [fHeightField       setIntValue: job->height];
256     [fCropTopStepper    setIntValue: job->crop[0]];
257     [fCropTopField      setIntValue: job->crop[0]];
258     [fCropBottomStepper setIntValue: job->crop[1]];
259     [fCropBottomField   setIntValue: job->crop[1]];
260     [fCropLeftStepper   setIntValue: job->crop[2]];
261     [fCropLeftField     setIntValue: job->crop[2]];
262     [fCropRightStepper  setIntValue: job->crop[3]];
263     [fCropRightField    setIntValue: job->crop[3]];
264     [self Display: HB_ANIMATE_NONE];
265 }
266
267 - (IBAction) PreviousPicture: (id) sender
268 {   
269     if( fPicture <= 0 )
270     {
271         return;
272     }
273     fPicture--;
274     [self Display: HB_ANIMATE_BACKWARD];
275 }
276
277 - (IBAction) NextPicture: (id) sender
278 {
279     if( fPicture >= 9 )
280     {
281         return;
282     }
283     fPicture++;
284     [self Display: HB_ANIMATE_FORWARD];
285 }
286
287 - (IBAction) ClosePanel: (id) sender
288 {
289
290         [NSApp stopModal];
291 }
292
293 @end