Initial commit.
[amiga/xmodule.git] / OptimizationWin.c
1 /*
2 **      OptimizationWin.c
3 **
4 **      Copyright (C) 1994,95,96 Bernardo Innocenti
5 **
6 **      Song optimization panel.
7 */
8
9
10 #include <intuition/intuition.h>
11 #include <intuition/gadgetclass.h>
12 #include <libraries/gadtools.h>
13
14 #include <proto/exec.h>
15 #include <proto/intuition.h>
16 #include <proto/gadtools.h>
17 #include <proto/xmodule.h>
18
19 #include "XModulePriv.h"
20 #include "Gui.h"
21
22
23
24 /* Local functions prototypes */
25
26 static void OptPerformClicked (struct WinUserData *wud);
27
28
29
30 /* Gadgets IDs */
31
32 enum
33 {
34         GD_OptimizationGroup0,
35                 GD_OptimizationGroup1,
36                         GD_RemPatts,
37                         GD_RemDupPatts,
38                         GD_RemInstr,
39                         GD_RemDupInstr,
40                         GD_CutAfterLoop,
41                         GD_CutZeroTail,
42                         GD_CutPatterns,
43                         GD_RemapInstr,
44                 GD_OptPerform,
45
46         Optimization_CNT
47 };
48
49
50
51
52 XDEF struct OptSwitches OptSwitches = { 1, 1, 1, 1, 1, 1, 0, 0 };
53
54
55
56
57 static ULONG OptimizationArgs[] =
58 {
59         VGROUP_KIND, BBFT_RIDGE,
60                 CHECKBOX_KIND,  NULL,   MSG_REM_UNUSED_PATTS_GAD,       (ULONG)&OptSwitches.RemPatts,           TAG_DONE,
61                 CHECKBOX_KIND,  NULL,   MSG_REM_DUPLICATE_PATTS_GAD,(ULONG)&OptSwitches.RemDupPatts,    TAG_DONE,
62                 CHECKBOX_KIND,  NULL,   MSG_REM_UNUSED_INSTR_GAD,       (ULONG)&OptSwitches.RemInstr,           TAG_DONE,
63                 CHECKBOX_KIND,  NULL,   MSG_REM_DUP_INSTR_GAD,          (ULONG)&OptSwitches.RemDupInstr,        TAG_DONE,
64                 CHECKBOX_KIND,  NULL,   MSG_CUT_AFTER_LOOP_GAD,         (ULONG)&OptSwitches.CutAfterLoop,       TAG_DONE,
65                 CHECKBOX_KIND,  NULL,   MSG_CUT_ZERO_TAILS_GAD,         (ULONG)&OptSwitches.CutZeroTail,        TAG_DONE,
66                 CHECKBOX_KIND,  NULL,   MSG_CUT_PATTERNS_GAD,           (ULONG)&OptSwitches.CutPatts,           TAG_DONE,
67                 CHECKBOX_KIND,  NULL,   MSG_REMAP_INSTRUMENTS_GAD,      (ULONG)&OptSwitches.RemapInstr,         TAG_DONE,
68                 ENDGROUP_KIND,
69         BUTTON_KIND,    (ULONG)OptPerformClicked,       MSG_OPTIMIZE_GAD,       TAG_DONE,
70         ENDGROUP_KIND
71 };
72
73
74
75 XDEF LONG OptimizationWinTags[] =
76 {
77         XMWIN_LayoutArgs,       (LONG)OptimizationArgs,
78         XMWIN_GCount,           Optimization_CNT,
79         XMWIN_Title,            MSG_OPTIMIZATION_TITLE,
80         XMWIN_WindowFlags,      WFLG_CLOSEGADGET,
81         XMWIN_IDCMPFlags,       CHECKBOXIDCMP | BUTTONIDCMP | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
82         XMWIN_HelpNode,         (LONG)"Optimization",
83         TAG_DONE
84 };
85
86
87
88 GLOBALCALL void UpdateOptSwitches (void)
89 {
90         struct WinUserData *wud = WDescr[WID_OPTIMIZATION].Wud;
91
92         if (wud && wud->Win)
93                 SetGadgets (wud,
94                         GD_RemPatts,            OptSwitches.RemPatts,
95                         GD_RemDupPatts,         OptSwitches.RemDupPatts,
96                         GD_RemInstr,            OptSwitches.RemInstr,
97                         GD_RemDupInstr,         OptSwitches.RemDupInstr,
98                         GD_CutAfterLoop,        OptSwitches.CutAfterLoop,
99                         GD_CutZeroTail,         OptSwitches.CutZeroTail,
100                         GD_CutPatterns,         OptSwitches.CutPatts,
101                         GD_RemapInstr,          OptSwitches.RemapInstr,
102                         -1);
103 }
104
105
106
107 /************************/
108 /* Optimization Gadgets */
109 /************************/
110
111 static void OptPerformClicked (struct WinUserData *wud)
112 {
113         struct SongInfo *si;
114         ULONG oldsize, newsize;
115
116         if (si = xmLockActiveSong (SM_EXCLUSIVE))
117         {
118                 oldsize = CalcSongSize (si);
119
120                 xmProcessSong (si, NULL,
121                         XMSNG_Optimize, XMOF_DEFAULT,
122                         TAG_DONE);
123
124                 UpdateSongInfo();
125
126                 newsize = CalcSongSize (si);
127
128                 ReleaseSemaphore (&si->Lock);
129
130                 xmDisplayMessage (XMDMF_NOTE | XMDMF_USECATALOG, (STRPTR)MSG_SAVED_X_BYTES,
131                         oldsize - newsize, ((oldsize - newsize) * 100) / oldsize );
132         }
133
134         MyCloseWindow (wud);
135 }