From ab09af3eae900c1d9f4461f7ef52f57a3358d865 Mon Sep 17 00:00:00 2001 From: Marco Antognini Date: Tue, 26 Jan 2016 13:08:45 +0100 Subject: [PATCH] Refactoring NSImage creation from raw pixels (in prevision for custom cursors) --- src/SFML/Window/CMakeLists.txt | 2 + src/SFML/Window/OSX/NSImage+raw.h | 52 +++++++++++++++++ src/SFML/Window/OSX/NSImage+raw.mm | 68 +++++++++++++++++++++++ src/SFML/Window/OSX/SFWindowController.mm | 34 ++---------- 4 files changed, 126 insertions(+), 30 deletions(-) create mode 100644 src/SFML/Window/OSX/NSImage+raw.h create mode 100644 src/SFML/Window/OSX/NSImage+raw.mm diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 31c68ce94..231dee8f1 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -120,6 +120,8 @@ elseif(SFML_OS_MACOSX) ${SRCROOT}/OSX/HIDJoystickManager.cpp ${SRCROOT}/OSX/JoystickImpl.cpp ${SRCROOT}/OSX/JoystickImpl.hpp + ${SRCROOT}/OSX/NSImage+raw.h + ${SRCROOT}/OSX/NSImage+raw.mm ${SRCROOT}/OSX/Scaling.h ${SRCROOT}/OSX/SensorImpl.cpp ${SRCROOT}/OSX/SensorImpl.hpp diff --git a/src/SFML/Window/OSX/NSImage+raw.h b/src/SFML/Window/OSX/NSImage+raw.h new file mode 100644 index 000000000..910c4cbac --- /dev/null +++ b/src/SFML/Window/OSX/NSImage+raw.h @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2015 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + +#import + +//////////////////////////////////////////////////////////// +/// Extends NSImage with a convenience method to load images +/// from raw data. +/// +//////////////////////////////////////////////////////////// + +@interface NSImage (raw) + +//////////////////////////////////////////////////////////// +/// \brief Load an image from raw RGBA pixels +/// +/// \param pixels array of 4 * `size` bytes representing the image +/// \param size size of the image +/// +/// \return an instance of NSImage that needs to be released by the caller +/// +//////////////////////////////////////////////////////////// ++(NSImage*)imageWithRawData:(const sf::Uint8*)pixels andSize:(NSSize)size; + +@end diff --git a/src/SFML/Window/OSX/NSImage+raw.mm b/src/SFML/Window/OSX/NSImage+raw.mm new file mode 100644 index 000000000..cbe03c0db --- /dev/null +++ b/src/SFML/Window/OSX/NSImage+raw.mm @@ -0,0 +1,68 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2015 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#import + +@implementation NSImage (raw) + ++(NSImage*)imageWithRawData:(const sf::Uint8*)pixels andSize:(NSSize)size +{ + // Create an empty image representation. + NSBitmapImageRep* bitmap = + [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:0 // if 0: only allocate memory + pixelsWide:size.width + pixelsHigh:size.height + bitsPerSample:8 // The number of bits used to specify + // one pixel in a single component of the data. + samplesPerPixel:4 // 3 if no alpha, 4 with it + hasAlpha:YES + isPlanar:NO // I don't know what it is but it works + colorSpaceName:NSCalibratedRGBColorSpace + bytesPerRow:0 // 0 == determine automatically + bitsPerPixel:0]; // 0 == determine automatically + + // Load data pixels. + for (unsigned int y = 0; y < size.height; ++y) + { + for (unsigned int x = 0; x < size.width; ++x, pixels += 4) + { + NSUInteger pixel[4] = { pixels[0], pixels[1], pixels[2], pixels[3] }; + [bitmap setPixel:pixel atX:x y:y]; + } + } + + // Create an image from the representation. + NSImage* image = [[NSImage alloc] initWithSize:size]; + [image addRepresentation:bitmap]; + + [bitmap release]; + + return image; +} + +@end diff --git a/src/SFML/Window/OSX/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm index d642543ba..72bd29d42 100644 --- a/src/SFML/Window/OSX/SFWindowController.mm +++ b/src/SFML/Window/OSX/SFWindowController.mm @@ -34,6 +34,7 @@ #include #include +#import #import #import #import @@ -512,40 +513,13 @@ by:(unsigned int)height with:(const sf::Uint8*)pixels { - // Create an empty image representation. - NSBitmapImageRep* bitmap = - [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:0 // if 0: only allocate memory - pixelsWide:width - pixelsHigh:height - bitsPerSample:8 // The number of bits used to specify - // one pixel in a single component of the data. - samplesPerPixel:4 // 3 if no alpha, 4 with it - hasAlpha:YES - isPlanar:NO // I don't know what it is but it works - colorSpaceName:NSCalibratedRGBColorSpace - bytesPerRow:0 // 0 == determine automatically - bitsPerPixel:0]; // 0 == determine automatically + // Load image and set app icon. + NSImage* icon = [NSImage imageWithRawData:pixels + andSize:NSMakeSize(width, height)]; - // Load data pixels. - for (unsigned int y = 0; y < height; ++y) - { - for (unsigned int x = 0; x < width; ++x, pixels+=4) - { - NSUInteger pixel[4] = { pixels[0], pixels[1], pixels[2], pixels[3] }; - [bitmap setPixel:pixel atX:x y:y]; - } - } - - // Create an image from the representation. - NSImage* icon = [[NSImage alloc] initWithSize:NSMakeSize(width, height)]; - [icon addRepresentation:bitmap]; - - // Set app icon. [[SFApplication sharedApplication] setApplicationIconImage:icon]; - // Free up. [icon release]; - [bitmap release]; }