Commit Graph

12893 Commits

Author SHA1 Message Date
David Korth
a4efadbc56 NEWS.md: Mention issues #170 and #232. 2025-06-09 19:28:52 -04:00
David Korth
0e1a5ce237 [libromdata] ISO::loadFieldData(): Show the AUTORUN.INF fields in a new tab.
The fields are displayed as-is.

Changed autorun_inf from unordered_map<> to map<> for alphabetical sorting.
TODO: Preserve the original sort order?

TODO: Store the original key case?
2025-06-09 19:26:40 -04:00
David Korth
d557b607c2 [[libromdata] ISO: Only load the "[autorun]" section for now.
TODO: Read more sections later.
2025-06-09 19:21:47 -04:00
David Korth
1897ac198f [libromdata] ISO: Load the entire AUTORUN.INF for display purposes.
It's not displayed yet, but it's loaded.

The section names are concatenated with the key names, e.g.:
"autorun|icon"

IsoPartition::open(): Set m_lastError = ENOENT if the file isn't found.
2025-06-09 19:18:31 -04:00
David Korth
5083161c23 [librptexture] ICO: Fix regression that broke Win3.x icons; remove unneeded assert().
ICOPrivate::loadIconDirectory_Win3():
- rt == res.type *only* for Win1.x. For Win3.x, res.type is RT_GROUP_ICON
  or RT_GROUP_CURSOR. For Win1.x, it's RT_ICON or RT_CURSOR.

This fixes a regression from commit 22da0c2e21.
([libromdata] EXE: Load icons from Windows 1.x/2.x executables.)
2025-06-09 18:50:44 -04:00
David Korth
22da0c2e21 [libromdata] EXE: Load icons from Windows 1.x/2.x executables.
Windows 1.x/2.x does not have RT_GROUP_ICON. For NE executables,
check for RT_GROUP_ICON, and use it if found. Otherwise, check for
RT_ICON and use that if found.

IResourceReader: Add a function has_resource_type() to check if the
executable has any resources of the specified type.

[librptexture] ICO: Handle RT_ICON and RT_CURSOR as Windows 1.x/2.x.
TODO: Check the header to verify?
2025-06-09 18:37:47 -04:00
David Korth
8f762b7c78 ICOPrivate::ICOPrivate(): Return if the type is unrecognized.
Otherwise, dir.res will be allocated, with unpredictable results.
2025-06-09 18:30:01 -04:00
David Korth
acdf3544e1 [libromdata] NEResourceReader::lookup_resource_ID(): OR the type with 0x8000.
With Win16, the high bit needs to be set for ordinal resources.
Otherwise, it's a named resource, which we don't support right now.

Thumbnailing still worked because we were using the code path for
the "first" icon using NEResourceReader::open(), which had the
`| 0x8000` bit already.
2025-06-09 18:24:34 -04:00
David Korth
65a3855b98 [libromdata] NEResourceReaderPrivate::loadResTbl(): Fix an off-by-one error that broke reading resources from SkiFree 1.0.
SkiFree doesn't have any named resources, so its resource table ends
immediately after rscEndTypes. The off-by-one prevented us from
recognizing the presence of rscEndTypes.

SKI.EXE can now be thumbnailed.
2025-06-09 18:11:03 -04:00
David Korth
847342306a [libromdata] NEResourceReaderPrivate::loadResTbl(): Allow string names for now.
Some Windows 3.1 programs, e.g. CALC.EXE, have RT_GROUP_ICONs that use
string names. We need to allow this in order to thumbnail CALC.EXE.
2025-06-09 18:08:50 -04:00
David Korth
3fdd98929d [libromdata] IsoPartition: Update the "\x00" and "\x01" comments. 2025-06-08 16:10:11 -04:00
David Korth
41765be492 NEWS.md: Mention the ISO and Windows icon changes. 2025-06-08 15:53:24 -04:00
David Korth
4342ce8a1b [libromdata] ISO, IsoPartition: Simplify the Joliet escape sequence parser a bit. 2025-06-08 15:29:25 -04:00
David Korth
6e7d57282f [libromdata] ISO: Show the Joliet level.
Some checks are pending
Codecov / run (push) Waiting to run
I was considering exporting this from IsoPartition, but the IsoPartition
isn't accessible at this point. We're reading all of the volume
descriptors in checkVolumeDescriptors() anyway, so that sets a local
version of jolietSVDType, which is then checked in loadFieldData().
2025-06-08 15:00:39 -04:00
David Korth
3f1f92b18a [libromdata] IsoPartition: Add basic support for Joliet directories.
If a Supplementary Volume Descriptor is present, check for the Joliet
UCS-2 escape sequences. If found, use the SVD root directory.

Filenames in the SVD root directory are encoded in UCS-2 (big-endian).
The filename length is in bytes, not code points.

NOTE: Currently using a very cheap hack to convert UCS-2 to cp1252,
or more accurately, ISO-8859-1. It's good enough for our purposes
for now. (specifically, getting the icon from AUTORUN.INF.)

TODO: Better character set conversion.
2025-06-08 14:46:56 -04:00
David Korth
a5d22511e0 [libromdata] IsoPartition::readdir(): If there's no more non-zero bytes, return nullptr.
Otherwise, an empty IFst::DirEnt is returned.
2025-06-08 14:44:49 -04:00
David Korth
618c7c6a8d [librptexture] ICO: Fix an implicit cast warning on 64-bit MSVC.
Some checks are pending
Codecov / run (push) Waiting to run
src\librptexture\fileformat\ICO.cpp(642,11): warning C4267: '+=':
	conversion from 'size_t' to 'unsigned int', possible loss of data
2025-06-08 13:07:55 -04:00
David Korth
9a4ab48ccb [libromdata] RomDataFactory: s/exe/ext/
This fixes a Windows build regression from commit 9994c2df94.
([libromdata] RomDataFactory: Explicitly prevent ".ico" and ".cur" from being thumbnailed on Windows.)
2025-06-08 13:05:31 -04:00
David Korth
64fe76a285 [librpbase] exe_res_structs.h: Don't re-define version resource stuff if winver.h is already included.
This should fix the Windows build.
2025-06-08 13:04:12 -04:00
David Korth
993e52084d [librpbase] IResourceReader: New function lookup_resource_ID().
This function takes a zero-based index and returns a resource ID for
the given resource type if it's within range. Otherwise, it returns
a negative POSIX error code.

[libromdata] PEResourceReader, NEResourceReader: Implement it.

[libromdata] EXE: Use lookup_resource_ID for positive icon indexes.

This fixes thumbnailing for discs whose AUTORUN.INF specify a
positive, non-zero icon index.

TODO: Older discs may have truncated ISO-9660 filenames. Need to
parse Joliet file systems, maybe...
2025-06-08 12:44:35 -04:00
David Korth
55cad0ad98 [libromdata] ISO: Parse the icon index for EXE/DLL autorun icons.
The icon index can be:
- 0: First icon
- >0: Zero-based icon index
- <0: Resource ID

EXE: New function loadSpecificIcon() to load an icon given an index.
For iconindex == 0, the icon is cached in d->img_icon.

TODO: Implement a function in IResourceReader to look up a resource ID
from the zero-based index.
2025-06-08 12:23:37 -04:00
David Korth
93e78417e0 [libromdata] ISO: Load AUTORUN.INF icons from EXEs and/or DLLs.
TODO: Handle the icon index.
2025-06-08 11:54:45 -04:00
David Korth
453461e8fb [librptexture] ICOPrivate::loadImage_Win3(): Need to skip the BITMAPINFOHEADER when parsing resource icons.
This fixes the corrupted 128x128 VBoxGuestAdditions.exe icon.
2025-06-08 11:54:34 -04:00
David Korth
f5be3c81a4 [libromdata] EXE: Add icon thumbnailing using librptexture's ICO class.
Uses the first icon in the first available language.

New function loadResourceReader() which ensures rsrcReader is loaded.

[librptexture] ICO: Fix resource loading issues:

- Use the correct resource file pointer, not this->file.
- Add IconRes_Win3 and CursorRes_Win3 cases where appropriate.
- Ensure d->iconType doesn't get overwritten after it's set by the
  ICOPrivate constructor for resources.

FIXME: VBoxWindowsAdditions.exe's PNG icon loads fine, but the 128x128
"regular" icon is corrupted.
2025-06-08 11:40:59 -04:00
David Korth
9994c2df94 [libromdata] RomDataFactory: Explicitly prevent ".ico" and ".cur" from being thumbnailed on Windows.
Also add a note saying EXE shouldn't be registered for thumbnailing,
either.

This will still allow using `rpcli`, and for subclasses to use
EXE to thumbnail e.g. ISO images.
2025-06-08 11:12:06 -04:00
David Korth
6026b40df5 [libromdata] PlayStationDiscPrivate::loadSystemCnf(): Use a constant for the SYSTEM.CNF maximum size. 2025-06-08 02:33:38 -04:00
David Korth
409915591d [libromdata] ISOPrivate::loadIcon(): f_file.reset() isn't needed here. 2025-06-08 02:31:45 -04:00
David Korth
8c5888e9e5 [librptexture] ICO: Rework to support loading from Windows resources.
Some checks are pending
Codecov / run (push) Waiting to run
NOT TESTED; need to add it to the EXE class to test it.
(.ico files still work as they did before.)

Added a constructor that takes an IResourceReaderPtr and the
type/id/lang of the icon. Type should be RT_GROUP_ICON or
RT_GROUP_CURSOR. These are all saved in icodir_res.

The dir union is now initialized in the ICOPrivate constructors,
and is only reset in the ICOPrivate destructor.

loadImage_Win3(): Use a new IRpFilePtr for the icon data.
- For .ico, it's a copy of this->file.
- For Windows executables, it's opened from the IResourceReader.
- Starting address is the icon bitmap address for .ico and
  0 for IResourceReader.
2025-06-08 00:14:28 -04:00
David Korth
d0fb8dc73e [libromdata] ISO::imgpf(): Remove unused RP_D() for now, and an extra 'break;' statement.
In file included from src/libromdata/stdafx.h:63,
                 from src/libromdata/Media/ISO.cpp:10:
src/libromdata/Media/ISO.cpp: In member function ‘virtual uint32_t LibRomData::ISO::imgpf(LibRpBase::RomData::ImageType) const’:
src/libromdata/../common.h:93:45: warning: unused variable ‘d’ [-Wunused-variable]
   93 | #  define RP_D(klass) klass##Private *const d = static_cast<klass##Private*>(d_ptr)
      |                                             ^
src/libromdata/Media/ISO.cpp:984:9: note: in expansion of macro ‘RP_D’
  984 |         RP_D(const ISO);
      |         ^~~~
2025-06-07 23:30:31 -04:00
David Korth
a837c883ee [librptexture] FileFormat_decl.hpp: -'file' 2025-06-07 23:29:08 -04:00
David Korth
44ad904c71 Move IResourceReader from libromdata to librpbase.
This will allow us to use it in librptexture's ICO handler.
2025-06-07 23:26:31 -04:00
David Korth
b3b6eb5b37 [librptexture] CMakeLists.txt: Add ico_structs.h. 2025-06-07 23:19:03 -04:00
David Korth
95bcbc25fb [librptexture] ICO: Use a union of structs containing the different types of directory entries.
This is a bit cleaner than the casting method, though it is a bit messy
at points.

isResource(): Returns true if it's an icon from a resource.
(Currently not set at all...)

reset_dir_union(): Clear the directory union. Called in ICOPrivate's
destructor and various error paths.

TODO: Add resource loading. May need to move IResourceReader from
libromdata to librpbase.
2025-06-07 23:15:15 -04:00
David Korth
821155bd83 [librptexture] ICO: Initial reworking to handle icons from .exe/.dll resources.
ICONDIR and GRPICONDIR are basically the same, but ICONDIRENTRY and
GRPICONDIRENTRY have different sizes. Use an rp::uvector<uint8_t>
and casting to handle this.

Still only supports .ico files for now.
2025-06-07 23:09:45 -04:00
David Korth
e765792ebb [libromdata] ISO: Initial support for AUTORUN.INF icons.
Limitations:
- Only supports .ico, not .exe.
- The filename must match the ISO-9660 filename. Some older Win9x
  discs use a long filename in AUTORUN.INF that's only listed as
  such in the Joliet extension.

Removed some debugging code from the IsoPartition readdir()
implementation testing from earlier.
2025-06-07 22:38:31 -04:00
David Korth
194b3dcf61 [librptexture] fromLinearCI8(): Require 32-bit palettes for all Host_* and Swap_* formats.
TODO:
- More formats?
- Add a table mapping pixel format to bpp?
2025-06-07 22:05:56 -04:00
David Korth
8378697be1 [librptexture] ICOPrivate::loadImage_Win3(): Use Host_ARGB32, not Host_xRGB32, for the palette.
fromLinearCI4() doesn't support Host_xRGB32, and we're filling
in the alpha channel ourselves.

TODO: Add Host_xRGB32 support to fromLinearCI4()?
fromLinearCI8() supports it...

This fixes a regression from commit de802835f7.
([librptexture] ICO: Handle 8-bit color icons.)
2025-06-07 22:03:17 -04:00
David Korth
1caf44d15e [librptexture] ICO: Select the best icon image.
First, the image size is checked. If either width or height are larger
than the previously-selected image, this image is picked. Otherwise,
if the size is identical (both width and height), and bitcount is
higher, then the image is selected.

TODO: Better non-square icon handling? (Use "largest area"?)
2025-06-07 21:50:37 -04:00
David Korth
fbdeae25a5 [librptexture] ICO: Load all of the icon bitmap headers.
Next step is to actually go through them and pick the "best" one.
2025-06-07 21:35:16 -04:00
David Korth
de802835f7 [librptexture] ICO: Handle 8-bit color icons.
- Forgot to move convimg to img when converting from CI8 to ARGB32.

- Make sure sBIT is updated with alpha=1. Otherwise, RpPng::save()
  will tell libpng that there's no alpha, so the resulting PNG image
  saved using `rpcli -x3` won't be transparent.
2025-06-07 21:27:47 -04:00
David Korth
1c96133917 [librptexture] ICO: Divide the bitmap height by 2 for d->dimensions[1].
The ICONDIR height is correct, but the bitmap height is double-sized
because it includes the mask.
2025-06-07 21:19:54 -04:00
David Korth
d01201a184 [librptexture] ICO: Save the icon image header and get sizes for BITMAPCOREHEADER and PNG.
iconHeader is now saved in the private class instead of being loaded
in loadImage_Win3().

The dimensions are now set correctly when an icon's "best" image is
in PNG format.

ico_structs.h: Add PNG chunks.
2025-06-07 21:15:50 -04:00
David Korth
f6e5229b72 [librptexture] ICO: Load PNG-format icon images.
FIXME: Dimensions are still incorrect, since the ICONDIR dimensions
are 0 for 256x256. We should get the dimensions from IHDR instead.
2025-06-07 21:04:18 -04:00
David Korth
fe85d93fc3 [librptexture] ICOPrivate::loadImage_Win3(): Add support for 32-bit ARGB icons.
NOTE: BI_BITFIELDS is not supported right now. (Is that even used for
32-bit ARGB, or is it for 16/24 only?)

Fix mask handling for 48x48 icons by aligning stride to 32-bit.
2025-06-07 20:52:45 -04:00
David Korth
7edb6df2e4 [librptexture] ICOPrivate::loadImage_Win3(): Apply the icon mask for 8bpp and higher icons.
NOTE: Not tested yet!

Remove an unused variable that was used when debugging masks.
The variable counted the number of mask bytes that were processed.
2025-06-07 20:25:16 -04:00
David Korth
eb5300413b [librptexture] ICOPrivate::loadImage_Win3(): Apply the icon mask for 1bpp, 2bpp, and 4bpp icons.
For these icons, an extra transparent color is added.

The image is flipped *after* the mask is applied because the mask is
also upside-down.

TODO:
- Set sBIT.
- Apply the icon mask for CI8 and higher-color icons. (CI8 will need to
  be converted to ARGB32.)
2025-06-07 20:21:22 -04:00
David Korth
37dd0c3ffe [librptexture] ICOPrivate::loadImage_Win3(): Fix mask_data address for upside-down bitmaps.
This seems to place the mask image at the top of the image once it's
flipped, but maybe it's that it's technically two bitmaps and not
one giant bitmap.

TODO: Test it with a right-side up icon.
2025-06-07 20:18:10 -04:00
David Korth
af2c512181 [librptexture] ICO: Initial support for Windows 3.x icons.
The entire icon directory is loaded, but currently the first icon is
loaded instead of selecting the "best" icon.

NOTE: Windows Vista and later determines the "best" icon by looking at
the BITMAPINFOHEADER, not the icon directory. We'll do that too.

loadImage_Win3(): Added support for loading 16-color icons, including
the palette (color table). The mask is loaded, but it isn't applied
yet.

TODO:
- Support more icon formats.
- Apply the mask.
- Determine if the mask isn't present? (e.g. in 32-bit icons)
2025-06-07 19:57:19 -04:00
David Korth
b02a2b8009 [librptexture] ICO: Remove duplicated code from the Qoi handler.
I used Qoi.cpp as a base for ICO.cpp.
2025-06-07 18:29:09 -04:00
David Korth
081d4a4b87 [librptexture] fromLinearMono_WinIcon(): Use white for INVERT.
This at least allows it to show up at all, whereas before it was
showing up as completely transparent.
2025-06-07 18:27:26 -04:00