/**************************************************************************/ /* display_server_macos_base.mm */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* https://godotengine.org */ /**************************************************************************/ /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ #import "display_server_macos_base.h" #import "tts_macos.h" #include "core/config/project_settings.h" #include "drivers/png/png_driver_common.h" void DisplayServerMacOSBase::clipboard_set(const String &p_text) { _THREAD_SAFE_METHOD_ NSString *copiedString = [NSString stringWithUTF8String:p_text.utf8().get_data()]; NSArray *copiedStringArray = [NSArray arrayWithObject:copiedString]; NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; [pasteboard clearContents]; [pasteboard writeObjects:copiedStringArray]; } String DisplayServerMacOSBase::clipboard_get() const { _THREAD_SAFE_METHOD_ NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; NSDictionary *options = [NSDictionary dictionary]; BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; if (!ok) { return ""; } NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; NSString *string = [objectsToPaste objectAtIndex:0]; String ret; ret.append_utf8([string UTF8String]); return ret; } Ref DisplayServerMacOSBase::clipboard_get_image() const { Ref image; NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSString *result = [pasteboard availableTypeFromArray:[NSArray arrayWithObjects:NSPasteboardTypeTIFF, NSPasteboardTypePNG, nil]]; if (!result) { return image; } NSData *data = [pasteboard dataForType:result]; if (!data) { return image; } NSBitmapImageRep *bitmap = [NSBitmapImageRep imageRepWithData:data]; NSData *pngData = [bitmap representationUsingType:NSBitmapImageFileTypePNG properties:@{}]; image.instantiate(); PNGDriverCommon::png_to_image((const uint8_t *)pngData.bytes, pngData.length, false, image); return image; } bool DisplayServerMacOSBase::clipboard_has() const { NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; NSDictionary *options = [NSDictionary dictionary]; return [pasteboard canReadObjectForClasses:classArray options:options]; } bool DisplayServerMacOSBase::clipboard_has_image() const { NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSString *result = [pasteboard availableTypeFromArray:[NSArray arrayWithObjects:NSPasteboardTypeTIFF, NSPasteboardTypePNG, nil]]; return result; } void DisplayServerMacOSBase::initialize_tts() const { const_cast(this)->tts = [[TTS_MacOS alloc] init]; } bool DisplayServerMacOSBase::tts_is_speaking() const { if (unlikely(!tts)) { initialize_tts(); } ERR_FAIL_NULL_V(tts, false); return [tts isSpeaking]; } bool DisplayServerMacOSBase::tts_is_paused() const { if (unlikely(!tts)) { initialize_tts(); } ERR_FAIL_NULL_V(tts, false); return [tts isPaused]; } TypedArray DisplayServerMacOSBase::tts_get_voices() const { if (unlikely(!tts)) { initialize_tts(); } ERR_FAIL_NULL_V(tts, TypedArray()); return [tts getVoices]; } void DisplayServerMacOSBase::tts_speak(const String &p_text, const String &p_voice, int p_volume, float p_pitch, float p_rate, int p_utterance_id, bool p_interrupt) { if (unlikely(!tts)) { initialize_tts(); } ERR_FAIL_NULL(tts); [tts speak:p_text voice:p_voice volume:p_volume pitch:p_pitch rate:p_rate utterance_id:p_utterance_id interrupt:p_interrupt]; } void DisplayServerMacOSBase::tts_pause() { if (unlikely(!tts)) { initialize_tts(); } ERR_FAIL_NULL(tts); [tts pauseSpeaking]; } void DisplayServerMacOSBase::tts_resume() { if (unlikely(!tts)) { initialize_tts(); } ERR_FAIL_NULL(tts); [tts resumeSpeaking]; } void DisplayServerMacOSBase::tts_stop() { if (unlikely(!tts)) { initialize_tts(); } ERR_FAIL_NULL(tts); [tts stopSpeaking]; } DisplayServerMacOSBase::DisplayServerMacOSBase() { // Init TTS bool tts_enabled = GLOBAL_GET("audio/general/text_to_speech"); if (tts_enabled) { initialize_tts(); } }