aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/hugo/hemedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/glk/hugo/hemedia.cpp')
-rw-r--r--engines/glk/hugo/hemedia.cpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/engines/glk/hugo/hemedia.cpp b/engines/glk/hugo/hemedia.cpp
new file mode 100644
index 0000000000..19c9874ed4
--- /dev/null
+++ b/engines/glk/hugo/hemedia.cpp
@@ -0,0 +1,204 @@
+/* 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 < 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