From 094c007fb5d854394338b66ef64b69c2114e9bc9 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 5 Feb 2022 13:59:40 -0500 Subject: rendfont.cpp: Modest refactoring - Use ioprocs classes rather than emu_file in various helper functions - Make save_cached take an already-open file (like load_cached) rather than a filename - Make load_cached_bdf take a std::string_view - Change some osd_printf_warnings to osd_printf_info --- src/emu/rendfont.cpp | 120 ++++++++++++++++++++++++++++++--------------------- src/emu/rendfont.h | 6 +-- 2 files changed, 74 insertions(+), 52 deletions(-) diff --git a/src/emu/rendfont.cpp b/src/emu/rendfont.cpp index ae295e39e2d..9984bf9497b 100644 --- a/src/emu/rendfont.cpp +++ b/src/emu/rendfont.cpp @@ -121,13 +121,15 @@ public: static constexpr unsigned MAJVERSION = 1; static constexpr unsigned MINVERSION = 0; - bool read(emu_file &f) + bool read(util::read_stream &f) { - return f.read(m_data, sizeof(m_data)) == sizeof(m_data); + std::size_t actual(0); + return !f.read(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); } - bool write(emu_file &f) + bool write(util::write_stream &f) { - return f.write(m_data, sizeof(m_data)) == sizeof(m_data); + std::size_t actual(0); + return !f.write(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); } bool check_magic() const @@ -593,10 +595,9 @@ render_font::render_font(render_manager &manager, const char *filename) } // load the compiled in data instead - emu_file ramfile(OPEN_FLAG_READ); - std::error_condition const filerr(ramfile.open_ram(font_uismall, sizeof(font_uismall))); - if (!filerr) - load_cached(ramfile, 0, 0); + util::random_read::ptr ramfile = util::ram_read(font_uismall, sizeof(font_uismall)); + if (ramfile) + load_cached(*ramfile, 0, 0); render_font_command_glyph(); } @@ -906,11 +907,11 @@ float render_font::utf8string_width(float height, float aspect, std::string_view // and create a new cached version //------------------------------------------------- -bool render_font::load_cached_bdf(const char *filename) +bool render_font::load_cached_bdf(std::string_view filename) { std::error_condition filerr; u32 chunk; - u64 bytes; + std::size_t bytes; // first try to open the BDF itself emu_file file(m_manager.machine().options().font_path(), OPEN_FLAG_READ); @@ -943,9 +944,7 @@ bool render_font::load_cached_bdf(const char *filename) u32 const hash(core_crc32(0, reinterpret_cast(&m_rawdata[0]), bytes)); // create the cached filename, changing the 'F' to a 'C' on the extension - std::string cachedname(filename); - if ((4U < cachedname.length()) && !core_stricmp(&cachedname[cachedname.length() - 4], ".bdf")) - cachedname.erase(cachedname.length() - 4); + std::string cachedname(filename, 0, filename.length() - ((4U < filename.length()) && core_filename_ends_with(filename, ".bdf") ? 4 : 0)); cachedname.append(".bdc"); // attempt to open the cached version of the font @@ -978,11 +977,25 @@ bool render_font::load_cached_bdf(const char *filename) m_rawdata[m_rawsize] = '\0'; // load the BDF - bool const result = load_bdf(); + bool result = load_bdf(); // if we loaded okay, create a cached one if (result) - save_cached(cachedname.c_str(), m_rawsize, hash); + { + osd_printf_info("Generating cached BDF font...\n"); + + // attempt to open the file + emu_file cachefile(m_manager.machine().options().font_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE); + filerr = cachefile.open(cachedname); + if (filerr) + result = false; + else + { + result = save_cached(cachefile, m_rawsize, hash); + if (!result) + cachefile.remove_on_close(); + } + } else m_rawdata.clear(); @@ -1324,7 +1337,7 @@ bool render_font::load_bdf() // some progress for big fonts if (0 == (++charcount % 256)) - osd_printf_warning("Loading BDF font... (%d characters loaded)\n", charcount); + osd_printf_info("Loading BDF font... (%d characters loaded)\n", charcount); } } @@ -1344,12 +1357,17 @@ bool render_font::load_bdf() // load_cached - load a font in cached format //------------------------------------------------- -bool render_font::load_cached(emu_file &file, u64 length, u32 hash) +bool render_font::load_cached(util::random_read &file, u64 length, u32 hash) { // get the file size, read the header, and check that it looks good - u64 const filesize(file.size()); + u64 filesize; bdc_header header; - if (!header.read(file)) + if (file.length(filesize)) + { + LOG("render_font::load_cached: error determining size of BDC file\n"); + return false; + } + else if (!header.read(file)) { osd_printf_warning("render_font::load_cached: error reading BDC header\n"); return false; @@ -1371,14 +1389,20 @@ bool render_font::load_cached(emu_file &file, u64 length, u32 hash) m_yoffs = header.get_y_offset(); m_defchar = header.get_default_character(); u32 const numchars(header.get_glyph_count()); - if ((file.tell() + (u64(numchars) * bdc_table_entry::size())) > filesize) + u64 filepos; + if (file.tell(filepos)) + { + LOG("render_font::load_cached: failed to determine position in BDC file\n"); + return false; + } + else if ((filepos + (u64(numchars) * bdc_table_entry::size())) > filesize) { LOG("render_font::load_cached: BDC file is too small to hold glyph table\n"); return false; } // now read the rest of the data - u64 const remaining(filesize - file.tell()); + u64 const remaining(filesize - filepos); try { m_rawdata.resize(std::size_t(remaining)); @@ -1390,7 +1414,8 @@ bool render_font::load_cached(emu_file &file, u64 length, u32 hash) for (u64 bytes_read = 0; remaining > bytes_read; ) { u32 const chunk((std::min)(u64(std::numeric_limits::max()), remaining)); - if (file.read(&m_rawdata[bytes_read], chunk) != chunk) + std::size_t bytes(0); + if (file.read(&m_rawdata[bytes_read], chunk, bytes) || bytes != chunk) { osd_printf_error("render_font::load_cached: error reading BDC data\n"); m_rawdata.clear(); @@ -1450,16 +1475,8 @@ bool render_font::load_cached(emu_file &file, u64 length, u32 hash) // save_cached - save a font in cached format //------------------------------------------------- -bool render_font::save_cached(const char *filename, u64 length, u32 hash) +bool render_font::save_cached(util::random_write &file, u64 length, u32 hash) { - osd_printf_warning("Generating cached BDF font...\n"); - - // attempt to open the file - emu_file file(m_manager.machine().options().font_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE); - std::error_condition const filerr = file.open(filename); - if (filerr) - return false; - // count glyphs unsigned numchars = 0; for (glyph const *const page : m_glyphs) @@ -1474,8 +1491,6 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash) try { - u32 bytes_written; - { LOG("render_font::save_cached: writing header\n"); bdc_header hdr; @@ -1490,7 +1505,9 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash) if (!hdr.write(file)) throw emu_fatalerror("Error writing cached file"); } - u64 const table_offs(file.tell()); + u64 table_offs; + if (file.tell(table_offs)) + throw emu_fatalerror("Error writing cached file"); // allocate an array to hold the character data std::vector chartable(std::size_t(numchars) * bdc_table_entry::size(), 0); @@ -1499,8 +1516,8 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash) std::vector tempbuffer(65536); // write the empty table to the beginning of the file - bytes_written = file.write(&chartable[0], chartable.size()); - if (bytes_written != chartable.size()) + std::size_t bytes_written(0); + if (file.write(&chartable[0], chartable.size(), bytes_written) || bytes_written != chartable.size()) throw emu_fatalerror("Error writing cached file"); // loop over all characters @@ -1543,8 +1560,7 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash) *dest++ = accum; // write the data - bytes_written = file.write(&tempbuffer[0], dest - &tempbuffer[0]); - if (bytes_written != dest - &tempbuffer[0]) + if (file.write(&tempbuffer[0], dest - &tempbuffer[0], bytes_written) || bytes_written != dest - &tempbuffer[0]) throw emu_fatalerror("Error writing cached file"); // free the bitmap and texture @@ -1568,13 +1584,13 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash) if (!chartable.empty()) { LOG("render_font::save_cached: writing character table\n"); - file.seek(table_offs, SEEK_SET); + if (file.seek(table_offs, SEEK_SET)) + return false; u8 const *bytes(&chartable[0]); for (u64 remaining = chartable.size(); remaining; ) { u32 const chunk((std::min)(std::numeric_limits::max(), remaining)); - bytes_written = file.write(bytes, chunk); - if (chunk != bytes_written) + if (file.write(bytes, chunk, bytes_written) || chunk != bytes_written) throw emu_fatalerror("Error writing cached file"); bytes += chunk; remaining -= chunk; @@ -1586,7 +1602,6 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash) } catch (...) { - file.remove_on_close(); return false; } } @@ -1595,13 +1610,13 @@ bool render_font::save_cached(const char *filename, u64 length, u32 hash) void render_font::render_font_command_glyph() { // FIXME: this is copy/pasta from the BDC loading, and it shouldn't be injected into every font - emu_file file(OPEN_FLAG_READ); - if (!file.open_ram(font_uicmd14, sizeof(font_uicmd14))) + util::random_read::ptr file = util::ram_read(font_uicmd14, sizeof(font_uicmd14)); + if (file) { // get the file size, read the header, and check that it looks good - u64 const filesize(file.size()); + u64 const filesize = sizeof(font_uicmd14); bdc_header header; - if (!header.read(file)) + if (!header.read(*file)) { osd_printf_warning("render_font::render_font_command_glyph: error reading BDC header\n"); return; @@ -1616,14 +1631,20 @@ void render_font::render_font_command_glyph() m_height_cmd = header.get_height(); m_yoffs_cmd = header.get_y_offset(); u32 const numchars(header.get_glyph_count()); - if ((file.tell() + (u64(numchars) * bdc_table_entry::size())) > filesize) + u64 filepos; + if (file->tell(filepos)) + { + LOG("render_font::render_font_command_glyph: failed to determine position in BDC file\n"); + return; + } + else if ((filepos + (u64(numchars) * bdc_table_entry::size())) > filesize) { LOG("render_font::render_font_command_glyph: BDC file is too small to hold glyph table\n"); return; } // now read the rest of the data - u64 const remaining(filesize - file.tell()); + u64 const remaining(filesize - filepos); try { m_rawdata_cmd.resize(std::size_t(remaining)); @@ -1635,7 +1656,8 @@ void render_font::render_font_command_glyph() for (u64 bytes_read = 0; remaining > bytes_read; ) { u32 const chunk((std::min)(u64(std::numeric_limits::max()), remaining)); - if (file.read(&m_rawdata_cmd[bytes_read], chunk) != chunk) + std::size_t bytes(0); + if (file->read(&m_rawdata_cmd[bytes_read], chunk, bytes) || bytes != chunk) { osd_printf_error("render_font::render_font_command_glyph: error reading BDC data\n"); m_rawdata_cmd.clear(); diff --git a/src/emu/rendfont.h b/src/emu/rendfont.h index 15f6754657b..2d812860ae4 100644 --- a/src/emu/rendfont.h +++ b/src/emu/rendfont.h @@ -82,10 +82,10 @@ private: // helpers glyph &get_char(char32_t chnum); void char_expand(char32_t chnum, glyph &ch); - bool load_cached_bdf(const char *filename); + bool load_cached_bdf(std::string_view filename); bool load_bdf(); - bool load_cached(emu_file &file, u64 length, u32 hash); - bool save_cached(const char *filename, u64 length, u32 hash); + bool load_cached(util::random_read &file, u64 length, u32 hash); + bool save_cached(util::random_write &file, u64 length, u32 hash); void render_font_command_glyph(); -- cgit v1.2.3