mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
205 lines
4.5 KiB
C++
205 lines
4.5 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program 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 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include "glk/hugo/hugo.h"
|
|
|
|
namespace Glk {
|
|
namespace Hugo {
|
|
|
|
int Hugo::loadres(HUGO_FILE infile, int reslen, int type) {
|
|
char buf[4096];
|
|
frefid_t fileref;
|
|
strid_t stream;
|
|
long offset;
|
|
int idVal;
|
|
int i, n;
|
|
|
|
offset = hugo_ftell(infile);
|
|
for (i = 0; i < numres[type]; i++)
|
|
if (resids[type][i] == offset)
|
|
return i;
|
|
|
|
/* Too many resources loaded... */
|
|
if (numres[type] + 1 == MAXRES)
|
|
return -1;
|
|
|
|
idVal = numres[type]++;
|
|
sprintf(buf, "%s%d", type == PIC ? "PIC" : "SND", idVal);
|
|
resids[type][idVal] = offset;
|
|
|
|
fileref = glk_fileref_create_by_name(fileusage_Data, buf, 0);
|
|
if (!fileref)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
stream = glk_stream_open_file(fileref, filemode_Write, 0);
|
|
if (!stream)
|
|
{
|
|
glk_fileref_destroy(fileref);
|
|
return -1;
|
|
}
|
|
|
|
glk_fileref_destroy(fileref);
|
|
|
|
while (reslen > 0)
|
|
{
|
|
n = hugo_fread(buf, 1, reslen < (int)sizeof(buf) ? reslen : sizeof(buf), infile);
|
|
if (n <= 0)
|
|
break;
|
|
glk_put_buffer_stream(stream, buf, n);
|
|
reslen -= n;
|
|
}
|
|
|
|
glk_stream_close(stream, NULL);
|
|
|
|
return idVal;
|
|
}
|
|
|
|
int Hugo::hugo_hasgraphics() {
|
|
/* Returns true if the current display is capable of graphics display */
|
|
return glk_gestalt(gestalt_Graphics, 0)
|
|
&& glk_gestalt(gestalt_DrawImage, glk_window_get_type(mainwin));
|
|
}
|
|
|
|
int Hugo::hugo_displaypicture(HUGO_FILE infile, long reslen) {
|
|
int idVal;
|
|
|
|
/* Ignore the call if the current window is set elsewhere. */
|
|
if (currentwin != NULL && currentwin != mainwin)
|
|
{
|
|
hugo_fclose(infile);
|
|
return false;
|
|
}
|
|
|
|
idVal = loadres(infile, reslen, PIC);
|
|
if (idVal < 0)
|
|
{
|
|
hugo_fclose(infile);
|
|
return false;
|
|
}
|
|
|
|
#if 0
|
|
/* Get picture width and height for scaling. */
|
|
glui32 width, height;
|
|
if (glk_image_get_info(idVal, &width, &height))
|
|
{
|
|
/* Scale large images. */
|
|
if (width > PIC_MAX_WIDTH)
|
|
{
|
|
height = height * PIC_MAX_WIDTH / width;
|
|
width = PIC_MAX_WIDTH;
|
|
}
|
|
if (height > PIC_MAX_HEIGHT)
|
|
{
|
|
width = width * PIC_MAX_HEIGHT / height;
|
|
height = PIC_MAX_HEIGHT;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
hugo_fclose(infile);
|
|
|
|
/* Draw, then move cursor down to the next line. */
|
|
glk_image_draw(mainwin, idVal, imagealign_InlineUp, 0);
|
|
glk_put_char('\n');
|
|
|
|
return true;
|
|
}
|
|
|
|
void Hugo::initsound() {
|
|
if (!glk_gestalt(gestalt_Sound, 0))
|
|
return;
|
|
schannel = glk_schannel_create(0);
|
|
}
|
|
|
|
void Hugo::initmusic() {
|
|
if (!glk_gestalt(gestalt_Sound, 0) || !glk_gestalt(gestalt_SoundMusic, 0))
|
|
return;
|
|
mchannel = glk_schannel_create(0);
|
|
}
|
|
|
|
int Hugo::hugo_playmusic(HUGO_FILE infile, long reslen, char loop_flag) {
|
|
int idVal;
|
|
|
|
if (!mchannel)
|
|
initmusic();
|
|
if (mchannel)
|
|
{
|
|
idVal = loadres(infile, reslen, SND);
|
|
if (idVal < 0)
|
|
{
|
|
hugo_fclose(infile);
|
|
return false;
|
|
}
|
|
glk_schannel_play_ext(mchannel, idVal, loop_flag ? -1 : 1, 0);
|
|
}
|
|
|
|
hugo_fclose(infile);
|
|
return true;
|
|
}
|
|
|
|
void Hugo::hugo_musicvolume(int vol) {
|
|
if (!mchannel) initmusic();
|
|
if (!mchannel) return;
|
|
glk_schannel_set_volume(mchannel, (vol * 0x10000) / 100);
|
|
}
|
|
|
|
void Hugo::hugo_stopmusic() {
|
|
if (!mchannel) initmusic();
|
|
if (!mchannel) return;
|
|
glk_schannel_stop(mchannel);
|
|
}
|
|
|
|
int Hugo::hugo_playsample(HUGO_FILE infile, long reslen, char loop_flag) {
|
|
int idVal;
|
|
|
|
if (schannel)
|
|
{
|
|
idVal = loadres(infile, reslen, SND);
|
|
if (idVal < 0)
|
|
{
|
|
hugo_fclose(infile);
|
|
return false;
|
|
}
|
|
glk_schannel_play_ext(schannel, idVal, loop_flag ? -1 : 1, 0);
|
|
}
|
|
|
|
hugo_fclose(infile);
|
|
return true;
|
|
}
|
|
|
|
void Hugo::hugo_samplevolume(int vol) {
|
|
if (!schannel) initsound();
|
|
if (!schannel) return;
|
|
glk_schannel_set_volume(schannel, (vol * 0x10000) / 100);
|
|
}
|
|
|
|
void Hugo::hugo_stopsample() {
|
|
if (!schannel) initsound();
|
|
if (!schannel) return;
|
|
glk_schannel_stop(schannel);
|
|
}
|
|
|
|
} // End of namespace Hugo
|
|
} // End of namespace Glk
|