diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm index 591fc7daf0..c81701be9e 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm @@ -929,8 +929,11 @@ CGContextRef juce_getImageContext (const Image& image) #endif #if JUCE_MAC - NSImage* imageToNSImage (const Image& image, float scaleFactor) + NSImage* imageToNSImage (const ScaledImage& scaled) { + const auto image = scaled.getImage(); + const auto scaleFactor = scaled.getScale(); + JUCE_AUTORELEASEPOOL { NSImage* im = [[NSImage alloc] init]; diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h b/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h index 9879b6475d..89c9cf99fe 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h @@ -102,7 +102,7 @@ CGContextRef juce_getImageContext (const Image&); #endif #if JUCE_MAC - NSImage* imageToNSImage (const Image& image, float scaleFactor = 1.0f); + NSImage* imageToNSImage (const ScaledImage& image); #endif } // namespace juce diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp index 5d913cac44..50cafa82b8 100644 --- a/modules/juce_gui_basics/juce_gui_basics.cpp +++ b/modules/juce_gui_basics/juce_gui_basics.cpp @@ -127,15 +127,8 @@ namespace juce struct CustomMouseCursorInfo { - CustomMouseCursorInfo() = default; - - CustomMouseCursorInfo (const Image& im, Point hs, float scale = 1.0f) noexcept - : image (im), hotspot (hs), scaleFactor (scale) - {} - - Image image; + ScaledImage image; Point hotspot; - float scaleFactor = 1.0f; }; } // namespace juce diff --git a/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp b/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp index ea69da45f7..9fa5bd1639 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp @@ -36,14 +36,14 @@ public: { } - SharedCursorHandle (const Image& image, Point hotSpot, float scaleFactor) - : info { image, hotSpot, scaleFactor }, + SharedCursorHandle (const ScaledImage& image, Point hotSpot) + : info { image, hotSpot }, handle (info), standardType (MouseCursor::NormalCursor), standard (false) { // your hotspot needs to be within the bounds of the image! - jassert (image.getBounds().contains (hotSpot)); + jassert (image.getImage().getBounds().contains (hotSpot)); } static std::shared_ptr createStandard (const MouseCursor::StandardCursorType type) @@ -92,12 +92,17 @@ MouseCursor::MouseCursor (const StandardCursorType type) } MouseCursor::MouseCursor (const Image& image, int hotSpotX, int hotSpotY) - : MouseCursor (image, hotSpotX, hotSpotY, 1.0f) + : MouseCursor (ScaledImage (image), { hotSpotX, hotSpotY }) { } MouseCursor::MouseCursor (const Image& image, int hotSpotX, int hotSpotY, float scaleFactor) - : cursorHandle (std::make_shared (image, Point { hotSpotX, hotSpotY }, scaleFactor)) + : MouseCursor (ScaledImage (image, scaleFactor), { hotSpotX, hotSpotY }) +{ +} + +MouseCursor::MouseCursor (const ScaledImage& image, Point hotSpot) + : cursorHandle (std::make_shared (image, hotSpot)) { } diff --git a/modules/juce_gui_basics/mouse/juce_MouseCursor.h b/modules/juce_gui_basics/mouse/juce_MouseCursor.h index 23bea4de05..50140a43f6 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseCursor.h +++ b/modules/juce_gui_basics/mouse/juce_MouseCursor.h @@ -103,6 +103,16 @@ public: */ MouseCursor (const Image& image, int hotSpotX, int hotSpotY, float scaleFactor); + /** Creates a custom cursor from an image. + + @param image the image to use for the cursor - if this is bigger than the + system can manage, it might get scaled down first, and might + also have to be turned to black-and-white if it can't do colour + cursors. + @param hotSpot the position of the cursor's hotspot within the image + */ + MouseCursor (const ScaledImage& image, Point hotSpot); + //============================================================================== /** Creates a copy of another cursor object. */ MouseCursor (const MouseCursor&); diff --git a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp index d87c1ebe0b..e81cc47ddc 100644 --- a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp @@ -674,7 +674,9 @@ public: private: static Cursor makeHandle (const CustomMouseCursorInfo& info) { - return XWindowSystem::getInstance()->createCustomMouseCursorInfo (info.image, info.hotspot); + const auto image = info.image.getImage(); + return XWindowSystem::getInstance()->createCustomMouseCursorInfo (image.rescaled ((int) (image.getWidth() / info.image.getScale()), + (int) (image.getHeight() / info.image.getScale())), info.hotspot); } static Cursor makeHandle (MouseCursor::StandardCursorType type) diff --git a/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm b/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm index 07f620c01b..3be7bd36c5 100644 --- a/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm +++ b/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm @@ -111,7 +111,7 @@ private: } static NSCursor* createCursor (const CustomMouseCursorInfo& info) { - return fromNSImage (imageToNSImage (info.image, info.scaleFactor), + return fromNSImage (imageToNSImage (info.image), NSMakePoint (info.hotspot.x, info.hotspot.y)); } @@ -125,7 +125,7 @@ private: { case NormalCursor: case ParentCursor: c = [NSCursor arrowCursor]; break; - case NoCursor: return createCursor ({ Image (Image::ARGB, 8, 8, true), {} }); + case NoCursor: return createCursor ({ ScaledImage (Image (Image::ARGB, 8, 8, true)), {} }); case DraggingHandCursor: c = [NSCursor openHandCursor]; break; case WaitCursor: c = [NSCursor arrowCursor]; break; // avoid this on the mac, let the OS provide the beachball case IBeamCursor: c = [NSCursor IBeamCursor]; break; diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 9167f1c383..6598f1a6dc 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -537,7 +537,7 @@ public: if (! windowRepresentsFile) [window setRepresentedFilename:juceStringToNS (" ")]; // can't just use an empty string for some reason... - [[window standardWindowButton:NSWindowDocumentIconButton] setImage:imageToNSImage (newIcon)]; + [[window standardWindowButton:NSWindowDocumentIconButton] setImage:imageToNSImage (ScaledImage (newIcon))]; } } diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index a49290704c..048fc9f70b 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -5197,14 +5197,15 @@ private: if (iter != cursorsBySize.end()) return iter->second; - const auto imgW = jmax (1, info.image.getWidth()); - const auto imgH = jmax (1, info.image.getHeight()); + const auto img = info.image.getImage(); + const auto imgW = jmax (1, img.getWidth()); + const auto imgH = jmax (1, img.getHeight()); const auto scale = (float) size / (float) unityCursorSize; const auto scaleToUse = scale * jmin (1.0f, jmin ((float) unityCursorSize / (float) imgW, - (float) unityCursorSize / (float) imgH)) / info.scaleFactor; - const auto rescaled = info.image.rescaled (roundToInt (scaleToUse * (float) imgW), - roundToInt (scaleToUse * (float) imgH)); + (float) unityCursorSize / (float) imgH)) / info.image.getScale(); + const auto rescaled = img.rescaled (roundToInt (scaleToUse * (float) imgW), + roundToInt (scaleToUse * (float) imgH)); const auto hx = jlimit (0, rescaled.getWidth(), roundToInt (scaleToUse * (float) info.hotspot.x)); const auto hy = jlimit (0, rescaled.getHeight(), roundToInt (scaleToUse * (float) info.hotspot.y)); @@ -5301,7 +5302,7 @@ private: 16,0,0,2,52,148,47,0,200,185,16,130,90,12,74,139,107,84,123,39,132,117,151,116,132,146,248,60,209,138, 98,22,203,114,34,236,37,52,77,217,247,154,191,119,110,240,193,128,193,95,163,56,60,234,98,135,2,0,59 }; - return makeHandle ({ ImageFileFormat::loadFrom (dragHandData, sizeof (dragHandData)), { 8, 7 } }); + return makeHandle ({ ScaledImage (ImageFileFormat::loadFrom (dragHandData, sizeof (dragHandData))), { 8, 7 } }); } case CopyingCursor: @@ -5312,7 +5313,7 @@ private: 12,108,212,87,235,174, 15,54,214,126,237,226,37,96,59,141,16,37,18,201,142,157,230,204,51,112,252,114,147,74,83, 5,50,68,147,208,217,16,71,149,252,124,5,0,59,0,0 }; - return makeHandle ({ ImageFileFormat::loadFrom (copyCursorData, sizeof (copyCursorData)), { 1, 3 } }); + return makeHandle ({ ScaledImage (ImageFileFormat::loadFrom (copyCursorData, sizeof (copyCursorData))), { 1, 3 } }); } case NumStandardCursorTypes: JUCE_FALLTHROUGH diff --git a/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp b/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp index 93a5fa5705..af34082a57 100644 --- a/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp +++ b/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp @@ -36,7 +36,7 @@ struct StatusItemContainer : public Timer { //============================================================================== StatusItemContainer (SystemTrayIconComponent& iconComp, const Image& im) - : owner (iconComp), statusIcon (imageToNSImage (im)) + : owner (iconComp), statusIcon (imageToNSImage (ScaledImage (im))) { } @@ -51,7 +51,7 @@ struct StatusItemContainer : public Timer void updateIcon (const Image& newImage) { - statusIcon.reset (imageToNSImage (newImage)); + statusIcon.reset (imageToNSImage (ScaledImage (newImage))); setIconSize(); configureIcon(); }