Post

Replies

Boosts

Views

Activity

How do I get white NSImages with SF Symbols?
When I get imageWithSystemSymbolName, I get black graphics on a transparent background. How can I get white symbols? When I look at the symbols (like triangle.circle) in SF Symbols, they're all white on transparent. For example, I want to draw triangle.circle.fill on a black screen, so I don't want a black image. I'm doing something like this to get SF Symbols (as NSData to pass them as a byte array into Unity): objc NSData* GetSymbolImageAsBytes(int width, int height) { GCController *gc = [GCController current]; NSString *name = gc.extendedGamepad.buttonY.sfSymbolsName; NSImage *image = [NSImage imageWithSystemSymbolName: name accessibilityDescription: nil ]; // https://stackoverflow.com/a/38442746/79125 NSSize size = NSMakeSize(width, height); NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:size.width pixelsHigh:size.height bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:0 bitsPerPixel:0]; rep.size = size; [NSGraphicsContext saveGraphicsState]; [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:rep]]; [image drawInRect:NSMakeRect(0, 0, size.width, size.height) fromRect:NSZeroRect operation:NSCompositingOperationCopy fraction:1.0]; [NSGraphicsContext restoreGraphicsState]; if (rep == nil) { return nil; } // Passing nil gives a warning but seems to work okay. return [rep representationUsingType:NSBitmapImageFileTypePNG properties:nil]; }
1
0
1.4k
Feb ’21
GCController's sfSymbolsName returns incorrect values when customization is disabled
Summary GCController's sfSymbolsName API returns the customized symbol names after customization is disabled until the app is restarted. It should be returning the uncustomized symbol names (to match the current button inputs). Detailed Repro I've connected a Horipad to my iPad (OS 14.3). When I start the app, it starts printing the correct symbol names: Controller HORIPAD ULTIMATE buttonA: a.circle buttonB: b.circle buttonX: x.circle buttonY: y.circle I turn on customization (Settings General Game Controller Customizations Enable Customizations) and swap two face buttons with shoulders (using the global customization) and the symbol names change as expected: Controller HORIPAD ULTIMATE buttonA: l1.rectangle.roundedbottom buttonB: r1.rectangle.roundedbottom buttonX: x.circle buttonY: y.circle I swap buttonX and buttonY and the symbol names update: Controller HORIPAD ULTIMATE buttonA: l1.rectangle.roundedbottom buttonB: r1.rectangle.roundedbottom buttonX: y.circle buttonY: x.circle I turn off customization and the symbol names fail to update: Controller HORIPAD ULTIMATE buttonA: l1.rectangle.roundedbottom buttonB: r1.rectangle.roundedbottom buttonX: y.circle buttonY: x.circle I'd expect it to go back to the first set of names (a.circle, etc). Launching the app with customization enabled and switching to settings to turn it off also continues to produce the customized sfSymbolsName values instead of the correct uncustomized values. I'm testing from a Unity game (Unity 2019.4.7f1). Here's my minimal repro: cs // Assets/Scripts/GamepadTest.cs using System; using System.Runtime.InteropServices; using UnityEngine; namespace Game { public class GamepadTest : MonoBehaviour { #if UNITY_IOS || UNITY_TVOS [DllImport("__Internal")] private static extern void GCControllerInit(); [DllImport("__Internal")] private static extern void GCControllerUpdate(); void Start() { GCControllerInit(); } void Update() { GCControllerUpdate(); } #endif // UNITY_IOS || UNITY_TVOS } } objc // Assets/Plugins/InputTest/iOS/gccontroller.m #import stdint.h #import Foundation/Foundation.h #import GameController/GameController.h static bool g_initialized = false; static GCController* g_controller; void GCControllerUpdate() { if(g_controller == NULL) { return; } // BUG: First print is correct. First change to button mapping // correctly transitions. Second change to button mapping doesn't // transition. NSLog(@"Controller %@\n", g_controller.vendorName); NSLog(@"buttonA: %@\n", g_controller.extendedGamepad.buttonA.sfSymbolsName); NSLog(@"buttonB: %@\n", g_controller.extendedGamepad.buttonB.sfSymbolsName); NSLog(@"buttonX: %@\n", g_controller.extendedGamepad.buttonX.sfSymbolsName); NSLog(@"buttonY: %@\n", g_controller.extendedGamepad.buttonY.sfSymbolsName); } static void onConnected(GCController* gcController) { NSLog(@"[Gamepad] CONNECTED: %@\n", gcController.vendorName); if(g_controller) { NSLog(@"[Gamepad] Already had connected: %@\n", g_controller.vendorName); } g_controller = gcController; } static void onDisconnected(GCController* gcController) { if(g_controller == gcController) { NSLog(@"[Gamepad] Wasn't connected: %@\n", g_controller.vendorName); return; } g_controller = NULL; NSLog(@"[Gamepad] DISCONNECTED: %@\n", gcController.vendorName); } void GCControllerInit() { if(g_initialized) { NSLog(@"[Gamepad] Warning! Already initialized!\n"); return; } g_controller = NULL; for(GCController *gcController in [GCController controllers]) { onConnected(gcController); } NSNotificationCenter * center = [NSNotificationCenter defaultCenter]; [center addObserverForName: GCControllerDidConnectNotification object: nil queue: nil usingBlock: ^(NSNotification *note) { onConnected(note.object); } ]; [center addObserverForName: GCControllerDidDisconnectNotification object: nil queue: nil usingBlock: ^(NSNotification *note) { onDisconnected(note.object); } ]; g_initialized = true; GCControllerUpdate(); } I tried to make a native app - https://github.com/idbrii/ios-GameControllerTest to demonstrate the problem, but it disconnects when it loses focus so the app restarts and gets valid values. I assume if I figured out how to make it run like a game and stay alive after losing focus it would have the same problem?
0
0
805
Mar ’21
Arabic Yeh not allowed in What's New?
When running iTMSTransporter.cmd -m verify using this text in my version_whats_new section: أﻛﻮاد اﻷﺻﺪﻗﺎء ﻹرﺳﺎل اﻟﺪﻋﻮات إﻟﯽ اﻷﺻﺪﻗﺎء (Translation: Friend codes for sending invites to friends) I get this error: <main> ERROR: ERROR ITMS-4000: "Version '1.3.1', Locale 'ar-SA': What's New in This Version can�t contain the following character(s): ?." at Software/SoftwareMetadata/SoftwareVersion I narrowed it down to U+FBFD: ﯽ Why is that character (ARABIC LETTER FARSI YEH FINAL FORM) not allowed?
1
0
713
Jul ’21