X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=util.cpp;fp=util.cpp;h=085461988ed5f40440f1f2a478f704982d7f6a9d;hp=9b018825d333e269e3e0007b0300165af563b28f;hb=9a436a9406d5eb7fb01ada465a84034343e0c398;hpb=0b1705581552217b0e387bd687d65e4e3410ab91 diff --git a/util.cpp b/util.cpp index 9b01882..0854619 100644 --- a/util.cpp +++ b/util.cpp @@ -9,6 +9,7 @@ #include #include +#include "bundled_shaders.h" #include "fp16.h" #include "init.h" #include "util.h" @@ -84,18 +85,49 @@ void hsv2rgb_normalized(float h, float s, float v, float *r, float *g, float *b) } } +string read_file_from_bundle(const string &filename) +{ + for (const BundledShader *shader = bundled_shaders; shader->filename != nullptr; ++shader) { + if (shader->filename == filename) { + return string(shader_bundle + shader->offset, shader->length); + } + } + return ""; // Not found. +} + string read_file(const string &filename) { + string contents_from_bundle = read_file_from_bundle(filename); + + // If no data directory has been given, we read only from the bundle. + if (*movit_data_directory == "") { + if (contents_from_bundle.empty()) { + fprintf(stderr, "%s: Shader not compiled in, and no data directory has been given.\n", filename.c_str()); + exit(1); + } else { + return contents_from_bundle; + } + } + + // If we're given a data directory, we still support reading from the bundle, + // but a successful read from the file system takes priority. const string full_pathname = *movit_data_directory + "/" + filename; FILE *fp = fopen(full_pathname.c_str(), "r"); if (fp == nullptr) { + if (!contents_from_bundle.empty()) { + return contents_from_bundle; + } perror(full_pathname.c_str()); exit(1); } int ret = fseek(fp, 0, SEEK_END); if (ret == -1) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } perror("fseek(SEEK_END)"); exit(1); } @@ -104,6 +136,10 @@ string read_file(const string &filename) ret = fseek(fp, 0, SEEK_SET); if (ret == -1) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } perror("fseek(SEEK_SET)"); exit(1); } @@ -112,10 +148,18 @@ string read_file(const string &filename) str.resize(size); ret = fread(&str[0], size, 1, fp); if (ret == -1) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } perror("fread"); exit(1); } if (ret == 0) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } fprintf(stderr, "Short read when trying to read %d bytes from %s\n", size, full_pathname.c_str()); exit(1);