1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-05-06 19:18:36 +03:00
inform7/inform7/runtime-module/Chapter 5/Multimedia.w
2022-11-05 23:44:52 +00:00

149 lines
5.6 KiB
OpenEdge ABL

[RTMultimedia::] Multimedia.
To compile the multimedia submodule for a compilation unit, which contains
_external_file, _figure and _sound packages.
@ Everything is done here:
=
void RTMultimedia::compile_files(void) {
files_data *exf;
LOOP_OVER(exf, files_data) {
text_stream *desc = Str::new();
WRITE_TO(desc, "external file '%W'", exf->name);
Sequence::queue(&RTMultimedia::compilation_agent,
STORE_POINTER_files_data(exf), desc);
}
}
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);
}
}
void RTMultimedia::compile_figures(void) {
figures_data *bf;
LOOP_OVER(bf, figures_data) {
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);
}
}
void RTMultimedia::compile_sounds(void) {
sounds_data *bs;
LOOP_OVER(bs, sounds_data) {
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);
}
}
@ Files are made with the following agent, which makes a single |_external_file| package:
=
void RTMultimedia::compilation_agent(compilation_subtask *t) {
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);
TEMPORARY_TEXT(II)
WRITE_TO(II, "//%S//", exf->IFID_of_owner);
LOOP_THROUGH_TEXT(pos, II)
EmitArrays::numeric_entry((inter_ti) Str::get(pos));
DISCARD_TEXT(II)
EmitArrays::end(save);
@<Make the file metadata array@> =
packaging_state save = EmitArrays::begin_word(exf_iname, K_value);
EmitArrays::iname_entry(Hierarchy::find(AUXF_MAGIC_VALUE_HL));
EmitArrays::iname_entry(Hierarchy::find(AUXF_STATUS_IS_CLOSED_HL));
if (exf->file_is_binary) EmitArrays::numeric_entry(EXTERNAL_BINARY_FILE_NFSMF);
else EmitArrays::numeric_entry(EXTERNAL_TEXT_FILE_NFSMF);
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@> =
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;
}
@ 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@>;
@<Make the internal file metadata array@>;
}
@<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);
Hierarchy::apply_metadata_from_filename(pack, INSTANCE_LEAFNAME_MD_HL,
inf->local_filename);
Hierarchy::apply_metadata_from_number(pack, INSTANCE_INTERNAL_FILE_FORMAT_MD_HL,
(inter_ti) inf->file_format);
Hierarchy::apply_metadata_from_number(pack, INSTANCE_INTERNAL_FILE_ID_MD_HL,
(inter_ti) inf->resource_id);
@<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);