1 /*
2  *  tracker/TrackerStartUp.cpp
3  *
4  *  Copyright 2009 Peter Barth
5  *
6  *  This file is part of Milkytracker.
7  *
8  *  Milkytracker is free software: you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation, either version 3 of the License, or
11  *  (at your option) any later version.
12  *
13  *  Milkytracker is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with Milkytracker.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22 
23 /*
24  *  TrackerStartUp.cpp
25  *  MilkyTracker
26  *
27  *  Created by Peter Barth on Sun Mar 20 2005.
28  *
29  */
30 
31 #include "Tracker.h"
32 #include "XMFile.h"
33 #include "TrackerSettingsDatabase.h"
34 #include "PPSystem.h"
35 #include "Screen.h"
36 #include "PatternEditorControl.h"
37 #include "PlayerMaster.h"
38 #include "SystemMessage.h"
39 #include "version.h"
40 
41 // Logo picture
42 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
43 	#include "LogoSmall.h"
44 #else
45 	#include "LogoBig.h"
46 #endif
47 
48 
getWindowSizeFromDatabase()49 PPSize Tracker::getWindowSizeFromDatabase()
50 {
51 	PPSize size(PPScreen::getDefaultWidth(), PPScreen::getDefaultHeight());
52 
53 	if (XMFile::exists(System::getConfigFileName()))
54 	{
55 		TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
56 		XMFile f(System::getConfigFileName());
57 		settingsDatabaseCopy->serialize(f);
58 		size.height = settingsDatabaseCopy->restore("YRESOLUTION")->getIntValue();
59 		size.width = settingsDatabaseCopy->restore("XRESOLUTION")->getIntValue();
60 		delete settingsDatabaseCopy;
61 	}
62 
63 	return size;
64 }
65 
getFullScreenFlagFromDatabase()66 bool Tracker::getFullScreenFlagFromDatabase()
67 {
68 	bool fullScreen = false;
69 
70 	if (XMFile::exists(System::getConfigFileName()))
71 	{
72 		TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
73 		XMFile f(System::getConfigFileName());
74 		settingsDatabaseCopy->serialize(f);
75 		fullScreen = settingsDatabaseCopy->restore("FULLSCREEN")->getBoolValue();
76 		delete settingsDatabaseCopy;
77 	}
78 
79 	return fullScreen;
80 }
81 
getScreenScaleFactorFromDatabase()82 pp_int32 Tracker::getScreenScaleFactorFromDatabase()
83 {
84 	pp_int32 scaleFactor = 1;
85 
86 	if (XMFile::exists(System::getConfigFileName()))
87 	{
88 		TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
89 		XMFile f(System::getConfigFileName());
90 		settingsDatabaseCopy->serialize(f);
91 		scaleFactor = settingsDatabaseCopy->restore("SCREENSCALEFACTOR")->getIntValue();
92 		delete settingsDatabaseCopy;
93 	}
94 
95 	return scaleFactor;
96 }
97 
getShowSplashFlagFromDatabase()98 bool Tracker::getShowSplashFlagFromDatabase()
99 {
100 	bool showSplash = true;
101 
102 	if (XMFile::exists(System::getConfigFileName()))
103 	{
104 		TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
105 		XMFile f(System::getConfigFileName());
106 		settingsDatabaseCopy->serialize(f);
107 		showSplash = settingsDatabaseCopy->restore("SHOWSPLASH")->getBoolValue();
108 		delete settingsDatabaseCopy;
109 	}
110 
111 	return showSplash;
112 }
113 
114 #define SPLASH_WAIT_TIME 1000
115 
showSplash()116 void Tracker::showSplash()
117 {
118 	screen->clear();
119 	float shade = 0.0f;
120 	pp_int32 deltaT = 100;
121 	while (shade <= 256.0f)
122 	{
123 		pp_int32 startTime = ::PPGetTickCount();
124 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
125 		screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4, (int)shade);
126 #else
127 		screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3, (int)shade);
128 #endif
129 		shade+=deltaT * (1.0f/6.25f);
130 		deltaT = abs((pp_int32)::PPGetTickCount() - startTime);
131 		if (!deltaT) deltaT++;
132 	}
133 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
134 	screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4);
135 #else
136 	screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3);
137 #endif
138 	screen->enableDisplay(false);
139 }
140 
hideSplash()141 void Tracker::hideSplash()
142 {
143 	screen->clear();
144 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
145 	screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4);
146 #else
147 	screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3);
148 #endif
149 	screen->enableDisplay(true);
150 	float shade = 256.0f;
151 	pp_int32 deltaT = 100;
152 	while (shade >= 0.0f)
153 	{
154 		pp_int32 startTime = ::PPGetTickCount();
155 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
156 		screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4, (int)shade);
157 #else
158 		screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3, (int)shade);
159 #endif
160 		shade-=deltaT * (1.0f/6.25f);
161 		deltaT = abs((pp_int32)::PPGetTickCount() - startTime);
162 		if (!deltaT) deltaT++;
163 	}
164 	screen->clear();
165 
166 	screen->pauseUpdate(true);
167 	screen->paintControl(getPatternEditorControl(), false);
168 	screen->paint();
169 	screen->pauseUpdate(false);
170 }
171 
startUp(bool forceNoSplash)172 void Tracker::startUp(bool forceNoSplash/* = false*/)
173 {
174 	bool noSplash = forceNoSplash ? true : !getShowSplashFlagFromDatabase();
175 
176 	// put up splash screen if desired
177 	pp_uint32 startTime = PPGetTickCount();
178 
179 	if (!noSplash)
180 		showSplash();
181 	else
182 		screen->enableDisplay(false);
183 
184 	initUI();
185 
186 	pp_int32 dTime;
187 
188 	if (!noSplash)
189 	{
190 		dTime = (signed)(PPGetTickCount() - startTime);
191 		if (dTime > SPLASH_WAIT_TIME) dTime = SPLASH_WAIT_TIME;
192 		if (dTime < 0) dTime = 0;
193 		System::msleep(SPLASH_WAIT_TIME/2 - dTime);
194 		startTime = PPGetTickCount();
195 	}
196 
197 	if (XMFile::exists(System::getConfigFileName()))
198 	{
199 		// create as copy from existing database, so all keys are in there
200 		settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
201 
202 		XMFile f(System::getConfigFileName());
203 
204 		// restore keys from disk
205 		settingsDatabaseCopy->serialize(f);
206 
207 		// everything alright, delete old database and take new one
208 		delete settingsDatabase;
209 		settingsDatabase = settingsDatabaseCopy;
210 		settingsDatabaseCopy = NULL;
211 	}
212 
213 	// apply ALL settings, not just the different ones
214 	applySettings(settingsDatabase, NULL, true, false);
215 
216 	// update version information
217 	settingsDatabase->store("VERSION", MILKYTRACKER_VERSION);
218 
219 	// Update info panels
220 	updateSongInfo(false);
221 
222 	updateWindowTitle();
223 
224 	// try to start playback engine
225 	bool masterStart = playerMaster->start();
226 
227 	// remove splash screen
228 	if (!noSplash)
229 	{
230 		dTime = (signed)(PPGetTickCount() - startTime);
231 		if (dTime > SPLASH_WAIT_TIME/2) dTime = SPLASH_WAIT_TIME/2;
232 		if (dTime < 0) dTime = 0;
233 
234 		System::msleep(SPLASH_WAIT_TIME/2 - dTime);
235 		hideSplash();
236 	}
237 	else
238 		screen->enableDisplay(true);
239 
240 	screen->paint();
241 
242 	if (!masterStart)
243 	{
244 		SystemMessage systemMessage(*screen, SystemMessage::MessageSoundDriverInitFailed);
245 		systemMessage.show();
246 	}
247 }
248