1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-05-19 09:28:51 +03:00
inform7/inform7/runtime-module/Chapter 5/Multimedia.w

149 lines
5.6 KiB
OpenEdge ABL
Raw Normal View History

2021-05-08 18:22:30 +03:00
[RTMultimedia::] Multimedia.
2021-05-08 15:11:12 +03:00
2021-05-08 18:22:30 +03:00
To compile the multimedia submodule for a compilation unit, which contains
_external_file, _figure and _sound packages.
2021-05-08 15:11:12 +03:00
@ Everything is done here:
=
2021-05-08 18:22:30 +03:00
void RTMultimedia::compile_files(void) {
2021-05-08 15:11:12 +03:00
files_data *exf;
LOOP_OVER(exf, files_data) {
text_stream *desc = Str::new();
WRITE_TO(desc, "external file '%W'", exf->name);
2021-05-08 18:22:30 +03:00
Sequence::queue(&RTMultimedia::compilation_agent,
2021-05-08 15:11:12 +03:00
STORE_POINTER_files_data(exf), desc);
}
}
2022-11-03 01:26:19 +02:00
void RTMultimedia::compile_internal_files(void) {
internal_files_data *inf;
LOOP_OVER(inf, internal_files_data) {
text_stream *desc = Str::new();
WRITE_TO(desc, "internal file '%W'", inf->name);
Sequence::queue(&RTMultimedia::internal_compilation_agent,
STORE_POINTER_internal_files_data(inf), desc);
}
}
2021-05-08 18:22:30 +03:00
void RTMultimedia::compile_figures(void) {
figures_data *bf;
LOOP_OVER(bf, figures_data) {
2021-06-05 15:36:47 +03:00
package_request *pack = RTInstances::package(bf->as_instance);
Hierarchy::apply_metadata_from_number(pack, INSTANCE_FIGURE_ID_MD_HL,
(inter_ti) bf->figure_number);
Hierarchy::apply_metadata_from_filename(pack, INSTANCE_FIGURE_FILENAME_MD_HL,
bf->filename_of_image_file);
2021-05-08 18:22:30 +03:00
}
}
void RTMultimedia::compile_sounds(void) {
sounds_data *bs;
LOOP_OVER(bs, sounds_data) {
2021-06-05 15:36:47 +03:00
package_request *pack = RTInstances::package(bs->as_instance);
Hierarchy::apply_metadata_from_number(pack, INSTANCE_SOUND_ID_MD_HL,
(inter_ti) bs->sound_number);
Hierarchy::apply_metadata_from_filename(pack, INSTANCE_SOUND_FILENAME_MD_HL,
bs->filename_of_sound_file);
2021-05-08 18:22:30 +03:00
}
}
@ Files are made with the following agent, which makes a single |_external_file| package:
2021-05-08 15:11:12 +03:00
=
2021-05-08 18:22:30 +03:00
void RTMultimedia::compilation_agent(compilation_subtask *t) {
2021-05-08 15:11:12 +03:00
files_data *exf = RETRIEVE_POINTER_files_data(t->data);
wording W = exf->name;
package_request *P = Hierarchy::local_package_to(EXTERNAL_FILES_HAP, exf->where_created);
inter_name *exf_iname = Hierarchy::make_iname_with_memo(FILE_HL, P, W);
inter_name *IFID_array_iname = NULL;
if (exf->file_ownership == OWNED_BY_SPECIFIC_PROJECT) @<Make an ownership record@>;
@<Make the file metadata array@>;
@<Make the value metadata@>;
}
@<Make an ownership record@> =
IFID_array_iname = Hierarchy::make_iname_with_memo(IFID_HL, P, W);
packaging_state save =
EmitArrays::begin_byte(IFID_array_iname, K_value);
2021-05-08 15:11:12 +03:00
TEMPORARY_TEXT(II)
WRITE_TO(II, "//%S//", exf->IFID_of_owner);
LOOP_THROUGH_TEXT(pos, II)
EmitArrays::numeric_entry((inter_ti) Str::get(pos));
2021-05-08 15:11:12 +03:00
DISCARD_TEXT(II)
EmitArrays::end(save);
@<Make the file metadata array@> =
2021-10-11 03:11:20 +03:00
packaging_state save = EmitArrays::begin_word(exf_iname, K_value);
2021-05-08 15:11:12 +03:00
EmitArrays::iname_entry(Hierarchy::find(AUXF_MAGIC_VALUE_HL));
EmitArrays::iname_entry(Hierarchy::find(AUXF_STATUS_IS_CLOSED_HL));
2022-11-04 00:56:50 +02:00
if (exf->file_is_binary) EmitArrays::numeric_entry(EXTERNAL_BINARY_FILE_NFSMF);
else EmitArrays::numeric_entry(EXTERNAL_TEXT_FILE_NFSMF);
2021-05-08 15:11:12 +03:00
EmitArrays::numeric_entry(0);
TEMPORARY_TEXT(WW)
WRITE_TO(WW, "%w", Lexer::word_raw_text(exf->unextended_filename));
Str::delete_first_character(WW);
Str::delete_last_character(WW);
EmitArrays::text_entry(WW);
DISCARD_TEXT(WW)
switch (exf->file_ownership) {
case OWNED_BY_THIS_PROJECT:
EmitArrays::iname_entry(RTBibliographicData::IFID_iname()); break;
case OWNED_BY_ANOTHER_PROJECT:
EmitArrays::null_entry(); break;
case OWNED_BY_SPECIFIC_PROJECT:
EmitArrays::iname_entry(IFID_array_iname); break;
}
EmitArrays::end(save);
@<Make the value metadata@> =
2021-06-05 15:36:47 +03:00
package_request *pack = RTInstances::package(exf->as_instance);
Hierarchy::apply_metadata_from_iname(pack, INSTANCE_FILE_VALUE_MD_HL, exf_iname);
Hierarchy::apply_metadata_from_raw_wording(pack, INSTANCE_LEAFNAME_MD_HL,
Wordings::one_word(exf->unextended_filename));
Hierarchy::apply_metadata_from_number(pack, INSTANCE_FILE_IS_BINARY_MD_HL,
(inter_ti) exf->file_is_binary);
switch (exf->file_ownership) {
case OWNED_BY_THIS_PROJECT:
Hierarchy::apply_metadata_from_number(pack, INSTANCE_FILE_OWNED_MD_HL, 1);
break;
case OWNED_BY_ANOTHER_PROJECT:
Hierarchy::apply_metadata_from_number(pack, INSTANCE_FILE_OWNED_BY_OTHER_MD_HL, 1);
break;
case OWNED_BY_SPECIFIC_PROJECT:
Hierarchy::apply_metadata(pack, INSTANCE_FILE_OWNER_MD_HL, exf->IFID_of_owner);
break;
}
2022-11-03 01:26:19 +02:00
@ Internal files are simpler:
=
void RTMultimedia::internal_compilation_agent(compilation_subtask *t) {
internal_files_data *inf = RETRIEVE_POINTER_internal_files_data(t->data);
wording W = inf->name;
package_request *P = Hierarchy::local_package_to(INTERNAL_FILES_HAP, inf->where_created);
inter_name *inf_iname = Hierarchy::make_iname_with_memo(INTERNAL_FILE_HL, P, W);
@<Make the internal value metadata@>;
2022-11-04 00:56:50 +02:00
@<Make the internal file metadata array@>;
2022-11-03 01:26:19 +02:00
}
@<Make the internal value metadata@> =
package_request *pack = RTInstances::package(inf->as_instance);
Hierarchy::apply_metadata_from_iname(pack, INSTANCE_FILE_VALUE_MD_HL, inf_iname);
2022-11-06 01:44:52 +02:00
Hierarchy::apply_metadata_from_filename(pack, INSTANCE_LEAFNAME_MD_HL,
inf->local_filename);
2022-11-03 01:26:19 +02:00
Hierarchy::apply_metadata_from_number(pack, INSTANCE_INTERNAL_FILE_FORMAT_MD_HL,
(inter_ti) inf->file_format);
2022-11-06 01:44:52 +02:00
Hierarchy::apply_metadata_from_number(pack, INSTANCE_INTERNAL_FILE_ID_MD_HL,
(inter_ti) inf->resource_id);
2022-11-04 00:56:50 +02:00
@<Make the internal file metadata array@> =
packaging_state save = EmitArrays::begin_word(inf_iname, K_value);
EmitArrays::iname_entry(Hierarchy::find(AUXF_MAGIC_VALUE_HL));
EmitArrays::iname_entry(Hierarchy::find(AUXF_STATUS_IS_CLOSED_HL));
EmitArrays::numeric_entry((inter_ti) inf->file_format);
EmitArrays::numeric_entry(0);
EmitArrays::numeric_entry((inter_ti) inf->resource_id);
EmitArrays::iname_entry(RTBibliographicData::IFID_iname());
EmitArrays::end(save);