mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-09 18:44:46 +00:00
Fix bug creating buggy macOS cursors with initWithCGImage
I'm not sure why the bug was caused (press mouse button, drag to the edge, drag cursor back to the window, release button), but it looks like using a NSBitmapImageRep and creating the NSImage with that bitmap works properly.
This commit is contained in:
parent
d674aa7330
commit
6721baa40e
@ -1,5 +1,5 @@
|
||||
// SHE library
|
||||
// Copyright (C) 2012-2016 David Capello
|
||||
// Copyright (C) 2012-2017 David Capello
|
||||
//
|
||||
// This file is released under the terms of the MIT license.
|
||||
// Read LICENSE.txt for more information.
|
||||
@ -173,52 +173,53 @@ using namespace she;
|
||||
const int w = scale*surface->width();
|
||||
const int h = scale*surface->height();
|
||||
|
||||
std::vector<uint32_t> buf(4*w*h);
|
||||
uint32_t* bits = &buf[0];
|
||||
|
||||
for (int y=0; y<h; ++y) {
|
||||
const uint32_t* ptr = (const uint32_t*)surface->getData(0, y/scale);
|
||||
for (int x=0, u=0; x<w; ++x, ++bits) {
|
||||
*bits = *ptr;
|
||||
if (++u == scale) {
|
||||
u = 0;
|
||||
++ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@autoreleasepool {
|
||||
CGDataProviderRef dataRef =
|
||||
CGDataProviderCreateWithData(nullptr, &buf[0],
|
||||
w*h*4, nullptr);
|
||||
if (!dataRef)
|
||||
if (4*w*h == 0)
|
||||
return NO;
|
||||
|
||||
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
||||
CGImageRef img =
|
||||
CGImageCreate(
|
||||
w, h, 8, 32, 4*w,
|
||||
colorSpace, kCGImageAlphaLast, dataRef,
|
||||
nullptr, false, kCGRenderingIntentDefault);
|
||||
CGColorSpaceRelease(colorSpace);
|
||||
@autoreleasepool {
|
||||
NSBitmapImageRep* bmp =
|
||||
[[NSBitmapImageRep alloc]
|
||||
initWithBitmapDataPlanes:nil
|
||||
pixelsWide:w
|
||||
pixelsHigh:h
|
||||
bitsPerSample:8
|
||||
samplesPerPixel:4
|
||||
hasAlpha:YES
|
||||
isPlanar:NO
|
||||
colorSpaceName:NSDeviceRGBColorSpace
|
||||
bitmapFormat:NSAlphaNonpremultipliedBitmapFormat
|
||||
bytesPerRow:w*4
|
||||
bitsPerPixel:32];
|
||||
if (!bmp)
|
||||
return NO;
|
||||
|
||||
CGDataProviderRelease(dataRef);
|
||||
uint32_t* dst = (uint32_t*)[bmp bitmapData];
|
||||
for (int y=0; y<h; ++y) {
|
||||
const uint32_t* src = (const uint32_t*)surface->getData(0, y/scale);
|
||||
for (int x=0, u=0; x<w; ++x, ++dst) {
|
||||
*dst = *src;
|
||||
if (++u == scale) {
|
||||
u = 0;
|
||||
++src;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NSCursor* nsCursor = nullptr;
|
||||
if (img) {
|
||||
NSImage* image =
|
||||
[[NSImage alloc] initWithCGImage:img
|
||||
size:NSMakeSize(w, h)];
|
||||
CGImageRelease(img);
|
||||
NSImage* img = [[NSImage alloc] initWithSize:NSMakeSize(w, h)];
|
||||
if (!img)
|
||||
return NO;
|
||||
|
||||
nsCursor =
|
||||
[[NSCursor alloc] initWithImage:image
|
||||
[img addRepresentation:bmp];
|
||||
|
||||
NSCursor* nsCursor =
|
||||
[[NSCursor alloc] initWithImage:img
|
||||
hotSpot:NSMakePoint(scale*focus.x + scale/2,
|
||||
scale*focus.y + scale/2)];
|
||||
}
|
||||
if (nsCursor)
|
||||
if (!nsCursor)
|
||||
return NO;
|
||||
|
||||
[self.contentView setCursor:nsCursor];
|
||||
return (nsCursor ? YES: NO);
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user