mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:07:35 +00:00
WindowServer: In HighDPI mode, load high-res window buttons and high-res cursors
Bitmap::load_from_file("foo.png", 2) will now look for "foo-2x.png" and try load that as a bitmap with scale factor 2 if it exists. If it doesn't, it falls back to the 1x bitmap as normal. Only places that know that they'll draw the bitmap to a 2x painter should pass "2" for the second argument. Use this new API in WindowServer for loading window buttons and cursors. As a testing aid, ctrl-shift-super-i can force HighDPI icons off in HighDPI mode. Toggling between low-res and high-res icons makes it easy to see if the high-res version of an icon looks right: It should look like the low-res version, just less jaggy. We'll likely have to grow a better API for loading scaled resources, but for now this suffices. Things to check: - `chres 640 480` followed by `chres 640 480 2` followed by `chres 640 480` - window buttons in window context menu (in task bar and on title bar) still have low-res icons - ctrl-shift-super-i in high-res mode toggles sharpness of window buttons and of arrow cursorf - arrow cursor hotspot is still where you'd expect
This commit is contained in:
parent
5ad2cbe9ad
commit
98637bd549
8 changed files with 86 additions and 18 deletions
|
@ -25,6 +25,7 @@
|
|||
*/
|
||||
|
||||
#include <AK/Checked.h>
|
||||
#include <AK/LexicalPath.h>
|
||||
#include <AK/Memory.h>
|
||||
#include <AK/MemoryStream.h>
|
||||
#include <AK/Optional.h>
|
||||
|
@ -141,8 +142,33 @@ RefPtr<Bitmap> Bitmap::create_wrapper(BitmapFormat format, const IntSize& size,
|
|||
return adopt(*new Bitmap(format, size, scale_factor, pitch, data));
|
||||
}
|
||||
|
||||
RefPtr<Bitmap> Bitmap::load_from_file(const StringView& path)
|
||||
RefPtr<Bitmap> Bitmap::load_from_file(const StringView& path, int scale_factor)
|
||||
{
|
||||
if (scale_factor > 1 && path.starts_with("/res/")) {
|
||||
LexicalPath lexical_path { path };
|
||||
StringBuilder highdpi_icon_path;
|
||||
highdpi_icon_path.append(lexical_path.dirname());
|
||||
highdpi_icon_path.append("/");
|
||||
highdpi_icon_path.append(lexical_path.title());
|
||||
highdpi_icon_path.appendf("-%dx.", scale_factor);
|
||||
highdpi_icon_path.append(lexical_path.extension());
|
||||
|
||||
RefPtr<Bitmap> bmp;
|
||||
#define __ENUMERATE_IMAGE_FORMAT(Name, Ext) \
|
||||
if (path.ends_with(Ext, CaseSensitivity::CaseInsensitive)) \
|
||||
bmp = load_##Name(highdpi_icon_path.to_string());
|
||||
ENUMERATE_IMAGE_FORMATS
|
||||
#undef __ENUMERATE_IMAGE_FORMAT
|
||||
if (bmp) {
|
||||
ASSERT(bmp->width() % scale_factor == 0);
|
||||
ASSERT(bmp->height() % scale_factor == 0);
|
||||
bmp->m_size.set_width(bmp->width() / scale_factor);
|
||||
bmp->m_size.set_height(bmp->height() / scale_factor);
|
||||
bmp->m_scale = scale_factor;
|
||||
return bmp;
|
||||
}
|
||||
}
|
||||
|
||||
#define __ENUMERATE_IMAGE_FORMAT(Name, Ext) \
|
||||
if (path.ends_with(Ext, CaseSensitivity::CaseInsensitive)) \
|
||||
return load_##Name(path);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue