Every VideoCommon message goes through the printf log and alert macros,
PRIM_LOG included; a register field or an enum in a message is printed
as its number.
The names built along the way no longer go through fmt:
- a texture's name parts (its size, hashes and format) are formatted
into buffers on the stack, and the wildcard names concatenated;
- an EFB or XFB copy's name and dump path are made by one helper, from
an id formatted on the stack;
- dump paths, graphics mod paths and group names are concatenated;
- the projection lookup key is formatted on the stack, on the heap only
when a name runs past it, as before;
- the format overlay draws TextureFormatName, a constant string.
The no-op LOG_NORM and LOG_VTX macros, commented out since they were
added, are gone. The register formatters in the headers stay until the
assertions move over.
Texture bytes travel as a TexBytes, a pointer and a size, where they
were a std::span<const u8>: TMEM and RAM runs into TextureInfo and its
mip levels, and the texel decoders the software renderer samples
through. Reads past the end still give zeros, now through three small
readers in TextureDecoder_Common, and TexBytesSkip() steps past a level
as SafeSubspan() did.
LoadPNGTexture() takes a pointer and a size. Metal's bounding box,
which the build does not compile, gets the Read() and Write() the other
backends have. GraphicsModGroup sorted its mods with std::ranges::sort,
whose <algorithm> came in through SpanUtils.h; an insertion sort by
weight takes its place, keeping mods of equal weight in load order.
SHA1, HMAC, hex dumps, PNG loading, file search, DHCP options, HTTP
posts and DirectIOFile reads and writes take pointer plus size; callers
pass their buffers straight through. Contains.h is gone; lookups are
plain loops. File search and FAT FST sorting are in-place heap sorts;
min/max/clamp/copy/fill become ternaries, memcpy and memset. Watch
string import and export had no callers and are removed.
Achievement badges/icons are refactored into the type CustomTextureData::ArraySlice::Level as that is the data type images loaded from the filesystem will be. This includes everything that uses the badges in the Qt UI and OnScreenDisplay, and similarly removes the OSD::Icon type because Level already contains that information.